(本章節中例子都是用 VS2005 編譯調試的)
窗口與窗口類關系
與窗口類關系 MFC 類窗口類中封裝了一個窗口句柄,窗口銷毀時候,與之對應的MFC類窗口對象看其生命是否結束,但是MFC類窗口類對象銷毀時候,與之對應的窗口一定會被銷毀
修改程序外觀
- 修改應用程序窗口圖標,標題欄在框架類中實現
- 修改應用程序背景與光標(因為視覺類窗口始終覆蓋在框架類上) 在視類中實現
設置窗口類屬性
在窗體生成前且窗口類注冊前
在CMainFrame的PreCreateWindow函數中進行:
- 第一種 修改函數中傳遞的CREATESTRUT結構的對象cs,修改cs中的對應屬性,便可以達到修改窗體類的對應屬性(CREATESTRUT結構類似於Win32編制中的WNDCLASS結構)
- 第二種 自身定義一個 WNDCLASS 結構成員變量,並注冊此窗體結構變量,(用RegisterClass函數注冊窗體類),后 cs.lpszClass = "窗體類名"
- 第三種 MFC提供了一個全局函數,用來設定窗口的類型,光標,背景和圖標 AfxRegisterWndClass 函數,然后 cs.lpszClass = AfxRegisterWndClass();
代碼示例(用VS2005調試):
首先先看看未被改變的時,工程生成的單文檔示例的運行結果:
第一種:(使初始化程序無菜單欄)
在CMainFrame的PreCreateWindow函數中添加下添加:
cs.hMenu = NULL;
運行結果:
第二種:(使初始化程序無菜單欄)
在CMainFrame的PreCreateWindow函數中添加下添加:
WNDCLASS wndclass; WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); wndcls.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); wndcls.hInstance=AfxGetInstanceHandle(); wndcls.lpfnWndProc=::DefWindowProc; wndcls.lpszClassName=L"test"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&wndcls); cs.lpszClass=L"test";
運行結果同上
第三種:(修改程序圖標)
首先為工程添加一個圖標資源(資源 ID 為 IDI_ICON1),資源視圖如下:
然后在CMainFrame的PreCreateWindow函數中添加下添加:(AfxRegisterWndClass)
cs.lpszClass=AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));
運行結果:
在窗體顯示前且窗體類注冊后
說明
在類中的 OnCreate 函數實現,用SetClassLong函數設置窗體類的屬性
代碼示例(用VS2005調試):
首先先看看未被改變的時,工程生成的單文檔示例的運行結果:
接着需要修改窗口圖標,先為工程添加一個圖標資源(資源 ID 為 IDI_ICON1),資源視圖如下:
然后在 CMainFrame 的 OnCreate 函數中添加下添加:(SetWindowLong)
SetClassLong(m_hWnd,GCL_HICON,(LONG)AfxGetApp()->LoadIcon(IDI_ICON1));
運行結果:
在窗體生成后
- 用 SetWindowLong 函數實現
- 用 GetWindowLong 函數獲得當前窗體屬性
- 在 MFC 中還提供 ModifyStyleEx 修改窗口的擴展屬性(你可以在 OnCreate 函數中調用它去掉 WS_EX_TOOLWINDOW,然后便可以在任務欄中去掉顯示的本窗體圖標)
實現代碼(用VS2010調試):
首先先看看未被改變的時,工程生成的單文檔示例的運行結果:
接着需要修改窗口屬性,為文檔程序在主菜單欄上添加個 顯示/隱藏系統欄 的菜單項,完成顯示/隱藏系統欄的這個功能.菜單資源(菜單資源 ID 為 IDR_MAINFRAME,菜單項 ID 為 ID_CH)視圖如下:
為菜單項 顯示/隱藏系統欄 在框架類中添加事件響應函數(添加在框架類中,即 MainFrm 中),后在事件響應函數中添加相關操作,具體代碼如下:(SetWindowLong)

//獲得窗口大小 CRect rc; this->GetWindowRect(&rc); //判斷窗體是否有系統欄 if(GetWindowLong(GetSafeHwnd(),GWL_STYLE) & WS_CAPTION) { //去掉標題欄 SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) & ~WS_CAPTION); //窗體高度減 30 個像素點,即為窗體減去標題欄的高度 rc.top+=30; } else { //添加標題欄欄 SetWindowLong(this->GetSafeHwnd(),GWL_STYLE,GetWindowLong(GetSafeHwnd(),GWL_STYLE) | WS_CAPTION); //窗體高度加 30 個像素點,即為窗體加上標題欄的高度 rc.top-=30; } //移動窗體到新矩形區中 this->MoveWindow(&rc);
運行結果:
注意:
函數在窗口完全創建完成后第一個調用的函數並且在OnPaint前相應