• 検索結果がありません。

C 資料 電脳梁山泊烏賊塾 MFC アプリケーション MFC アプリケーションの作成 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで MFC を選択し MFC(Micorosft Foundation Class) アプリケーションを作成する イ

N/A
N/A
Protected

Academic year: 2021

シェア "C 資料 電脳梁山泊烏賊塾 MFC アプリケーション MFC アプリケーションの作成 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで MFC を選択し MFC(Micorosft Foundation Class) アプリケーションを作成する イ"

Copied!
12
0
0

読み込み中.... (全文を見る)

全文

(1)

■ MFC アプリケーションの作成 ■ ■ 初めに

此処では、Visual Studio 2017 を起動し、新しいプロジェクトで、MFC を選択し、MFC(Micorosft Foundation Class)アプリケーションを作成する。 ■ インストール時の注意 インストール時に、「ワークロード」で「C++によるデスクトップ開発」を選択した丈では、MFC アプ リケーションの開発を行う事が出来ない。右欄の「概要」で「x86 用と x64 用の Visual C++ MFC」に チェックを付ける必要が有る。亦、「個別のコンポーネント」で「x86 用と x64 用の Visual C++ MFC」 にチェックが入って居る事を確認する。 亦、CLR アプリケーションを開発する場合は、「概要」で「x86 用と x64 用の Visual C++ ATL」と「個 別のコンポーネント」で「C++/CLI サポート」にもチェックを入れて置く。 猶、此等は、「新しいプロジェクト」ダイアログで「Visual Studio インストーラを開く」から、何時で も追加する事が出来る。 ※ .NET Framework 登場に依り、現在では MFC を使っての新規開発は無いと思われるが、古いアプ リケーションの流用や保守の為に、一通りの使用法は憶えて置いた方が良いと思われる。

M

MF

FC

C

アプ

プリ

リケ

ケー

ーシ

ショ

ョン

(2)

■ シングルドキュメントの作成 ■ 新しいプロジェクトで MFC アプリケーションを選択すると、アプリケーションの種類のオプションの ダイアログが開くので、アプリケーションの種類にシングルドキュメントを選択して、次へボタンをク リックする(此処で完了ボタンをクリックしても構わないが、不要なフレームペインを取り除く為、次 へボタンをクリックしてウィザードを続ける)。 次のドキュメントテンプレートプロパティやユーザーインターフェース機能のダイアログでは何もせ ずに、次へをクリックする。 次の高度な機能オプションのダイアログの高度なフレームペインのチェックを総て外して、完了をクリ ックする。 ※ アップデートの種類に依り、ダイアログの出現順序が異なる場合が有る。 アプリケーションの種類 解説 シングルドキュメント メニューバー、ツールバー、ステータスバーを含む単一ウィンド ウのアプリケーション 複数のドキュメント メニューバー、ツールバー、ステータスバーを含むフレームウィ ンドウに複数の子ウィンドウを表示するのアプリケーション ダイアログベース 1個のダイアログを持つアプリケーション 複数のトップレベルドキュメント Visual Studio 風のアプリケーション

(3)

プロジェクトが作成されると、ソリューションエクスプローラに下図の様なツリーが表示される。 上図のファイルを観ると解る様に、プロジェクト名に Doc の付加されたファイルと View の付加された ファイルが存在する。此の様に、ドキュメント(データ)と画面(ビュー)を分けてアプリケーション を構築する方法を DOC/VIEW モデルと謂い、現在では一般的な手法で有る。 MFC ではドキュメントの基本クラスとして CDocument、ビューの基本クラスとして CView と謂うク ラスが用意されて居て、此等のクラスからアプリケーション独自のドキュメントとビュークラスを派生 させてプログラムを構築する。 猶、リソースビューに切り替えると、アイコン等の色々なリソースを観る事が出来る。 ※ ソリューションエクスプローラのペインにリソースビューのタブが表示されて居ない場合は、メニ ューの「表示」から「その他のウィンドウ」をポイントし「リソースビュー」をクリックすると表 示される様に成る。

(4)

実行(デバッグの開始 F5)すれば、下図の様な画面が表示される(高度なフレームペインのチェック を総て外して居ない場合は、更に色々なペインが装備されて居るので確認して欲しい)。 此処では、線画データを読み込んで図形を描画するプログラムを作成する事にする。ファイルを開くダ イアログで線画データを読み込むと、データに従って図形を画面に描画する物とする(図形は一筆書き で可能な物而巳)。 ■ ドキュメント ドキュメントクラスのヘッダーファイル(プロジェクト名 Doc.h)の属性の処に図形情報を、操作の処 に図形の各点を取得するメソッドを追加する(赤字の部分)。 // MFCApplicationSDIDoc.h : CMFCApplicationSDIDoc クラスのインターフェイス // #pragma once

class CMFCApplicationSDIDoc : public CDocument { protected: // シリアル化からのみ作成します。 CMFCApplicationSDIDoc(); DECLARE_DYNCREATE(CMFCApplicationSDIDoc) // 属性 public: INT m_nPoints; // 点の数 CSize m_sizeDoc; // 最大サイズ INT m_getptr; // 次の点(番号) CPoint m_points[1024]; // 図形の点 // 操作

(5)

public:

CPoint* GetNext(); // 次の点を得る。 CPoint* GetFirst(); // 最初の点を得る。

// オーバーライド public:

virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); #ifdef SHARED_HANDLERS

virtual void InitializeSearchContent();

virtual void OnDrawThumbnail(CDC& dcI LPRECT lprcBounds); #endif // SHARED_HANDLERS

// 実装 public:

virtual ~CMFCApplicationSDIDoc(); #ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成された、メッセージ割り当て関数 protected: DECLARE_MESSAGE_MAP() #ifdef SHARED_HANDLERS // 検索ハンドラーの検索コンテンツを設定するヘルパー関数 void SetSearchContent(const CString& value);

#endif // SHARED_HANDLERS }; ドキュメントクラスの実装(プロジェクト名 Doc.cpp)に下記のコードを追加する(赤字の部分)。 // MFCApplicationSDIDoc.cpp : CMFCApplicationSDIDoc クラスの実装 // #include "stdafx.h" // SHARED_HANDLERS は、プレビュー、縮小版、および検索フィルター ハンドラーを実装… // そのプロジェクトとのドキュメント コードの共有を可能にします。 #ifndef SHARED_HANDLERS #include "MFCApplicationSDI.h" #endif #include "MFCApplicationSDIDoc.h" #include <propkey.h> #ifdef _DEBUG

#define new DEBUG_NEW #endif

(6)

IMPLEMENT_DYNCREATE(CMFCApplicationSDIDocI CDocument) BEGIN_MESSAGE_MAP(CMFCApplicationSDIDocI CDocument) END_MESSAGE_MAP() // CMFCApplicationSDIDoc コンストラクション/デストラクション CMFCApplicationSDIDoc::CMFCApplicationSDIDoc() { // TODO: この位置に 1 度だけ呼ばれる構築用のコードを追加してください。 } CMFCApplicationSDIDoc::~CMFCApplicationSDIDoc() { } BOOL CMFCApplicationSDIDoc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE; // TODO: この位置に再初期化処理を追加してください。 // (SDI ドキュメントはこのドキュメントを再利用します。 m_nPoints = 0; m_sizeDoc = CSize(800I 600); // テストデータを作成するときは、下のコメントを外して描画を行いファイル保存する。 /* m_points[0] = CSize(100I 100); m_points[1] = CSize(100I 300); m_points[2] = CSize(300I 300); m_points[3] = CSize(300I 100); m_points[4] = CSize(100I 100); m_nPoints = 5; */ return TRUE; } // CMFCApplicationSDIDoc のシリアル化

void CMFCApplicationSDIDoc::Serialize(CArchive& ar) { int i; if (ar.IsStoring()) { // TODO: 格納するコードをここに追加してください。 ar << m_nPoints;

for (i = 0; i < m_nPoints; i++) {

ar << m_points[i]; }

(7)

} else {

// TODO: 読み込むコードをここに追加してください。

ar >> m_nPoints;

for (i = 0; i < m_nPoints; i++) { ar >> m_points[i]; } } } // 最初の描画点を得る。 CPoint* CMFCApplicationSDIDoc::GetFirst() { if (m_nPoints == 0) return NULL; m_getptr = 0; return &m_points[0]; } // 次の描画点を得る。 CPoint* CMFCApplicationSDIDoc::GetNext() { m_getptr++; if (m_getptr >= m_nPoints) return NULL; return &m_points[m_getptr]; } #ifdef SHARED_HANDLERS //縮小版のサポート

