#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 ページ一覧 検索 最終更新   ヘルプ   最終更新のRSS