2009-11-01 40 views
4

我是一个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

我想要做同样的事情,混合成功(目前使用DrawThemeBackground)。你能找到一个可靠的解决方案来绘制下拉箭头吗? – phimuemue 2017-11-13 12:00:13

+1

我没有实现David M的建议,只处理了WM_PAINT消息来自己绘制组合框。 – vividos 2017-11-13 15:44:37

回答

6

来绘制ComboBox控件,您应该使用在你的WM_PAINT处理主题的API(在XP + - 你不说你需要支持什么样的Windows版本。)具体来说,使用DrawThemeBackground,并通过在CB_ values for iPartId之一。

您还需要使用buffered paint APIs来处理Vista上的转换,这可能会使绘制处理程序变得复杂 - 当自定义绘制组合框控件的详细程度为explained here时,此问题和其他绘图问题。我建议使用该论坛主题作为实现这一点的主要参考。

+0

供将来参考:DrawThemeBackground提供了各种部件来绘制,其中包括'CP_READONLY'(从我所看到的,对应于'CBS_DROPDOWNLIST')。不幸的是,'CP_READONLY'不包含下拉箭头。但是仍然有'CP_DROPDOWNBUTTONRIGHT',但是这反过来不仅是箭头,而且包含一个边框,所以它不能立即用于'CP_READONLY'(请参阅https://stackoverflow.com/questions/47199120/)。画为主题,组合框式窗口?noredirect = 1个#comment81352380_47199120)。 – phimuemue 2017-11-21 09:24:22

0

在DrawItem上填充一些颜色的矩形。但是DrawText或类似的东西在哪里?

Example of custom DrawItem

+0

这是我的自定义绘图,填写矩形。无需输出文字。 – vividos 2009-11-09 12:09:09

0

要绘制comboBox控件(不是列表),您还应该处理WM_PAINT消息并在那里绘画。
DrawItem事件只绘制下拉列表及其项目。

+0

将尝试... – vividos 2009-11-10 19:49:21

相关问题