3

我正在尝试绘制一个应该使用“组合框”主题类的自定义控件。

使用

m_hTheme = OpenThemeData(m_hWnd, _T("COMBOBOX"));
auto stateBG = ...; // depends on window state
DrawThemeBackground(m_hTheme, ps.hdc, CP_READONLY, stateBG, &clientRect, nullptr);

给出正确的背景(只读外观),没有 V 形。但是如何添加雪佛龙?

auto stateCV = ...; // depends on window state
DrawThemeBackground(m_hTheme, ps.hdc, CP_DROPDOWNBUTTON, stateCV, &rect, nullptr);

正确绘制雪佛龙,但有自己的边框,雪佛龙位于rect. 因此,如果我使用完整的客户端矩形,我会得到:

组合框居中的雪佛龙

如果我使用较小的矩形以便正确定位人字形,我会得到一个单独的下拉列表:

组合框盒装雪佛龙

我如何获得“正常”的外观?- 即像这样:

在此处输入图像描述


奖金问题:

有没有比 MSDN 做得更好的文档?它与大多数较新的文档一样稀疏,例如仅列出“部件和状态”,而没有描述它们的目的(这并不总是很明显),以及它是针对特定项目DrawThemeBackground还是〜 。Edge

我仍然使用旧DrawFocusRect的焦点矩形吗?

GetThemeBackgroundContentRect计算 的预期矩形iPartId=CP_READONLY,但对于iPartId=CP_CUEBANNER,它返回完整的客户矩形,因此提示文本对齐错误。这……正常吗?

4

2 回答 2

1

您是否尝试过用CP_DROPDOWNBUTTONRIGHT替换CP_DROPDOWNBUTTON

于 2020-12-05T10:38:57.940 回答
0

作为一种解决方法,您可以使用 DrawThemeBackground 的 ClipRect 来切断下拉按钮的左边缘。

CRect clip_rect = rect;
clip_rect.DeflateRect(1, 0, 0, 0);
auto stateCV = ...; // depends on window state
DrawThemeBackground(m_hTheme, ps.hdc, CP_DROPDOWNBUTTON, stateCV, &rect, &clip_rect);
于 2021-11-23T11:21:34.017 回答