【问题标题】:UXTheme: Draw Combobox Chevron Without BorderUXTheme:绘制无边界组合框雪佛龙
【发布时间】: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


【解决方案1】:

您是否尝试将 CP_DROPDOWNBUTTON 替换为 CP_DROPDOWNBUTTONRIGHT

【讨论】:

  • CP_DROPDOWNBUTTONRIGHT 具有正确的对齐方式,但没有下拉菜单的 CP_READONLY 样式。
  • CP_DROPDOWNBUTTON 不包括 CP_READONLY 如果我可以说,所以如果 CP_DROPDOWNBUTTON 具有 CP_READONLY 样式,这是因为这是在其他地方指定的(主题?),只需对 CP_DROPDOWNBUTTONRIGHT 执行相同操作
  • "对 CP_DROPDOWNBUTTONRIGHT 做同样的事情" - 这包括一个边框,因此给出了第二个图像,看起来像一个拆分按钮
【解决方案2】:

作为一种解决方法,您可以使用 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);

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 2014-10-08
    • 1970-01-01
    • 2019-10-30
    • 2015-02-14
    • 2023-03-28
    • 2021-11-23
    • 2014-08-05
    相关资源
    最近更新 更多