定制應(yīng)用程序外觀
本章主要講解如何修改MFC AppWizard自動生成的應(yīng)用程序的外觀,包括工具欄和狀態(tài)欄的變成。
9.1在窗口創(chuàng)建之前修改
第三章介紹了一些MFC AppWizard應(yīng)用程序的執(zhí)行流程,如果要在窗口創(chuàng)建之前修改應(yīng)用程序的外觀,可以再M(fèi)ainFrame類的PreCreateWindow()函數(shù)中修改窗口的外觀屬性。
01 BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
02 {
03 if( !CFrameWnd::PreCreateWindow(cs) )
04 return FALSE;
05 // TODO: Modify the Window class or styles here by modifying
06 // the CREATESTRUCT cs
07 cs.cx=800;
08 cs.cy=500;
09 cs.style&=~FWS_ADDTOTITLE;
10 cs.lpszName="www";
11 return TRUE;
12 }
由于MFC應(yīng)用程序的View類是覆蓋在Frame類之上的,在此處對外觀做的修改將只顯示在Frame類部分。如窗口的大小,標(biāo)題。
一個MFC單文檔應(yīng)用程序窗口的默認(rèn)窗口樣式是WS_OVERLAPPEDWINDOW和WS_ADDTOTITLE,要去掉其中的一種樣式,可以對其做取反操作。
1 cs.style=cs.style&~WS_ADDTOTITLE;
或者直接設(shè)置窗口的樣式
1 cs.style=WS_OVERLAPPEDWINDOW;
9.2在窗口創(chuàng)建之后修改
在窗口創(chuàng)建之后修改窗口的樣式,在Create函數(shù)中執(zhí)行。在Create函數(shù)中調(diào)用SetWindowLong函數(shù)。
1 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
2 {
3 //
4 SetWindowLong(m_hWnd,GWL_STYLE,WS_OVERLAPPEDWINDOW);
5 SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));
6 }
9.3動態(tài)加載Icon
如果要設(shè)置窗口的Icon為系統(tǒng)提供的格式,可以通過SetClassLong來實(shí)現(xiàn),如果要動態(tài)的加載一個自定義的Icon,首先需要在Frame類的頭文件中創(chuàng)建一個HICON類型的變量。
HICON m_icon;可以同時加載多個文件,則需要創(chuàng)建的HICON數(shù)組HICON m_iconl[],然后調(diào)用LoadIcon函數(shù)。
1 hicon[0]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));
2 hicon[1]=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON2));
書中給出了三種加載icon文件的方法,選擇一個自己看著順眼的方式。加載Icon文件之后,設(shè)置窗口的icon
1 SetClassLong(m_hWnd,GCL_HICON,(LONG)hicon[0]);
9.4設(shè)置定時器
SetTimer函數(shù)屬于標(biāo)準(zhǔn)消息,在Frame類上右鍵,可以看到所有的標(biāo)準(zhǔn)消息。
1 void CMainFrame::OnTimer(UINT nIDEvent)
2 {
3 // TODO: Add your message handler code here and/or call default
4 static int index=0;
5 index=++index%4;
6 CFrameWnd::OnTimer(nIDEvent);
7 }
這里有2個概念,一是創(chuàng)建一個靜態(tài)變量的時候,在內(nèi)存區(qū)域的全局對象與靜態(tài)變量區(qū)域分派內(nèi)存,只會創(chuàng)建一次。二是如果要在一個循環(huán)中將值限定在一個范圍之內(nèi),可以將循環(huán)值和這個值取模。
創(chuàng)建一個定時器之后,需要在OnCreate函數(shù)中添加定時器的響應(yīng)。在MSDN中可以看到SetTimer函數(shù)的說明
1 UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
SetTimer函數(shù)的返回值也即是函數(shù)的編號(第一個參數(shù)),第二個參數(shù)為定時器的響應(yīng)時間,以毫秒為單位,第三個參數(shù)通常設(shè)置為NULL,具體為什么,沒看懂。
1 SetTimer(1,1000,NULL);
相關(guān)推薦:
2012年計(jì)算機(jī)等考四級數(shù)據(jù)庫工程師備考筆記匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |