#author("2024-01-05T23:12:03+00:00","default:iseki","iseki") #author("2024-01-06T11:40:28+00:00","default:iseki","iseki") * MFC ** Devel *** 新規プロジェクト - プロジェクト:MFCアプリケーショ - シングルアプリケーション - Unicode オン - スタイル切り替え オフ - スタティックライブラリ - 複合ドキュメントサポートなし *** Locale - UTF-8 -- setlocale(LC_ALL, ".UTF8"); - システムの Locale -- setSystemLocale(); ***ドキュメントクラス - CXXXDoc::Seialize -- ファイル入出力を記述.このかなからUpdateAllViews(NULL)でViewを呼ぶ - CXXXDoc::UpdateAllViews() -- Viewを更新し,CXXXView::OnDraw()に制御を移す. *** ビュークラス - CScrollView, CEditView, CGtmlView - Viewクラスからは GetDocument()関数でDocumentクラスを得る. CXXXDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); m_pImage = new CImage(); m_pImage->Load(pDoc->GetFileName()); - void CXXXView::OnDraw(CDC* pDC) MFCでは OnPaint()は使用してはいけない. *** メインフレームクラス *** アプリケーションクラス - CXXXApp::InitInstance() -- クラスが生成されるとまずこの関数が呼ばれる - CXXXApp:OnFileOpen() ファイルのオープン処理 -- DoPromptFileName() ダイアログ -- OpenDocumentFile(newName) が呼ばれる - CXXXApp::OpenDocumentFile() -- Doc, Viewクラスを生成し,CXXXDoc::Serialize() を呼ぶ ****「ファイル」→「開く」 // 通常の場合 CXXXApp::OnFileOpen() → OpenDocumentFile(newName) ファイルのオープン CXXXDoc::Serialize() [→ UpdateAllViews(NULL)] ファイルの入出力 ChildFrame CXXXView::OnDraw() 表示 *** MDIの作られる順序 - CDocument -> CChildFrame -> CView *** MDIの破棄されるれる順序 - CView -> CChildFrame -> CDocument - CView -> CDocument -> CChildFrame 状況によって順番が変わる?! *** DirectX9用ライブラリ - winmm.lib d3d9.lib d3dx9.lib dxerr9.lib dxguid.lib - DirectX Input -- dinput8.lib *** イベント処理の追加 - クラスビュー → クラスを右クリック → プロパティ → メッセージボタン *** アプリケーションクラス - アプリケーション用のドキュメントテンプレートを登録 CreateDocFrmView() <pre> // Doc, Viewクラスの初期化 rslt = initialDocView(pdoc, pviw, fname); doc->OnNewDocument() or doc->OnOpenDocument(fname) view->OnInitialUpdate() // Viewクラスの表示 view->ShowWindow(m_nCmdShow); 必要ならタイマースタート or 書き換え用 OnDraw()が随時呼ばれる </pre> *** BMP - Gimp を使用してアイコンを作成する場合は,「互換性のオプション」から,「色空間の情報を書き込まない」をチェックする. ** 俺流 MFC(MDI)プログラミング手順 **** リソースのメニューを作る.(ID) - 「リソースビュウ」の「Menu」からメニュー用のCXXXAppのメッセージハンドラを登録. ****「表示」→「クラスウィザード」または,「リソースビュウ」の「Menu」の右マウス - ボタンで「クラスウィザード」を選び,CXXXAppにメッセージ処理用関数を登録する. -- (例:ON_COMMAND(ID_FILE_WIZ3D, OnFileWiz3d)) - 処理関数のあるファイル内では Resource.h をインクルード **** 新しいウィンドウを作る場合は,CXXXAppでテンプレート用変数を用意. **** 新しいクラスの作成 - ワークスペースの「クラス表示」から「クラスの新規作成」を選び,ドキュメントクラスと - ビュウクラスを生成(基本クラスを指定する) - 基本クラスは CDocument, CView などを選ぶ. -- または「クラスウィザード」を選び,「クラスの追加」→「新規」で新しいクラスを作る. **** クラスを ExClass からの派生に変更 **** CXXXAppのテンプレート定義とメッセージハンドラの関数(例:OnFileWiz3d())の内容を書く. **** ドキュメントクラスとビュークラスの内容を書く **** ドキュメントクラスに仮想関数 OnOpenDocument() または OnNewDocument() を書く - OnOpenDocument() はクラスウィザードで作成 <pre> CExDocument // データを既に持っている場合.hasViewData==TRUE doc.OnNewDocument() : MakeViewData(); // ファイルをオープンしてデータを読み込む. doc.OnOpenDocument() : ReadDataFile() → MakeViewData() ExMSGraph<Word> msGraph; // 読み込みデータ(既にもっているデータ).ReadDataFile() で作る. ExCmnHead cmnHead; // 表示用の View に渡すデータ.MakeviewData() で作る. </pre> **** ビュークラスに仮想関数 OnInitialUpdate() を書く. - OnInitialUpdate() はクラスウィザードで作成 **** 処理の流れ <pre> ID_FILE_WIZ3D → OnFileWiz3d() → CreateDocFrmView() → initialDocView() → doc.OnNewDocument() or doc.OnOpenDocument() → view.OnInitialUpdate() → frame.ShowWindow() → view.OnDraw() → frame.SetFocus() → タイマー作動 → CreateDocFrmViewError() → ループバック </pre> #br