【MFC アプリケーションの初期化処理についての解説その2。】

ここでは、CMainFrame の PreCreateWindow 関数について、解説を行う事にする。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
RECT rect;
CWnd *wnd;
wnd = this->GetDesktopWindow();
if (wnd){
wnd->GetWindowRect(&rect);
cs.x = (rect.right - rect.left)/2 - 320;
cs.y = (rect.bottom - rect.top)/2 - 240;
cs.cx= 640;
cs.cy= 480;
cs.dwExStyle=WS_EX_OVERLAPPEDWINDOW;
cs.style= WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
}else
return FALSE;
return TRUE;
}

上記リストの冒頭部分つまり、下のリストの部分は、基底クラスである、CFrameWnd クラスの PreCreateWindow を呼んでいる。

if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;

中で何をしているかは知らない。
おまじないだと思っておく。


続いて次の部分を見てみよう。
wnd = this->GetDesktopWindow();
if (wnd){
wnd->GetWindowRect(&rect);
cs.x = (rect.right - rect.left)/2 - 320;
cs.y = (rect.bottom - rect.top)/2 - 240;
cs.cx= 640;
cs.cy= 480;
cs.dwExStyle=WS_EX_OVERLAPPEDWINDOW;
cs.style= WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX;

Windows では、画面全体を覆う、DesktopWindow という概念がある
(Macintosh もまったく同じだが・・・・・・)

この DesktopWindow のサイズを測定する事で、画面のサイズを測定している。

GetDesktopWindow(); が DesktopWindow の取得で、
GetWindowRect(RECT *rect); がウインドウサイズの測定である。

つまり、DesktopWindow へのポインタを取得し、
そのポインタを使ってウィンドウのサイズを取得している訳である。

取得したウインドウのサイズを、
CREATESTRUCT という構造体に代入。
それから、ウィンドウのスタイルを指定。
あとはMFCにおまかせだ。