變更 MFC 所建立之視窗的樣式
在函式的版本 WinMain
中,MFC 會為您註冊數個標準視窗類別。 因為您通常不會編輯 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 應用程式中的視窗屬性,請覆寫 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
之 類別中的 PreCreateWindow 函式。 例如:
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT &cs)
{
// Create a child window without the maximize button
cs.style &= ~WS_MAXIMIZEBOX;
return CMDIChildWnd::PreCreateWindow(cs);
}
此程式碼會建立沒有 [最大化] 按鈕的 MDI 子視窗。