【发布时间】:2021-03-11 07:44:21
【问题描述】:
我正在尝试绘制一个应该使用“组合框”主题类的自定义控件。
使用
m_hTheme = OpenThemeData(m_hWnd, _T("COMBOBOX"));
auto stateBG = ...; // depends on window state
DrawThemeBackground(m_hTheme, ps.hdc, CP_READONLY, stateBG, &clientRect, nullptr);
在没有 V 形的情况下提供正确的背景(只读外观)。但是如何添加 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,它返回完整的客户矩形,因此提示文本对齐错误。这……正常吗?
【问题讨论】:
标签: c++ windows winapi windows-themes uxtheme