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

在其版本的WinMain函式,MFC 會註冊為您的數個標準視窗類別。因為您通常不編輯 MFC 的WinMain,該函式讓您沒有機會變更 MFC 預設視窗樣式。本文將告訴您要如何變更這種預先登錄的視窗類別的現有應用程式中的樣式。

變更新的 MFC 應用程式中的樣式

如果您使用 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 應用程式視窗的屬性,請覆寫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 應用程式會使用預設的 CMDIChildWnd 在 MFC 中定義的類別。若要變更 MDI 子視窗的視窗樣式,您都必須衍生一個新的類別,從CMDIChildWnd ,並取代所有參考CMDIChildWnd在您專案中有新的類別的參考。很可能是唯一的參考到CMDIChildWnd在應用程式位於應用程式的InitInstance成員函式。

在 MDI 應用程式中使用的預設視窗樣式 」 是結合的 WS_CHILDWS_OVERLAPPEDWINDOW,以及 FWS_ADDTOTITLE 樣式。若要變更的 MDI 應用程式的子視窗的視窗屬性,請覆寫 PreCreateWindow 函式,在您的類別衍生自CMDIChildWnd。例如:

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
   // Create a child window without the maximize button 
    cs.style &= ~WS_MAXIMIZEBOX; 

   return CMDIChildWnd::PreCreateWindow(cs);
}

這段程式碼會建立 MDI 子視窗沒有最大化] 按鈕。

x07xt611.collapse_all(zh-tw,VS.110).gif您還想知道關於哪些方面的詳細資訊?

請參閱

概念

框架視窗樣式 (C++)