我是一个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绘制边框并放下箭头,这样我只需要绘制控件的“内侧”?
我想要做同样的事情,混合成功(目前使用DrawThemeBackground)。你能找到一个可靠的解决方案来绘制下拉箭头吗? – phimuemue 2017-11-13 12:00:13
我没有实现David M的建议,只处理了WM_PAINT消息来自己绘制组合框。 – vividos 2017-11-13 15:44:37