void CMFCApplicationSDIDoc::OnDrawThumbnail(CDC& dcI LPRECT lprcBounds) {

// このコードを変更してドキュメントのデータを描画します dc.FillSolidRect(lprcBoundsI RGB(255I 255I 255));

CString strText = _T("TODO: implement thumbnail drawing here"); LOGFONT lf;

CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT)); pDefaultGUIFont->GetLogFont(&lf); lf.lfHeight = 36; CFont fontDraw; fontDraw.CreateFontIndirect(&lf);

CFont* pOldFont = dc.SelectObject(&fontDraw);

dc.DrawText(strTextI lprcBoundsI DT_CENTER | DT_WORDBREAK); dc.SelectObject(pOldFont);

}

CMFCApplicationSDIDoc:: の部分は C プロジェクト名 Doc:: と成る。

(8)

// 検索ハンドラーのサポート void CMFCApplicationSDIDoc::InitializeSearchContent() { CString strSearchContent; // ドキュメントのデータから検索コンテンツを設定します。 // コンテンツの各部分は ";" で区切る必要があります

// 例: strSearchContent = _T("point;rectangle;circle;ole object;"); SetSearchContent(strSearchContent);

}

void CMFCApplicationSDIDoc::SetSearchContent(const CString& value) { if (value.IsEmpty()) { RemoveChunk(PKEY_Search_Contents.fmtidI PKEY_Search_Contents.pid); } else {

CMFCFilterChunkValueImpl *pChunk = nullptr; ATLTRY(pChunk = new CMFCFilterChunkValueImpl); if (pChunk != nullptr)

{

pChunk->SetTextValue(PKEY_Search_ContentsI valueI CHUNK_TEXT); SetChunkValue(pChunk); } } } #endif // SHARED_HANDLERS // CMFCApplicationSDIDoc の診断 #ifdef _DEBUG

void CMFCApplicationSDIDoc::AssertValid() const {

CDocument::AssertValid(); }

void CMFCApplicationSDIDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } #endif //_DEBUG // CMFCApplicationSDIDoc コマンド ■ ビュー ビュークラスのヘッダーファイル(プロジェクト名 View.h)は変更せずに其の儘使用する。 // MFCApplicationSDIView.h : CMFCApplicationSDIView クラスのインターフェイス //

(9)

#pragma once

