定制應(yīng)用程序外觀
本章主要講解如何修改MFC AppWizard自動(dòng)生成的應(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類之上的,在此處對(duì)外觀做的修改將只顯示在Frame類部分。如窗口的大小,標(biāo)題。
一個(gè)MFC單文檔應(yīng)用程序窗口的默認(rèn)窗口樣式是WS_OVERLAPPEDWINDOW和WS_ADDTOTITLE,要去掉其中的一種樣式,可以對(duì)其做取反操作。
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動(dòng)態(tài)加載Icon
如果要設(shè)置窗口的Icon為系統(tǒng)提供的格式,可以通過SetClassLong來實(shí)現(xiàn),如果要?jiǎng)討B(tài)的加載一個(gè)自定義的Icon,首先需要在Frame類的頭文件中創(chuàng)建一個(gè)HICON類型的變量。
HICON m_icon;可以同時(shí)加載多個(gè)文件,則需要?jiǎng)?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文件的方法,選擇一個(gè)自己看著順眼的方式。加載Icon文件之后,設(shè)置窗口的icon
1 SetClassLong(m_hWnd,GCL_HICON,(LONG)hicon[0]);
9.4設(shè)置定時(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個(gè)概念,一是創(chuàng)建一個(gè)靜態(tài)變量的時(shí)候,在內(nèi)存區(qū)域的全局對(duì)象與靜態(tài)變量區(qū)域分派內(nèi)存,只會(huì)創(chuàng)建一次。二是如果要在一個(gè)循環(huán)中將值限定在一個(gè)范圍之內(nèi),可以將循環(huán)值和這個(gè)值取模。
創(chuàng)建一個(gè)定時(shí)器之后,需要在OnCreate函數(shù)中添加定時(shí)器的響應(yīng)。在MSDN中可以看到SetTimer函數(shù)的說明
1 UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
SetTimer函數(shù)的返回值也即是函數(shù)的編號(hào)(第一個(gè)參數(shù)),第二個(gè)參數(shù)為定時(shí)器的響應(yīng)時(shí)間,以毫秒為單位,第三個(gè)參數(shù)通常設(shè)置為NULL,具體為什么,沒看懂。
1 SetTimer(1,1000,NULL);
相關(guān)推薦:
2012年計(jì)算機(jī)等考四級(jí)數(shù)據(jù)庫工程師備考筆記匯總
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |