單/多文檔的窗體類屬性修改(VC_MFC)


(本章節中例子都是用 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)

View Code
//獲得窗口大小
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前相應

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM