欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
白喬原創(chuàng ):VC之美化界面篇

本文專(zhuān)題討論VC中的界面美化,適用于具有中等VC水平的讀者。讀者最好具有以下VC基礎:

1. 大致了解MFC框架的基本運作原理;

2. 熟悉Windows消息機制,熟悉MFC的消息映射和反射機制;

3. 熟悉OOP理論和技術(shù);

本文根據筆者多年的開(kāi)發(fā)經(jīng)驗,并結合簡(jiǎn)單的例子一一展開(kāi),希望對讀者有所幫助。

 


正文

1. 美化界面之開(kāi)題篇

相信使用過(guò)《金山毒霸》、《瑞星殺毒》軟件的讀者應該還記得它們的精美界面:

 

圖1 瑞星殺毒軟件的精美界面

程序的功能如何如何強大是一回事,它的用戶(hù)界面則是另一回事。千萬(wàn)不要忽視程序的用戶(hù)界面,因為它是給用戶(hù)最初最直接的印象,丑陋的界面、不友好的風(fēng)格肯定會(huì )影響用戶(hù)對軟件程序的使用。

“受之以魚(yú),不若授之以漁”,本教程并不會(huì )向你推薦《瑞星殺毒軟件》精美界面的具體實(shí)現,而只是向你推薦一些常用的美化方法。

 

2. 美化界面之基礎篇

美化界面需要先熟悉Windows下的繪圖操作,并明白Windows的幕后繪圖操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免……

2.1 Windows下的繪圖操作

熟悉DOS的讀者可能就知道:DOS下面的圖形操作很方便,進(jìn)入圖形模式,整個(gè)屏幕就是你的了,你希望在哪畫(huà)個(gè)點(diǎn),那個(gè)地方就會(huì )出現一個(gè)點(diǎn),紅的、或者黃的,隨你的便。你也可以花點(diǎn)時(shí)間畫(huà)個(gè)按鈕,畫(huà)個(gè)你自己的菜單,等等……

Windows本身就是圖形界面,所以Windows下面的繪圖操作功能更豐富、簡(jiǎn)單。要了解Windows下的繪圖操作,要實(shí)現Windows界面的美化,就必須了解MFC封裝的設備環(huán)境類(lèi)和圖形對象類(lèi)。

2.1.1 設備環(huán)境類(lèi)

Windows下的繪圖操作說(shuō)到底就是DC操作。DC(Device Context設備環(huán)境)對象是一個(gè)抽象的作圖環(huán)境,可能是對應屏幕,也可能是對應打印機或其它。這個(gè)環(huán)境是設備無(wú)關(guān)的,所以你在對不同的設備輸出時(shí)只需要使用不同的設備環(huán)境就行了,而作圖方式可以完全不變。這也就是Windows的設備無(wú)關(guān)性。

MFC的CDC類(lèi)封裝了Windows API 中大部分的畫(huà)圖函數。CDC的常見(jiàn)操作函數包括:

Drawing-Attribute Functions:繪圖屬性操作,如:設置透明模式

Mapping Functions:映射操作

Coordinate Functions:坐標操作

Clipping Functions:剪切操作

Line-Output Functions:畫(huà)線(xiàn)操作

Simple Drawing Functions:簡(jiǎn)單繪圖操作,如:繪制矩形框

Ellipse and Polygon Functions:橢圓/多邊形操作

Text Functions:文字輸出操作

Printer Escape Functions:打印操作

Scrolling Functions:滾動(dòng)操作

*Bitmap Functions:位圖操作

*Region Functions:區域操作

*Font Functions:字體操作

*Color and Color Palette Functions:顏色/調色板操作

其中,標注*項會(huì )用到相應的圖形對象類(lèi),參見(jiàn)2.1.2內容。

 

2.1.2 圖形對象類(lèi)

設備環(huán)境不足以包含繪圖功能所需的所有繪圖特征,除了設備環(huán)境外, Windows還有其他一些圖形對象用來(lái)儲存繪圖特征。這些附加的功能包括從畫(huà)線(xiàn)的寬度和顏色到畫(huà)文本時(shí)所用的字體。圖形對象類(lèi)封裝了所有六個(gè)圖形對象。

下面的表格列出了MFC的圖形對象類(lèi):

MFC類(lèi) 圖形對象句柄 圖形對象目的

CBitmap HBITMAP 內存中的位圖

CBrush HBRUSH 畫(huà)刷特性—填充某個(gè)圖形時(shí)所使用的顏色和模式

CFont HFONT 字體特性—寫(xiě)文本時(shí)所使用的字體

CPalette HPALETTE 調色板顏色

CPen HPEN 畫(huà)筆特性—畫(huà)輪廓時(shí)所使用的線(xiàn)的粗細

CRgn HRGN 區域特性—包括定義它的點(diǎn)

表1 圖形對象類(lèi)和它們封裝的句柄

使用CDC和圖形對象類(lèi),在Windows里繪圖還算是很簡(jiǎn)單的。觀(guān)察以下的畫(huà)面:

 圖2 使用CDC繪制出的按鈕

該畫(huà)面通過(guò)以下代碼自行繪制的假按鈕:

呵呵,不好意思,這并不是真的Windows按鈕,它只是一個(gè)假的空框子,當用戶(hù)在按鈕上點(diǎn)擊鼠標時(shí),放心,什么事情都不會(huì )發(fā)生。

2.2 Windows的幕后繪圖操作

在Window中,如果所有的界面操作都由用戶(hù)代碼來(lái)實(shí)現,那將是一個(gè)很浩大的工程。筆者曾經(jīng)在DOS設計過(guò)窗口圖形界面,代碼上千行,但實(shí)現的界面還是很古板、難看,除了我那個(gè)對編程一竅不通的女友,沒(méi)有一個(gè)人欣賞它L;而且,更要命的是,操作系統,包括別的應用程序并不認識你的界面元素,這才是真正悲哀的。認識這些界面的只有你的程序,圖2中的按鈕永遠只是一個(gè)無(wú)用的框子。

有了Windows,一切都好辦了,Windows將諸如按鈕、菜單、工具欄等等這些通用界面的繪制及動(dòng)作都交給了系統,程序員就不用花心思再畫(huà)那些按鈕了,可以將更多的精力放在程序的功能實(shí)現方面。

所有的標準界面元素都被Windows封裝好了。Windows知道怎么畫(huà)你的菜單以及你的標注著(zhù)“Hello, Cfan!”的按鈕。當CFan某個(gè)快樂(lè )的小編(譬如:小飛)點(diǎn)擊這個(gè)按鈕的時(shí)候,Windows也明白按鈕按下去的時(shí)候該有的模樣,甚至,當這個(gè)友好的按鈕獲取焦點(diǎn)時(shí),Windows也會(huì )不失時(shí)機地為它準備一個(gè)虛框……

有利必有弊。你的不滿(mǎn)這時(shí)候產(chǎn)生了:你既想使用Windows的True Button,可也嫌它的界面不夠好看,譬如,你喜歡用藍色的粗體表達你對CFan的無(wú)限情懷(正如圖2那樣)——人心不足,有辦法嗎?有的。

 

3. 美化界面之實(shí)現篇

Windows還是給程序員留下了很多后門(mén),通過(guò)一些途徑還是可以美化界面的。本章節我們系統學(xué)習一下Windows界面美化的實(shí)現。

3.1 美化界面的途徑

如何以合法的手段來(lái)達到美化界面的效果?一般美化界面的方法包括:

1. 使用MFC類(lèi)的既有函數,設定界面屬性;

2. 利用Windows的消息機制,截獲有用的Windows的消息。通過(guò)MFC的消息映射(Message Mapping)和反射(Message Reflecting)機制,在Windows準備或者正在繪制該元素時(shí),偷偷修改它的狀態(tài)和行為,譬如:讓按鈕的邊框為紅色;

3. 利用MFC類(lèi)的虛函數機制,重載有用的虛函數。在MFC框架調用該函數的時(shí)候,重新定義它的狀態(tài)和行為;

一般來(lái)說(shuō),應用程序可以通過(guò)以下兩種途徑來(lái)實(shí)現以上的方法:

1. 在父窗口里,截獲自身的或者由子元素(包括控件和菜單等元素)傳遞的關(guān)于界面繪制的消息;

