控件自繪DRAWITEMSTRUCT


來由:DRAWITEMSTRUCT 為需要自繪的控件或者菜單項提供了必要的信息。在需要繪制的控件或者菜單項對應的WM_DRAWITEM消息函數中得到一個指向該結構的指針。  
例子:   
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); (.h中聲明)   
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) (.cpp中定義)  
這里LPDRAWITEMSTRUCT即指向DRAWITEMSTRUCT結構體的指針。  
DRAWITEMSTRUCT結構的定義如下:   
typedef struct tagDRAWITEMSTRUCT
{   
UINT CtlType;   
UINT CtlID;   
UINT itemID;   
UINT itemAction;   
UINT itemState;   
HWND hwndItem;   
HDC hDC;   
RECT rcItem;   
ULONG_PTR itemData;   
} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;
 
結構成員:   
成員:   
CtlType   
指定了控件的類型,其取值如下表所示。   
ODT_BUTTON:按鈕控件   
ODT_COMBOBOX:組合框控件  
ODT_LISTBOX:列表框控件   
ODT_LISTVIEW:列表視圖控件   
ODT_MENU:菜單項  
ODT_STATIC:靜態文本控件   
ODT_TAB:Tab控件   
CtlID   
指定了自繪控件的ID值,而對於菜單項則不需要使用該成員   
itemID   
   表示菜單項ID,也可以表示列表框或者組合框中某項的索引值。對於一個空的列表框或組合框,該成員的
   值  為–1。這時應用程序只繪制焦點矩形(該矩形的坐標由rcItem 成員給出)雖然此時控件中沒有需要顯
   示的項,但是繪制焦點矩形還是很有必要的,因為這樣做能夠提示用戶該控件是否具有輸入焦點。
   當然也可以設置itemAction 成員為合適值,使得無需繪制焦點。   
itemAction   
   指定繪制行為,其取值可以為下表中所示值的一個或者多個的聯合。   
   ODA_DRAWENTIRE:當整個控件都需要被繪制時,設置該值  
   ODA_FOCUS:如果控件需要在獲得或失去焦點時被繪制,則設置該值。此時應該檢查itemState成員,以確定
   控件是否具有輸入焦點。  
   ODA_SELECT:如果控件需要在選中狀態改變時被繪制,則設置該值。此時應該檢查itemState 成員,以確定
   控件是否處於選中狀態。   
itemState   
   指定了當前繪制操作完成后,所繪項的可見狀態。
  例如,如果菜單項應該被灰色顯示,則可以指定ODS_GRAYED狀態標志。其取值可以為下表中所示值的一個或者多個的聯合。  
   ODS_CHECKED:如果菜單項將被選中,則可設置該值。該值只對菜單項有用。  
   ODS_COMBOBOXEDIT:在自繪組合框控件中只繪制選擇區域。   
   ODS_DEFAULT:默認值。  
   ODS_DISABLED:如果控件將被禁止,則設置該值。   
   ODS_FOCUS:如果控件需要輸入焦點,則設置該值。  
   ODS_GRAYED:如果控件需要被灰色顯示,則設置該值。該值只在繪制菜單時使用。   
   ODS_HOTLIGHT:Windows 98/Me, Windows 2000/XP: 如果鼠標指針位於控件之上,則設置該值,這時控件會
            顯示高亮顏色。  
    ODS_INACTIVE:Windows 98/Me, Windows 2000/XP: 表示沒有激活的菜單項。  
    ODS_NOACCEL:Windows 2000/XP: 控件是否有快速鍵盤。   
    ODS_NOFOCUSRECT:Windows 2000/XP: 不繪制捕獲焦點的效果。   
    ODS_SELECTED:選中的菜單項。   
hwndItem   
   指定了組合框、列表框和按鈕等自繪控件的窗口句柄;如果自繪的對象時菜單項,則表示包含該菜單項的菜
   單句柄。   
hDC   
   指定了繪制操作所使用的設備環境。   
rcItem   
   指定了將被繪制的矩形區域。這個矩形區域就是上面hDC的作用范圍。系統會自動裁剪組合框、列表框或按鈕
   等控件的自繪制區域以外的部分。也就是說rcItem中的坐標點(0,0)指的就是控件的左上角。但是系統不
   裁剪菜單項,所以在繪制菜單項的時候,必須先通過一定的換算得到該菜單項的位置,以保證繪制操作在我
   們希望的區域中進行。  
itemData   
   對於菜單項,該成員的取值可以是由   
   CMenu::AppendMenu、  
   CMenu::InsertMenu或者  
   CMenu::ModifyMenu 等函數傳遞給菜單的值。  
   對於列表框或這組合框,該成員的值可以為由  
    ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString     等傳遞給控件的值。   
   如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC, itemData的取值為0。


免責聲明!

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



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