DRAWITEMSTRUCT结构的介绍

 

DRAWITEMSTRUCT结构如下:

  1. typedef struct tagDRAWITEMSTRUCT  
  2. {  
  3.   
  4.   UINT CtlType; //控件类型;  
  5.   UINT CtlID; //组合框、列表框等控件的ID标识号;  
  6.   UINT itemID; //菜单项的ID标识号或列表框、组合框中某一项的索引值;  
  7.   UINT itemAction; //控件行为;  
  8.   UINT itemState; //控件状态;  
  9.   HWND hwndItem; //父窗口句柄或菜单句柄  
  10.   HDC hDC; //控件对应的绘图设备句柄  
  11.   RECT rcItem; //控件所占据的矩形区域  
  12.   DWORD itemData; //列表框或组合框中某一项的值  
  13.   
  14. }  

【结构成员】 

CtlType——指定了控件的类型,有以下几种取值:

ODT_BUTTON 自绘制按钮
ODT_COMBOBOX 自绘制组合框
ODT_LISTBOX 自绘制列表框
ODT_MENU 自绘制菜单项
ODT_LISTVIEW 自绘制列表视
ODT_STATIC 自绘制静态控件
ODT_TAB Tab控件

CtlID——指定了需要自绘制的控件ID,而对于菜单项无需使用。

itemID——是菜单项的ID或列表框或组合框的索引,对于一个空的列表框或组合框,该成员的值为-1。


itemAction——绘制动作,有以下几种取值:


ODA_DRAWENTIRE 整个控件都需被绘制
ODA_FOCUS 控件需要获得或失去焦点时被绘制
ODA_SELECT 控件需要在被选中时绘制

itemState——当绘制完成后的,所绘项的可见状态,有以下几种取值:

ODS_CHECKED 如果菜单项将被选中,则设置该值(只对菜单项有效)
ODS_DISABLED 如果绘制项将被禁止,则设置该值
ODS_FOCUS 如果绘制项需要输入焦点,则绘制该值
ODS_GRAYED 如果绘制项需要被灰色显示,则设置该值
ODS_SELECTED 如果绘制项需要被设置为选中状态,则设置该值
ODS_COMBOBOXEDIT 在自绘制组合框中只绘制选择区域
ODS_DEFAULT 自绘制项为默认项,表示当前控件处于默认状态;

hwndItem——指定了组合框、列表框和按钮等自绘制控件的窗口句柄;包含菜单项的菜单句柄(HMENU)
                      
假如自绘的对象时菜单项,则表示包含该菜单项的菜单句柄。

hDC——设备环境的句柄。
rcItem——控件外观大小的矩形。

这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等控件的自绘制区域以外的部分。
也就 是说rcItem中的坐标点(0,0)指的就是控件的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,
必须先通过一定的换算得到该菜单项的位置, 以确保绘制操作在我们希望的区域中进行。


itemData——传递给控件的值。


这个成员变量最为关键,菜单自绘时所需要的图标、文本等信息都是通过他获取的,
至于他的具体值,是通过CMenu类的CMenu::AppendMenu()、CMenu::InSertMenu()、
CMenu::ModifMenu()等函数的调用来传递的。


上面这个结构中,成员变量CtlType等于ODT_COMBOBOX 时,表示当前控件为自绘型的组合框,等于ODT_LISTBOX时表示当前控件为自绘列表控制件,等于ODT_MENU 时表示当前控件为自绘菜单。对于组合框和列表框控件,成员变量itemData是通过相应的AddString()、InsertString()获取的,对于菜单控件,成员变量itemData和DRAWITEMSTRUCT结构中的itemData是一致的

VC6 CListCtrl继承类例子 oid CListCtrlCl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: 添加您的代码以绘制指定项 TCHAR lpBuffer[256]; LV_ITEM lvi; lvi.mask = LVIF_TEXT | LVIF_PARAM ; lvi.iItem = lpDrawItemStruct->itemID ; lvi.iSubItem = 0; lvi.pszText = lpBuffer ; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); LV_COLUMN lvc, lvcprev ; ::ZeroMemory(&lvc, sizeof(lvc)); ::ZeroMemory(&lvcprev, sizeof(lvcprev)); lvc.mask = LVCF_WIDTH | LVCF_FMT; lvcprev.mask = LVCF_WIDTH | LVCF_FMT; CDC* pDC; pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rtClient; GetClientRect(&rtClient); for ( int nCol=0; GetColumn(nCol, &lvc); nCol++) { if ( nCol > 0 ) { // Get Previous Column Width in order to move the next display item GetColumn(nCol-1, &lvcprev) ; lpDrawItemStruct->rcItem.left += lvcprev.cx ; lpDrawItemStruct->rcItem.right += lpDrawItemStruct->rcItem.left; } CRect rcItem; if (!GetSubItemRect(lpDrawItemStruct->itemID,nCol,LVIR_LABEL,rcItem)) continue; ::ZeroMemory(&lvi, sizeof(lvi)); lvi.iItem = lpDrawItemStruct->itemID; lvi.mask = LVIF_TEXT | LVIF_PARAM; lvi.iSubItem = nCol; lvi.pszText = lpBuffer; lvi.cchTextMax = sizeof(lpBuffer); VERIFY(GetItem(&lvi)); CRect rcTemp; rcTemp = rcItem; if (nCol==0) { rcTemp.left -=2; } if ( lpDrawItemStruct->itemState & ODS_SELECTED ) { pDC->FillSolidRect(&rcTemp, GetSysColor(COLOR_HIGHLIGHT)) ; pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT)) ; } else { COLORREF color; color = GetBkColor(); pDC->FillSolidRect(rcTemp,color); if (FindColColor(nCol,color)) { pDC->FillSolidRect(rcTemp,color); } if (FindItemColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->FillSolidRect(rcTemp,color); } //pDC->SetTextColor(m_color); } pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT)); UINT uFormat = DT_CENTER ; if (m_Header.m_Format[nCol]=='0') { uFormat = DT_LEFT; } else if (m_Header.m_Format[nCol]=='1') { uFormat = DT_CENTER; } else if (m_Header.m_Format[nCol]=='2') { uFormat = DT_RIGHT; } TEXTMETRIC metric; pDC->GetTextMetrics(&metric); int ofst; ofst = rcItem.Height() - metric.tmHeight; rcItem.OffsetRect(0,ofst/2); pDC->SetTextColor(m_color); COLORREF color; if (FindColTextColor(nCol,color)) { pDC->SetTextColor(color); } if (FindItemTextColor(nCol,lpDrawItemStruct->itemID,color)) { pDC->SetTextColor(color); } CFont nFont ,* nOldFont; nFont.CreateFont(m_fontHeight,m_fontWith,0,0,0,FALSE,FALSE,0,0,0,0,0,0,_TEXT("宋体"));//创建字体 nOldFont = pDC->SelectObject(&nFont); DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), &rcItem, uFormat) ; pDC->SelectStockObject(SYSTEM_FONT) ; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值