2. 子類(lèi)化子元素,或者為子元素準備一個(gè)新的類(lèi)(一般來(lái)說(shuō)該類(lèi)必須繼承于MFC封裝的某個(gè)標準類(lèi),如:CButton)。在該子元素里,截獲自身的或者從父窗口反射過(guò)來(lái)的關(guān)于界面繪制的消息。譬如:用戶(hù)可以創(chuàng )建一個(gè)CXPButton類(lèi)來(lái)實(shí)現具有XP風(fēng)格的按鈕,CXPButton繼承于CButton。

對于應用程序,使用CXPButton類(lèi)的途徑相對于對話(huà)框窗口和普通窗口分成兩種:

① 對話(huà)框窗口中,直接將原先綁定按鈕的CButton類(lèi)替換成CXPButton類(lèi),或者在綁定變量時(shí)直接指定Control類(lèi)型為CXPButton,如圖3所示:

 圖3 為按鈕指定CXPButton類(lèi)型

②在普通窗口中,直接創(chuàng )建一個(gè)CXPButton類(lèi)對象,然后在OnCreate()中調用CXPButton的Create方法;

以下的章節將綜合地使用以上的方法,請讀者朋友留心觀(guān)察。

 

3.2 使用MFC類(lèi)的既有函數

在界面美化的專(zhuān)題中,MFC也并非一無(wú)是處。MFC類(lèi)對于界面美化也做了部分的努力,以下是一些可以使用的,參數說(shuō)明略去。

CWinApp::SetDialogBkColor

void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) );

指定對話(huà)框的背景色和文本顏色。

CListCtrl::SetBkColor

CReBarCtrl::SetBkColor

CStatusBarCtrl::SetBkColor

CTreeCtrl::SetBkColor

COLORREF SetBkColor( COLORREF clr );

設定背景色。

CListCtrl::SetTextColor

CReBarCtrl::SetTextColor

CTreeCtrl::SetTextColor

COLORREF SetTextColor( COLORREF clr );

設定文本顏色。

CListCtrl::SetBkImage

BOOL SetBkImage( LVBKIMAGE* plvbkImage );

BOOL SetBkImage( HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);

BOOL SetBkImage( LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0 );

設定列表控件的背景圖片。

CComboBoxEx::SetExtendedStyle

CListCtrl::SetExtendedStyle

CTabCtrl::SetExtendedStyle

CToolBarCtrl::SetExtendedStyle

DWORD SetExtendedStyle( DWORD dwExMask, DWORD dwExStyles );

設置控件的擴展屬性,例如:設置列表控件屬性帶有表格線(xiàn)。

圖4是個(gè)簡(jiǎn)單應用MFC類(lèi)的既有函數來(lái)改善Windows界面的例子:

圖4 使用MFC類(lèi)的既有函數美化界面

相關(guān)實(shí)現代碼如下:

嗯,這樣的界面還算不錯吧?

3.3 使用Windows的消息機制

 

使用MFC類(lèi)的既有函數來(lái)美化界面,其功能是有限的。既然Windows是通過(guò)消息機制進(jìn)行通訊的,那么我們就可以通過(guò)截獲一些有用的消息來(lái)美化我們的界面,以下是一些有用的Windows消息:

WM_PAINT

WM_ERASEBKGND

WM_CTLCOLOR*

WM_DRAWITEM*

WM_MEASUREITEM*

NM_CUSTOMDRAW*

注意,標注*的消息是子元素發(fā)送給父窗口的通知消息,其它的為窗口或者子元素自身的消息。

3.3.1 WM_PAINT

 

WM_PAINT消息相信大家都很熟悉,一個(gè)窗口要重繪了,就會(huì )有一個(gè)WM_PAINT消息發(fā)送給窗口。

可以響應窗口的WM_PAINT,以更改它們的模樣。WM_PAINT的映射函數原型如下:

afx_msg void OnPaint();

控件也是窗口,所以控件也有WM_PAINT消息,通過(guò)消息映射我們完全可以定義控件的界面。如圖5所示:

圖5 利用WM_ PAINT消息美化界面

實(shí)現代碼也很簡(jiǎn)單:

