DRAWITEMSTRUCT 结构

DRAWITEMSTRUCT结构如下:

typedef struct tagDRAWITEMSTRUCT  
{    
  UINT CtlType;     //控件类型;  
  UINT CtlID;       //组合框、列表框等控件的ID标识号;  
  UINT itemID;      //菜单项的ID标识号或列表框、组合框中某一项的索引值;  
  UINT itemAction;  //控件行为;  
  UINT itemState;   //控件状态;  
  HWND hwndItem;    //父窗口句柄或菜单句柄  
  HDC hDC;          //控件对应的绘图设备句柄  
  RECT rcItem;      //控件所占据的矩形区域  
  DWORD itemData;   //列表框或组合框中某一项的值  
} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT  

【结构成员】 
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()等函数的调用来传递的。CMenu::AppendMenu()、CMenu::InSertMenu()、CMenu::ModifMenu()等函数的调用来传递的。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值