読者です 読者をやめる 読者になる 読者になる

CWnd::OnCreate

MFC Sample

CWnd::OnCreateは、ウィンドウが作成された時(WM_CREATEが来た時)の処理を記述するためのメンバ関数・・・。
このようなウィンドウメッセージに対する処理を書くメンバ関数をメッセージハンドラという・・・。

CWnd::OnCreate

CWndのメンバ関数ではあるが、当然派生クラスのCFrameWndでも使える・・・。
引数には、CreateStruct構造体のポインタが渡される・・・。

今回はWindowsAPIのWM_CREATEでやったCreateStruct構造体の一部を表示するプログラムのMFC版を作る・・・。

CFrameWnd_.hでは、

コンストラクタCFrameWnd_()、メンバ関数OnCreate、そしてDECLARE_MESSAGE_MAP()なるマクロが置かれている・・・。
このマクロがないと、メッセージハンドラが実行されないので、必須である・・・。
(メンバではないので';'を付けないように・・・。)

CFrameWnd_.cppでは、

BEGIN_MESSAGE_MAP()に、メッセージの転送先である派生クラスCFrameWnd_、転送元の基底クラスCFrameWndを指定し、さらに次の行で、ON_WM_CREATE()を指定することで、WM_CREATEのメッセージがCFrameWndからCFrameWnd_に転送され、CFrameWnd_のOnCreateが実行される・・・。
でEND_MESSAGE_MAPでとじると・・・。
他のメッセージも転送したい時は、"ON_WM_XXX"という感じで指定していく・・・。

コンストラクタでは今回はなにもしない・・・。
Createは、CWinApp_::InitInstanceで呼ぶからである・・・。

でOnCreateでは、

ウィンドウハンドルや、ウィンドウ名、座標などをCStringで連結してAfxMessageBoxで表示・・・。

CWinApp_.cppでは、InitInstanceで、

CFrameWnd_オブジェクト生成、Create、ShowWindow、UpdateWindow、と連続で呼んでウィンドウを表示している・・・。
(ここでは全部pFrameWnd_から呼んでいる・・・。)

実行すると、

f:id:BG1:20150421122241p:plain

CreateStruct構造体の一部などが表示・・・。
そのあと、

f:id:BG1:20150421122310p:plain

ウィンドウが表示される・・・。

Sample/CWinApp_.h at master · bg1bgst333/Sample · GitHub
Sample/CWinApp_.cpp at master · bg1bgst333/Sample · GitHub
Sample/CFrameWnd_.h at master · bg1bgst333/Sample · GitHub
Sample/CFrameWnd_.cpp at master · bg1bgst333/Sample · GitHub