哈哈,簡(jiǎn)單吧?不過(guò)WM_PAINT確實(shí)絕了點(diǎn),它要求應用程序完成元素界面的所有繪制過(guò)程,想象一下如何畫(huà)出一個(gè)完整的列表控件?太煩了吧。一般來(lái)說(shuō),很少有人喜歡使用WM_PAINT,還有其它更細致的消息。

3.3.2 WM_ERASEBKGND

 

Windows在向窗口發(fā)送WM_PAINT消息之前,總會(huì )發(fā)送一個(gè)WM_ERASEBKGND消息通知該窗口擦除背景,默認情況下,Windows將以窗口的背景色清除該窗口。

可以響應窗口(包括子元素)的WM_ERASEBKGND,以更改它們的背景。WM_ERASEBKGND的映射函數原型如下:

afx_msg BOOL OnEraseBkgnd( CDC* pDC );

返回值:

指定背景是否已清除,如果為FALSE,系統將自動(dòng)清除

參數:

pDC指定了繪制操作所使用的設備環(huán)境。

圖6是個(gè)簡(jiǎn)單的例子,通過(guò)OnEraseBkgnd為對話(huà)框加載了一副位圖背景:

圖6 利用WM_ ERASEBKGND消息美化界面

實(shí)現代碼也很簡(jiǎn)單:

同時(shí)別忘了響應OnCtlColor,否則窗口里面的控件就不透明了。OnCtlColor的內容,詳見(jiàn)3.3.3章節。

3.3.3 WM_CTLCOLOR

 

在控件顯示之前,每一個(gè)控件都會(huì )向父對話(huà)框發(fā)送一個(gè)WM_CTLCOLOR消息要求獲取繪制所需要的顏色。WM_CTLCOLOR消息缺省處理函數CWnd::OnCtlColor返回一個(gè)HBRUSH類(lèi)型的句柄,這樣,就可以設置前景和背景文本顏色,并為控件或者對話(huà)框的非文本區域選定一個(gè)刷子。

WM_CTLCOLOR的映射函數原型如下:

afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );

返回值:

用以指定背景的刷子

參數:

pDC指定了繪制操作所使用的設備環(huán)境。

pWnd 控件指針

nCtlColor 指定控件類(lèi)型,其取值如表2所示:

類(lèi)型值 含義

CTLCOLOR_BTN 按鈕控件

CTLCOLOR_DLG 對話(huà)框

CTLCOLOR_EDIT  編輯控件

CTLCOLOR_LISTBOX  列表框

CTLCOLOR_MSGBOX  消息框

CTLCOLOR_SCROLLBAR 滾動(dòng)條

CTLCOLOR_STATIC 靜態(tài)控件

表2 nCtlColor的類(lèi)型值與含義

作為一個(gè)簡(jiǎn)單的例子,觀(guān)察以下的代碼:

生成的界面如下:

 圖7 利用WM_CTLCOLOR消息美化界面

3.3.4 WM_DRAWITEM

 

OnCtlColor只能修改元素的顏色,但不能修改元素的界面框架,WM_DRAWITEM則可以。

當一個(gè)具有Owner draw風(fēng)格的元素(包括按鈕、組合框、列表框和菜單等)需要顯示外觀(guān)時(shí),該元素會(huì )發(fā)送一條WM_DRAWITEM消息至它的隸屬窗口(Owner)。

WM_DRAWITEM的映射函數原型如下:

afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );

參數:

nIDCtl 該控件的ID,如果該元素為菜單,則nIDCtl為0

lpDrawItemStruct 指向DRAWITEMSTRUCT結構對象的指針,DRAWITEMSTRUCT的結構定義如下:

CtlType指定了控件的類(lèi)型,其取值如表3所示:

類(lèi)型值 含義

ODT_BUTTON 按鈕控件

ODT_COMBOBOX 組合框控件

ODT_LISTBOX 列表框控件

ODT_LISTVIEW 列表視圖

ODT_MENU 菜單項

ODT_STATIC 靜態(tài)文本控件

ODT_TAB Tab控件

表3 CtlType的類(lèi)型值與含義

CtlID 指定自繪控件的ID值,該成員不適用于菜單項

