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

CFrameWnd

CFrameWndは、一般的なSDI(シングルドキュメントインターフェイス)形式のオーバーラップフレームウィンドウのクラス・・・。

CFrameWnd クラス

MFCの一般的なウィンドウはこれで作ることができる・・・。

今回は、CWinAppベースなアプリケーションクラスCWinApp_の上で、CFrameWndベースなクラスCFrameWnd_オブジェクトを作成し、そのオブジェクトからウィンドウを作成した後、表示する・・・。

まず、CWinApp_.hを追加し、

CWinApp_クラスの定義はこのように書く・・・。
InitInstanceだけでこの辺は前と同じ・・・。

CWinApp_.cppを追加し、メンバ関数InitInstanceを定義する・・・。

後で定義するCFrameWnd_クラスのオブジェクトを作成し、m_pMainWndに格納する・・・。

m_pMainWndは、CWinApp_の基底クラスCWinApp(さらにいうとそのさらに親のCWinThread)にもともとあるメンバで、メインウィンドウのオブジェクトを格納するためのポインタ・・・。
CWnd *なので、アップキャストになる・・・。
CFrameWndはウィンドウ破棄時にオブジェクトの破棄も自動で行ってくれるので、m_pMainWndをdeleteする必要はない・・・。

ShowWindowやUpdateWindowは、WindowsAPIのShowWindowやUpdateWindowに相当するが、引数が少なくなっていたり、無かったりする・・・。
m_nCmdShowは、内部のWinMainに渡されたウィンドウの初期表示状態を格納している・・・。
この部分は実行ファイル(.exe)のプロパティで変更できるので試すといい・・・。

さて、CreateWindowに相当するものはどこだろうか・・・?
実は、CFrameWnd_のほうに記述している・・・。

CFrameWnd_.hにCFrameWnd_のコンストラクタがある・・・。
実はこの中に、CreateWindow相当の処理が記述されている・・・。
(ちなみにDECLARE_MESSAGE_MAPは、CFrameWnd_上でメッセージマップを使えるようにするマクロだが、今回は活用していなので次回以降に説明する・・・。)

CFrameWnd_.cppのCFrameWnd_コンストラクタの定義では、

Createを呼んでいる・・・。これがCFrameWnd_におけるCreateWindow相当のメンバ関数・・・。
オーバーライドしていないので、実際は親のCFrameWndのCreateメンバ関数が実行される・・・。
やはり、APIと比べると引数は少ない・・・。
第1引数のウィンドウクラスをNULLにすると、既定のウィンドウクラスを利用する・・・。
あとは、第2引数にウィンドウ名をつけるだけ・・・。
これだけで最低限のウィンドウができる・・・。

実行すると、

f:id:BG1:20150417150551p:plain

CFrameWnd_クラスのウィンドウが表示された・・・。

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