我正在继承一个WTL组合框,我是所有者 - 绘制组合框的项目。该控件具有属性CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_OWNERDRAWVARIABLE
,我正在使用混合类COwnerDraw来实现DrawItem()和MeasureItem()。当下拉列表关闭时,项目将正确绘制。但是,当下拉列表启动时,组合框控件为空,并且不绘制项目。我做错了什么?
WTL类如下所示:
class CMyComboBox :
public CWindowImpl<CMyComboBox, CComboBox>,
public COwnerDraw<CMyComboBox>
{
public:
BEGIN_MSG_MAP_EX(CMyComboBox)
CHAIN_MSG_MAP(COwnerDraw<CMyComboBox>)
CHAIN_MSG_MAP_ALT(COwnerDraw<CMyComboBox>, 1)
END_MSG_MAP()
void DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDCHandle dc = lpDIS->hDC;
dc.FillSolidRect(&lpDIS->rcItem, lpDIS->itemID == 0 ?
RGB(255,0,0) : RGB(0,255,0));
}
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemWidth = 12;
lpMeasureItemStruct->itemHeight = 12;
}
};
该类用于对话框,并且是这样的子类:
m_cbMy.SubclassWindow(GetDlgItem(IDC_COMBO1));
m_cbMy.AddString(_T("Item 1"));
m_cbMy.AddString(_T("Item 2"));
将控制属性更改为CBS_OWNERDRAWFIXED
不会改变任何内容。
编辑: 感谢najmeddine的帮助,我发现我必须处理WM_PAINT以绘制实际的组合框,而不仅仅是下拉列表中的项目。不幸的是现在我还必须自己绘制组合框控件。有没有办法让GDI绘制边框并放箭头,以便我只需绘制控件的“内部”?
答案 0 :(得分:6)
要绘制组合框控件,您应该使用WM_PAINT处理程序中的主题API(在XP +中 - 您没有说明需要支持哪些Windows版本。)具体来说,使用DrawThemeBackground
,并传入其中一个CB_
values for iPartId。
您还需要使用buffered paint APIs来处理Vista上的过渡,这可能会使您的绘制处理程序复杂化 - 当自定义绘制组合框控件时,这个和其他绘图问题相当于explained here详情。我建议使用该论坛帖子作为实现此目的的主要参考。
答案 1 :(得分:0)
在DrawItem上,你用一些颜色填充矩形。但DrawText或类似的东西在哪里?
答案 2 :(得分:0)
要绘制comboBox控件(而不是列表),您还应该处理WM_PAINT
消息并在那里进行绘画。
DrawItem
事件仅绘制下拉列表及其项目。