WinMain
関数のバージョンでは、MFC によっていくつかの標準ウィンドウ クラスが登録されます。 通常は MFC の WinMain
を編集しないため、この関数を使用すると、MFC の既定のウィンドウ スタイルを変更することはできません。 この記事では、既存のアプリケーションでこのような事前登録されたウィンドウ クラスのスタイルを変更する方法について説明します。
新しい MFC アプリケーションでのスタイルの変更
Visual C++ 2.0 以降を使用している場合は、アプリケーションの作成時にアプリケーション ウィザードで既定のウィンドウ スタイルを変更できます。 アプリケーション ウィザードの [ユーザー インターフェイス機能] ページでは、メイン フレーム ウィンドウと MDI 子ウィンドウのスタイルを変更できます。 ウィンドウの種類に応じて、フレームの太さ (太いまたは薄い) と次のいずれかを指定できます。
ウィンドウに最小化コントロールまたは最大化コントロールがあるかどうか。
ウィンドウが最初に最小化、最大化、またはそのいずれでもない状態で表示されるかどうか。
メイン フレーム ウィンドウの場合は、ウィンドウにシステム メニューがあるかどうかを指定することもできます。 MDI 子ウィンドウでは、ウィンドウが分割ウィンドウをサポートするかどうかを指定できます。
既存のアプリケーションでのスタイルの変更
既存のアプリケーションでウィンドウ属性を変更する場合は、代わりにこの記事の残りの部分の手順に従ってください。
アプリケーション ウィザードで作成されたフレームワーク アプリケーションで使用される既定のウィンドウ属性を変更するには、ウィンドウの PreCreateWindow 仮想メンバー関数をオーバーライドします。 PreCreateWindow
を使用すると、アプリケーションは CDocTemplate クラスによって内部的に通常管理される作成プロセスにアクセスできます。 フレームワークは、ウィンドウを作成する直前に PreCreateWindow
を呼び出します。 に渡される PreCreateWindow
構造体を変更することで、アプリケーションはウィンドウの作成に使用される属性を変更できます。 たとえば、ウィンドウでキャプションが使用されないようにするには、次のビット演算を使用します。
// 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 アプリケーションのウィンドウ属性を変更するには、PreCreateWindow
から派生したクラスのCFrameWnd
関数をオーバーライドします (アプリケーション ウィザードの名前CMainFrame
)。 例えば次が挙げられます。
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
関数をオーバーライドします。 例えば次が挙げられます。
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
このコードでは、[最大化] ボタンのない MDI 子ウィンドウが作成されます。