class CMFCApplicationSDIView : public CView { protected: // シリアル化からのみ作成します。 CMFCApplicationSDIView(); DECLARE_DYNCREATE(CMFCApplicationSDIView) // 属性 public:

CMFCApplicationSDIDoc* GetDocument() const; // 操作

public:

// オーバーライド public:

virtual void OnDraw(CDC* pDC); // このビューを描画するためにオーバーライドされます。 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDCI CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDCI CPrintInfo* pInfo); // 実装

public:

virtual ~CMFCApplicationSDIView(); #ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const; #endif

protected:

// 生成された、メッセージ割り当て関数 protected:

afx_msg void OnFilePrintPreview();

afx_msg void OnRButtonUp(UINT nFlagsI CPoint point); afx_msg void OnContextMenu(CWnd* pWndI CPoint point); DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // MFCApplicationSDIView.cpp のデバッグ バージョン

inline CMFCApplicationSDIDoc* CMFCApplicationSDIView::GetDocument() const { return reinterpret_cast<CMFCApplicationSDIDoc*>(m_pDocument); } #endif ビュークラスの実装(プロジェクト名 View.cpp)に下記のコードを追加する(赤字の部分)。 // MFCApplicationSDIView.cpp : CMFCApplicationSDIView クラスの実装 // #include "stdafx.h" // SHARED_HANDLERS は、プレビュー、縮小版、および検索フィルター ハンドラーを実装…

(10)

// そのプロジェクトとのドキュメント コードの共有を可能にします。 #ifndef SHARED_HANDLERS #include "MFCApplicationSDI.h" #endif #include "MFCApplicationSDIDoc.h" #include "MFCApplicationSDIView.h" #ifdef _DEBUG

#define new DEBUG_NEW #endif // CMFCApplicationSDIView IMPLEMENT_DYNCREATE(CMFCApplicationSDIViewI CView) BEGIN_MESSAGE_MAP(CMFCApplicationSDIViewI CView) // 標準印刷コマンド ON_COMMAND(ID_FILE_PRINTI &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECTI &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEWI &CMFCApplicationSDIView::OnFilePrintPreview) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP() END_MESSAGE_MAP() // CMFCApplicationSDIView コンストラクション/デストラクション CMFCApplicationSDIView::CMFCApplicationSDIView() { // TODO: 構築コードをここに追加します。 } CMFCApplicationSDIView::~CMFCApplicationSDIView() { } BOOL CMFCApplicationSDIView::PreCreateWindow(CREATESTRUCT& cs) {

// TODO: この位置で CREATESTRUCT cs を修正して Window クラスまたはスタイルを // 修正してください。 return CView::PreCreateWindow(cs); } // CMFCApplicationSDIView 描画 void CMFCApplicationSDIView::OnDraw(CDC* pDC) {

CMFCApplicationSDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

if (!pDoc) return;

(11)

// TODO: この場所にネイティブ データ用の描画コードを追加します。 CPoint* p1; CPoint* p0 = pDoc->GetFirst(); if (p0 == NULL) return; pDC->MoveTo(*p0); while (true) { p1 = pDoc->GetNext(); if (p1 == NULL) return; pDC->LineTo(*p1); p0 = p1; pDC->MoveTo(*p0); } } // CMFCApplicationSDIView の印刷 void CMFCApplicationSDIView::OnFilePrintPreview() { #ifndef SHARED_HANDLERS AFXPrintPreview(this); #endif }

BOOL CMFCApplicationSDIView::OnPreparePrinting(CPrintInfo* pInfo) {

// 既定の印刷準備

return DoPreparePrinting(pInfo); }

void CMFCApplicationSDIView::OnBeginPrinting(CDC* /*pDC*/I CPrintInfo* /*pInfo*/) {

// TODO: 印刷前の特別な初期化処理を追加してください。 }

void CMFCApplicationSDIView::OnEndPrinting(CDC* /*pDC*/I CPrintInfo* /*pInfo*/) {

// TODO: 印刷後の後処理を追加してください。 }

void CMFCApplicationSDIView::OnRButtonUp(UINT /* nFlags */I CPoint point) {

ClientToScreen(&point); OnContextMenu(thisI point); }

void CMFCApplicationSDIView::OnContextMenu(CWnd* /* pWnd */I CPoint point) {

(12)

#ifndef SHARED_HANDLERS

theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDITI point.xI point.yI thisI TRUE);

#endif }

// CMFCApplicationSDIView の診断 #ifdef _DEBUG

void CMFCApplicationSDIView::AssertValid() const {

CView::AssertValid(); }

void CMFCApplicationSDIView::Dump(CDumpContext& dc) const {

CView::Dump(dc); }

CMFCApplicationSDIDoc* CMFCApplicationSDIView::GetDocument() const // デバッグ以外のバージョンはインラインです。 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplicationSDIDoc))); return (CMFCApplicationSDIDoc*)m_pDocument; } #endif //_DEBUG // CMFCApplicationSDIView メッセージ ハンドラー 因みに、此処で描画用に使用したデータは、バイナリファイルで、下図の様なデータが格納されて居る。 0x05:5、0x64:100、0x12C:300

参照

関連したドキュメント

タップします。 6通知設定が「ON」になっ ているのを確認して「た めしに実行する」ボタン をタップします。.

【オランダ税関】 EU による ACXIS プロジェクト( AI を活用して、 X 線検査において自動で貨物内を検知するためのプロジェク

ダウンロードしたファイルを 解凍して自動作成ツール (StartPro2018.exe) を起動します。.

従来から iOS(iPhone など)はアプリケーションでの電話 API(Application Program

太宰治は誰でも楽しめることを保証すると同時に、自分の文学の追求を放棄していませ

手動のレバーを押して津波がどのようにして起きるかを観察 することができます。シミュレーターの前には、 「地図で見る日本

燃料取り出しを安全・着実に進めるための準備・作業に取り組んでいます。 【燃料取り出しに向けての主な作業】

プロジェクト初年度となる平成 17 年には、排気量 7.7L の新短期規制対応のベースエンジ ンにおいて、後処理装置を装着しない場合に、 JIS 2 号軽油及び