gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:25:45 26 4
gpt4 key购买 nike

我正在继承 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 绘制边框和下拉箭头,以便我只需要绘制控件的“内部”?

最佳答案

要绘制组合框控件,您应该使用 WM_PAINT 处理程序中的主题 API(在 XP+ 中 - 您没有说明您需要支持哪些 Windows 版本。)具体来说,使用 DrawThemeBackground ,并传入 CB_ values for iPartId 之一.

您还需要使用 buffered paint APIs在 Vista 上处理过渡,这会使您的绘制处理程序复杂化 - 自定义绘制组合框控件时的此和其他绘制问题是 explained here相当详细。我建议使用该论坛主题作为您实现此功能的主要引用。

关于user-interface - 为什么我的所有者绘制的组合框显示为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1658620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com