为什么我的所有者绘制的组合框显示为空?

viv*_*dos 4 user-interface winapi combobox wtl ownerdrawn

我正在继承一个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;
   }
};
Run Code Online (Sandbox Code Playgroud)

该类用于对话框,并且是这样的子类:

   m_cbMy.SubclassWindow(GetDlgItem(IDC_COMBO1));
   m_cbMy.AddString(_T("Item 1"));
   m_cbMy.AddString(_T("Item 2"));
Run Code Online (Sandbox Code Playgroud)

将控件属性更改为CBS_OWNERDRAWFIXED不会更改任何内容.


编辑:感谢najmeddine的帮助,我发现我必须处理WM_PAINT以绘制实际的组合框,而不仅仅是下拉列表中的项目.不幸的是现在我还必须自己绘制组合框控件.有没有办法让GDI绘制边框并放箭头,这样我只需要绘制控件的"内部"?

Dav*_*vid 6

要绘制ComboBox控件,你应该在你的WM_PAINT处理程序使用的主题的API(在XP + -你不说你需要支持什么样的Windows版本.)具体来说,使用DrawThemeBackground,并传递一个CB_对iPartId值.

您还需要使用缓冲的绘制API来处理Vista上的过渡,这会使您的绘制处理程序复杂化 - 在此处以相当详细的方式解释自定义绘制组合框控件时的此问题和其他绘制问题.我建议使用该论坛帖子作为实现此功能的主要参考.