itemID表示菜單項ID,也可以表示列表框或者組合框中某項的索引值。對于一個(gè)空的列表框或組合框,該成員的值為?C1。這時(shí)應用程序只繪制焦點(diǎn)矩形(該矩形的坐標由rcItem 成員給出)雖然此時(shí)控件中沒(méi)有需要顯示的項,但是繪制焦點(diǎn)矩形還是很有必要的,因為這樣做能夠提示用戶(hù)該控件是否具有輸入焦點(diǎn)。當然也可以設置itemAction 成員為合適值,使得無(wú)需繪制焦點(diǎn)。

itemAction 指定繪制行為,其取值為表4中所示值的一個(gè)或者多個(gè)的聯(lián)合:

類(lèi)型值 含義

ODA_DRAWENTIRE 當整個(gè)控件都需要被繪制時(shí),設置該值。

ODA_FOCUS 如果控件需要在獲得或失去焦點(diǎn)時(shí)被繪制,則設置該值。此時(shí)應該檢查itemState成員,以確定控件是否具有輸入焦點(diǎn)。

ODA_SELECT 如果控件需要在選中狀態(tài)改變時(shí)被繪制,則設置該值。此時(shí)應該檢查itemState 成員,以確定控件是否處于選中狀態(tài)。

表4 itemAction的類(lèi)型值與含義

itemState 指定了當前繪制項的狀態(tài)。例如,如果菜單項應該被灰色顯示,則可以指定ODS_GRAYED狀態(tài)標志。其取值為表5中所示值的一個(gè)或者多個(gè)的聯(lián)合:

類(lèi)型值 含義

ODS_CHECKED 標記狀態(tài),僅適用于菜單項。

ODS_DEFAULT 默認狀態(tài)。

ODS_DISABLED 禁止狀態(tài)。

ODS_FOCUS 焦點(diǎn)狀態(tài)。

ODS_GRAYED 灰化狀態(tài),僅適用于菜單項。

ODS_SELECTED 選中狀態(tài)。

ODS_HOTLIGHT 僅適用于Windows 98/Me/Windows 2000/XP,熱點(diǎn)狀態(tài):如果鼠標指針位于控件之上,則設置該值,這時(shí)控件會(huì )顯示高亮顏色。

ODS_INACTIVE 僅適用于Windows 98/Me/Windows 2000/XP,非激活狀態(tài)。

ODS_NOACCEL 僅適用于Windows 2000/XP,控件是否有快速鍵。

ODS_COMBOBOXEDIT 在自繪組合框控件中只繪制選擇區域。

ODS_NOFOCUSRECT 僅適用于Windows 2000/XP,不繪制捕獲焦點(diǎn)的效果。

表5 itemState的類(lèi)型值與含義

hwndItem 指定了組合框、列表框和按鈕等自繪控件的窗口句柄;如果自繪的對象為菜單項,則表示包含該菜單項的菜單句柄。

hDC 指定了繪制操作所使用的設備環(huán)境。

rcItem 指定了將被繪制的矩形區域。這個(gè)矩形區域就是上面hDC的作用范圍。系統會(huì )自動(dòng)裁剪組合框、列表框或按鈕等控件的自繪制區域以外的部分。也就是說(shuō)rcItem中的坐標點(diǎn)(0,0)指的就是控件的左上角。但是系統不裁剪菜單項,所以在繪制菜單項的時(shí)候,必須先通過(guò)一定的換算得到該菜單項的位置,以保證繪制操作在我們希望的區域中進(jìn)行。

itemData

對于菜單項,該成員的取值為由CMenu::AppendMenu、CMenu::InsertMenu、CMenu::ModifyMenu等函數傳遞給菜單的值。

對于列表框或這組合框,該成員的取值為由ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString等函數傳遞給控件的值。

如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC,itemData的取值為0。

圖5是個(gè)相應的例子,它修改了按鈕的界面:

圖8 利用WM_DRAWITEM消息美化界面

實(shí)現代碼如下:

別忘了標記Owner draw屬性:

 圖9 指定按鈕的Owner draw屬性

值得一提的是,CWnd內部截獲了WM_DRAWITEM、WM_MEASUREITEM等消息,并映射成子元素的相應虛函數的調用,如CButton::DrawItem()。所以,以上例子也可以通過(guò)派生出一個(gè)CButton的派生類(lèi),并重載該類(lèi)的DrawItem()函數來(lái)實(shí)現。使用虛函數機制實(shí)現界面美化參見(jiàn)3.4章節。

3.3.5 WM_MEASUREITEM

僅僅WM_DRAWITEM還是不夠的,對于一些特殊的控件,如ListBox,系統在發(fā)送WM_DRAWITEM消息前,還發(fā)送WM_MEASUREITEM消息,需要你設置ListBox中每個(gè)項目的高度。

WM_DRAWITEM的映射函數原型如下:

afx_msg void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct );

nIDCtl 該控件的ID,如果該元素為菜單,則nIDCtl為0

lpMeasureItemStruct指向MEASUREITEMSTRUCT結構對象的指針,MEASUREITEMSTRUCT的結構定義如下:

CtlType指定了控件的類(lèi)型,其取值如表6所示:

類(lèi)型值 含義

ODT_COMBOBOX 組合框控件

ODT_LISTBOX 列表框控件

ODT_MENU 菜單項

表6 CtlType的類(lèi)型值與含義

CtlID 指定自繪控件的ID值,該成員不適用于菜單項

itemID表示菜單項ID,也可以表示可變高度的列表框或組合框中某項的索引值。該成員不適用于固定高度的列表框或組合框。

itemWidth 指定菜單項的寬度

itemHeight指定菜單項或者列表框中某項的的高度,最大值為255

itemData

對于菜單項,該成員的取值為由CMenu::AppendMenu、CMenu::InsertMenu、CMenu::ModifyMenu等函數傳遞給菜單的值。

對于列表框或這組合框,該成員的取值為由ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString等函數傳遞給控件的值。

圖示出了OnMeasureItem的效果:

 圖10 利用WM_MEASUREITEM消息美化界面

相應的OnMeasureItem()實(shí)現如下:

同樣別忘了指定列表框的Owner draw屬性:

圖11 指定下拉框的Owner draw屬性

 

3.3.6 NM_CUSTOMDRAW

大家也許熟悉WM_NOTIFY,控件通過(guò)WM_NOTIFY向父窗口發(fā)送消息。在WM_NOTIFY消息體中,部分控件會(huì )發(fā)送NM_CUSTOMDRAW告訴父窗口自己需要繪圖。

可以反射N(xiāo)M_CUSTOMDRAW消息,如:

ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

afx_msg void OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult);

參數:

pNMHDR 說(shuō)到底只是一個(gè)指針,大多數情況下它指向一個(gè)NMHDR結構對象,NMHDR結構如下:

其中:

hwndFrom 發(fā)送方控件的窗口句柄

idFrom 發(fā)送方控件的ID

code 通知代碼

對于某些控件來(lái)說(shuō),pNMHDR則會(huì )解釋成其它內容更豐富的結構對象的指針,如:對于列表控件來(lái)說(shuō),pNMHDR常常指向一個(gè)NMCUSTOMDRAW對象,NMCUSTOMDRAW結構如下:

hdr NMHDR對象

dwDrawStage 當前繪制狀態(tài),其取值如表7所示:

類(lèi)型值 含義

CDDS_POSTERASE 擦除循環(huán)結束

CDDS_POSTPAINT 繪制循環(huán)結束

CDDS_PREERASE 準備開(kāi)始擦除循環(huán)

CDDS_PREPAINT 準備開(kāi)始繪制循環(huán)

CDDS_ITEM 指定dwItemSpec, uItemState, lItemlParam參數有效

CDDS_ITEMPOSTERASE 列表項擦除結束

CDDS_ITEMPOSTPAINT 列表項繪制結束

CDDS_ITEMPREERASE 準備開(kāi)始列表項擦除

CDDS_ITEMPREPAINT 準備開(kāi)始列表項繪制

CDDS_SUBITEM 指定列表子項

表7 dwDrawStage的類(lèi)型值與含義

hdc指定了繪制操作所使用的設備環(huán)境。

rc指定了將被繪制的矩形區域。

dwItemSpec 列表項的索引

uItemState 當前列表項的狀態(tài),其取值如表8所示:

類(lèi)型值 含義

CDIS_CHECKED 標記狀態(tài)。

CDIS_DEFAULT 默認狀態(tài)。

