MFC で作成したウィンドウのスタイル変更
更新 : 2007 年 11 月
MFC バージョンの WinMain 関数には、いくつかの標準ウィンドウ クラスが登録されています。通常、MFC の WinMain 関数を編集することはないので、この関数では MFC の既定のウィンドウ スタイルを変更できません。ここでは、既存のアプリケーションで既に登録済みのウィンドウ クラスのスタイルを変更する方法について説明します。
新しい MFC アプリケーションでのスタイル変更
Visual C++ 2.0 以降では、アプリケーションを作成するときに、アプリケーション ウィザードで既定のウィンドウ スタイルを変更できます。アプリケーション ウィザードの [ユーザー インターフェイスの機能] ページで、メイン フレーム ウィンドウおよび MDI 子ウィンドウのスタイルを変更できます。どちらのウィンドウでも、フレームの太さ (太いまたは細い) と以下のオプションを指定できます。
ウィンドウに最小化コントロールまたは最大化コントロールを付けるかどうか。
ウィンドウを最初に表示するときに最小化するか、最大化するか、どちらにもしないか。
メイン フレーム ウィンドウについては、ウィンドウにシステム メニューを付けるかどうかも指定できます。MDI 子ウィンドウの場合は、ウィンドウで分割ペインをサポートするかどうかも指定できます。
既存のアプリケーションのスタイルの変更
既存のアプリケーションでウィンドウ属性を変更する場合は、以下の指示に従ってください。
アプリケーション ウィザードで作成したフレームワーク アプリケーションが使う既定のウィンドウ属性を変更するには、ウィンドウの PreCreateWindow 仮想メンバ関数をオーバーライドします。PreCreateWindow を使うと、通常は CDocTemplate クラスが内部的に管理するプロセスにアプリケーションからアクセスできます。フレーム ワークは、ウィンドウを作成する直前に PreCreateWindow を呼び出します。PreCreateWindow に渡される CREATESTRUCT 構造体を変更することにより、ウィンドウ作成用の属性を変更できます。たとえば、ウィンドウでキャプションを使用しない場合は、次に示すビットごとの演算を使用します。
// cs has been declared as CREATESTRUCT& cs;
cs.style &= ~WS_CAPTION;
CTRLBARS サンプル アプリケーションでは、この方法でウィンドウ属性を変更する例を示しています。アプリケーションの PreCreateWindow の変更に応じて、この関数の基本クラスの実装を呼び出す必要があります。
次に、SDI の場合と MDI の場合について説明します。
SDI の場合
シングル ドキュメント インターフェイス (SDI) アプリケーションの場合、フレームワークでの既定のウィンドウ スタイルは、WS_OVERLAPPEDWINDOW スタイルと FWS_ADDTOTITLE スタイルの組み合わせです。FWS_ADDTOTITLE は MFC 固有のスタイルであり、フレームワークに対して、ウィンドウのキャプションに文書のタイトルを追加するように指示します。SDI アプリケーションのウィンドウ属性を変更するには、CFrameWnd から派生したクラス (アプリケーション ウィザードによる命名は CMainFrame) で PreCreateWindow 関数をオーバーライドします。次に例を示します。
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// Call the base-class version
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// Create a window without min/max buttons or sizable border
cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER;
// Size the window to 1/3 screen size and center it
cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / 3;
cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / 3;
cs.y = ((cs.cy * 3) - cs.cy) / 2;
cs.x = ((cs.cx * 3) - cs.cx) / 2;
return TRUE;
}
このコードでは、最小化ボタン、最大化ボタン、およびサイズ変更境界がないメイン フレーム ウィンドウを作成します。ウィンドウの初期位置は、画面中央です。
MDI の場合
マルチ ドキュメント インターフェイス (MDI) アプリケーションの子ウィンドウのウィンドウ スタイルを変更する場合は、より多くの作業が必要になります。既定では、アプリケーション ウィザードで作成した MDI アプリケーションは、MFC で定義されている既定の CMDIChildWnd クラスを使用します。MDI 子ウィンドウのウィンドウ スタイルを変更するには、CMDIChildWnd から新しいクラスを派生させ、プロジェクト内の CMDIChildWnd へのすべての参照を新しいクラスへの参照に置き換える必要があります。ほとんどの場合、アプリケーション内の CMDIChildWnd への唯一の参照は、アプリケーションの InitInstance メンバ関数にあります。
MDI アプリケーションで使用される既定のウィンドウ スタイルは、WS_CHILD、WS_OVERLAPPEDWINDOW、および FWS_ADDTOTITLE です。MDI アプリケーションの子ウィンドウのウィンドウ属性を変更するには、CMDIChildWnd の派生クラスで PreCreateWindow 関数をオーバーライドします。次に例を示します。
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
このコードでは、最大化ボタンのない MDI 子ウィンドウが作成されます。