LPDRAWITEMSTRUCT,PDRAWITEMSTRUCT ,DRAWITEMSTRUCT参数介绍

本文详细介绍了DRAWITEMSTRUCT结构,该结构用于WM_DRAWITEM消息。解释了控件类型、控件ID、项ID、项操作、项状态等字段的含义及用途。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

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_MENU 所有者描述的菜单
ODT_LISTVIEW 列表视图控件
ODT_STATIC 所有者描述的静态控件
ODT_TAB 选项卡控件

CtlID
组合框控件 ID,列表框或按钮。 此成员 菜单不使用。

itemID
菜单或项的索引的菜单项 ID 在列表框或组合框中。 对于空列表框或组合框,此成员是负值,使应用程序仅绘制焦点矩形。 rcItem 成员指定坐标,即使控件中没有项。 用户可能从而显示列表框或组合框是否具有输入焦点。 将 itemAction 成员的位确定是否将绘制矩形,就象列表框或组合框输入焦点。

itemAction
定义需要的绘制事件。 这将是以下一个或多个:
- 在绘制时,ODA_DRAWENTIRE 此位设置整个。
- 当控件获取或失去输入焦点时,ODA_FOCUS 此位设置。 itemState 成员都应检查以确定控件是否具有焦点。
- 只有选择状态更改时,ODA_SELECT 此位设置。 itemState 成员都应检查以确定新选定状态。

itemState
在当前绘制事件发生后,以指定项的可视状态。 也就是说,如果菜单项将显示为灰色,状态标志 ODS_GRAYED 将设置为。 状态标志如下所示:
- 如果菜单项将检查,ODS_CHECKED 此位设置。 此位在菜单仅使用。
- 如果项目中绘制为禁用,ODS_DISABLED此位设置。
- 如果项目输入焦点,ODS_FOCUS 此位设置。
- 如果该项目将显示为灰色,ODS_GRAYED 此位设置。 此位在菜单仅使用。
- 如果项的状态时,ODS_SELECTED 此位设置。
- ODS_COMBOBOXEDIT 绘制在选择字段发生 (编辑控件) 的 ownerdrawn 组合框。
- ODS_DEFAULT 该项目是默认项目。

hwndItem
为组合框中指定控件的窗口句柄,列表框和按钮。 指定包含菜单项的菜单 (HMENU) 的句柄。

hDC
标识设备上下文。 此设备上下文,当对控件时,中的绘制操作必须使用。

rcItem
一个矩形在定义要绘制的控件边界的 hDC 成员指定的设备上下文。 窗口将自动剪切所有者在组合框的设备上下文绘制,列表框的任何内容和按钮,但是,它不会剪裁菜单项。 在绘制菜单项时,所有者无法在 rcItem 成员定义的矩形边界外绘制。

itemData
对于组合框或列表框,此成员包含传递到列表框下列操作之一的值:
CComboBox::AddString
CComboBox::InsertString
CListBox::AddString
CListBox::InsertString
对于菜单,此成员包含传递到菜单下列操作之一的值:
CMenu::AppendMenu
CMenu::InsertMenu
CMenu::ModifyMenu

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、付费专栏及课程。

余额充值