CDIS_DISABLED 禁止狀態(tài)。

CDIS_FOCUS 焦點(diǎn)狀態(tài)。

CDIS_GRAYED 灰化狀態(tài)。

CDIS_SELECTED 選中狀態(tài)。

CDIS_HOTLIGHT 熱點(diǎn)狀態(tài)。

CDIS_INDETERMINATE 不定狀態(tài)。

CDIS_MARKED 標注狀態(tài)。

表8 uItemState的類(lèi)型值與含義

lItemlParam 當前列表項的綁定數據

pResult 指向狀態(tài)值的指針,指定系統后續操作,依賴(lài)于dwDrawStage:

當dwDrawStage為CDDS_PREPAINT,pResult含義如表9所示:

類(lèi)型值 含義

CDRF_DODEFAULT 默認操作,即系統在列表項繪制循環(huán)過(guò)程不再發(fā)送NM_CUSTOMDRAW。

CDRF_NOTIFYITEMDRAW 指定列表項繪制前后發(fā)送消息。

CDRF_NOTIFYPOSTERASE 列表項擦除結束時(shí)發(fā)送消息。

CDRF_NOTIFYPOSTPAINT 列表項繪制結束時(shí)發(fā)送消息。

表9 pResult的類(lèi)型值與含義(一)

當dwDrawStage為CDDS_ITEMPREPAINT,pResult含義如表10所示:

類(lèi)型值 含義

CDRF_NEWFONT 指定后續操作采用應用中指定的新字體。

CDRF_NOTIFYSUBITEMDRAW 列表子項繪制時(shí)發(fā)送消息。

CDRF_SKIPDEFAULT 系統不必再繪制該子項。

表10 pResult的類(lèi)型值與含義(二)

以下是一個(gè)利用NM_CUSTOMDRAW消息繪制出的多色列表框的例子:

圖12 利用NM_CUSTOMDRAW消息美化界面

對應代碼如下:

注意到上例采取了3.1所推薦的第2種實(shí)現方法,派生了一個(gè)新類(lèi)CCoolList。

3.4 使用MFC類(lèi)的虛函數機制

修改Windows界面,除了從Windows消息機制下功夫,也可以從MFC類(lèi)下功夫,這應該得益于類(lèi)的虛函數機制。為了防止諸如“面向對象技術(shù)”等術(shù)語(yǔ)在此泛濫,以下僅舉一段代碼作為例子:

這是MFC中viewcore.cpp中的源代碼,很多讀者總不明白OnDraw()和OnPaint()之間的關(guān)系,從以上的代碼中很容易看出,CView的WM_PAINT消息響應函數OnPaint()會(huì )自動(dòng)調用CView::OnDraw()。而作為開(kāi)發(fā)者的用戶(hù),可以通過(guò)簡(jiǎn)單的OnDraw()的重載實(shí)現對WM_PAINT的處理。所以說(shuō),對MFC類(lèi)的虛函數的重載是對消息機制的擴展。

以下列出了與界面美化相關(guān)的虛函數,參數說(shuō)明略去:

CButton::DrawItem

CCheckListBox::DrawItem

CComboBox::DrawItem

CHeaderCtrl::DrawItem

CListBox::DrawItem

CMenu::DrawItem

CStatusBar::DrawItem

CStatusBarCtrl::DrawItem

CTabCtrl::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

Owner draw元素自繪函數

很顯然,位圖菜單都是通過(guò)這個(gè)DrawItem畫(huà)出來(lái)的。限于篇幅,在此不再附以例程。

 


參考文獻

本文為白喬原創(chuàng ),曾經(jīng)在《電腦愛(ài)好者》合訂本上發(fā)表。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
MFC 自繪
WM_MEASUREITEM
深度剖析消息反射機制
自繪按鈕補遺
在你的MFC應用程序中顯示一個(gè)JPG文件 - VC知識 - 界面程序資源 - DirectUI Skin UIPower專(zhuān)業(yè)界面開(kāi)發(fā)與設計論壇 軟件界面|界面開(kāi)發(fā) - Powered by Dis
VC知識庫文章 - MFC程序員的WTL指南: Part V - 高級對話(huà)框用戶(hù)界面類(lèi)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久