AppWizard生成的應用程序框架的主窗口具有缺省的窗口風格,比如在窗口標題條中自動添加文檔名、窗口是疊加型的、可改變窗口大小等。要修改窗口的缺省風格,需要重載CWnd::PreCreateWindow(CREATESTRUCT& cs)函數,並在其中修改CREATESTRUCT型參數cs。
CWnd::PreCreateWindow 函數先於窗口創建函數執行。如果該函數被重載,則窗口創建函數將使用CWnd::PreCreateWindow 函數返回的CREATESTRUCT cs參數所定義的窗口風格來創建窗口;否則使用預定義的窗口風格。
CREATESTRUCT結構定義了創建函數創建窗口所用的初始參數,其定義如下:
- typedef struct tagCREATESTRUCT {
- LPVOID lpCreateParams; // 創建窗口的基本參數
- HANDLE hInstance; // 擁有將創建的窗口的模塊實例句柄
- HMENU hMenu; // 新窗口的菜單句柄
- HWND hwndParent; // 新窗口的父窗口句柄
- int cy; // 新窗口的高度
- int cx; // 新窗口的寬度
- int y; // 新窗口的左上角Y坐標
- int x; // 新窗口的左上角X坐標
- LONG style; // 新窗口的風格
- LPCSTR lpszName; // 新窗口的名稱
- LPCSTR lpszClass; // 新窗口的窗口類名
- DWORD dwExStyle; // 新窗口的擴展參數
- } CREATESTRUCT;
CREATESTRUCT結構的style域定義了窗口的風格。比如,缺省的MDI主窗口的風格中就包括FWS_ADDTOTITLE(在標題條中顯示當前的工作文檔名)、FWS_PREFIXTITLE(把文檔名放在程序標題的前面)、WS_THICKFRAME(窗口具有可縮放的邊框)等風格。由於多種風格參數由邏輯或(“|”)組合在一起的,因此添加某種風格,就只需用“|”把對應的參數加到CREATESTRUCT結構的style域中;刪除已有的風格,則需用“&”連接CREATESTRUCT結構的style域與該風格的邏輯非值。
CREATESTRUCT結構的x、y、cx、cy域分別定義了窗口的初始位置和大小,因此,在CWnd::PreCreateWindow 函數中給它們賦值,將能定義窗口的初始顯示位置和大小。
下例中的代碼將主框窗口的大小將固定為1/4屏幕,標題條中僅顯示窗口名,不顯示文檔名。
- BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- // 修改主窗風格
- cs.style &= ~FWS_ADDTOTITLE; //去除標題條中的文檔名
- cs.style &= ~WS_THICKFRAME; //去除可改變大小的邊框
- cs.style |= WS_DLGFRAME; //增加不能改變大小的邊框
- // 確定主窗的大小和初始位置
- int cxScreen = ::GetSystemMetrics(SM_CXSCREEN);//獲得屏幕寬
- int cyScreen = ::GetSystemMetrics(SM_CYSCREEN); //獲得屏幕高
- cs.x = 0; // 主窗位於左上角
- cs.y = 0;
- cs.cx = cxScreen/2; // 主窗寬為1/2屏幕寬
- cs.cy = cxScreen/2; // 主窗高為1/2屏幕高
- return CMDIFrameWnd::PreCreateWindow(cs);
- }
修改窗口類,實現更改背景顏色
方法一:
- BOOL CMainWindow::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: 在此添加專用代碼和/或調用基類
- if( CFrameWnd::PreCreateWindow(cs))
- {
- //改變窗口類
- WNDCLASS wndclass;
- ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
- //wndclass.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
- //wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
- wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
- wndclass.hbrBackground=m_BKBrush;//m_BKBrush不能為函數局部變量
- wndclass.hbrBackground=*(new CBrush(RGB(25,25,0)));//最方便的方法
- //wndclass.hCursor = AfxGetApp()-> LoadCursor(IDC_CURSOR1);
- wndclass.lpszClassName = _T("newViewClassName ");
- VERIFY(AfxRegisterClass(&wndclass));
- cs.lpszClass=wndclass.lpszClassName;
- return TRUE;
- }
- return FALSE;
- }
方法二:
- BOOL CMFC_單文檔View::PreCreateWindow(CREATESTRUCT& cs)
- {
- WNDCLASS wndclass;
- //1.調用基類的同名函數,以自動生成一個窗口類供修改
- CView::PreCreateWindow(cs);
- //2.得到窗口類
- ::GetClassInfo(AfxGetInstanceHandle(),cs.lpszClass,&wndclass);
- //3.修改窗口類
- wndclass.hbrBackground=CreateSolidBrush(RGB(0,100,100));
- OutputDebugString(wndclass.lpszClassName);
- //4.更新窗口類
- //反注冊MFC自動生成的窗口類(因為新舊窗口類名稱一樣)
- ::UnregisterClass(cs.lpszClass,AfxGetInstanceHandle());
- //注冊修改后的窗口類
- AfxRegisterClass(&wndclass);
- //因為新舊窗口類名稱一樣,不必執行下面這句代碼
- //cs.lpszClass=wndclass.lpszClassName;
- //注意返回TRUE
- return TRUE;
- }
