次の方法で共有


MFC によって作成されたウィンドウのスタイルの変更

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_CHILDWS_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 子ウィンドウが作成されます。

詳しく知りたいこと

こちらも参照ください

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