MFC で作成したウィンドウのスタイル変更

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_CHILDWS_OVERLAPPEDWINDOWFWS_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 子ウィンドウを作成しています。

さらに詳しい情報

関連項目

フレーム ウィンドウスタイル