建議使用 Visual Studio 2017

變更 MFC 所建立之視窗的樣式

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

在其 WinMain 函式的版本, MFC 註冊多個標準視窗類別。 由於您通常無法編輯 MFC 的 WinMain,該函式不讓您有機會變更 MFC 預設視窗樣式。 本文說明如何變更這類 preregistered 視窗的類別樣式在現有應用程式的。

當您建置應用程式時,如果您使用 Visual C++ 2.0 (含) 以後版本,您可以變更應用程式精靈的預設視窗樣式。 在應用程式精靈的使用者介面功能頁面,您可以變更您的主框架視窗與 MDI 子視窗的樣式。 對於任一個視窗類型,您可以指定應用程式的架構粗細 (粗或變更記事本) 和下列任何一項:

  • 視窗是否具有最小化或最大化控制。

  • 視窗是否已最大化最初最小化,或兩者皆不是。

如需主框架視窗,您也可以指定視窗是否具有系統功能表。 對於 MDI 子視窗,您可以指定視窗是否支援分割窗格。

如果您變更現有的應用程式視窗的屬性,請遵循中的指示本文。

若要變更架構應用程式使用的預設視窗屬性以應用程式精靈,可覆寫視窗 PreCreateWindow 的虛擬成員函式。 PreCreateWindow 可讓應用程式存取建立處理序由 CDocTemplate 類別內部通常處置。 架構會在建立視窗之前呼叫 PreCreateWindow 。 藉由修改 CREATESTRUCT 結構會傳遞至 PreCreateWindow,您的應用程式可以變更此屬性可用來建立視窗。 例如,為了確保視窗不使用標題,請使用下列位元運算:

   // cs has been declared as CREATESTRUCT& cs;
   cs.style &= ~WS_CAPTION;

CTRLBARS 應用程式會示範變更視窗屬性的技術。 根據您的應用程式在 PreCreateWindow變更時,呼叫函式的基底類別實作可能是必要的。

下列討論涵蓋 SDI 案例和 MDI 案例

在單一文件介面 (SDI) (SDI) 應用程式,在這個框架的預設視窗樣式是 WS_OVERLAPPEDWINDOWFWS_ADDTOTITLE 樣式的組合。 FWS_ADDTOTITLE 是指示架構將文件標題到視窗標題的一個 MFC 的模式。 若要變更在 SDI 應用程式視窗的屬性,覆寫在應用程式精靈命名 CMainFrame) 的 CFrameWnd 衍生的類別中 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 應用程式以應用程式精靈在 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 子視窗,而不用最大化按鈕。

您還想知道關於哪些方面的詳細資訊?

框架視窗樣式

顯示: