【问题标题】:Applying Windows theme to custom control with WS_BORDER style将 Windows 主题应用于具有 WS_BORDER 样式的自定义控件
【发布时间】:2013-01-06 03:14:46
【问题描述】:

我有一个使用 WS_BORDER 样式的 CreateWindowEx 创建的自定义控件。除了与对话框中的其他控件以不同颜色显示的边框外,一切正常。我控件的边框是黑色的,其他控件的边框是蓝色的。创建控件后,我尝试调用 EnableThemeDialogTexture(_dialogHandle, ETDT_ENABLE) 以及来自http://www.patchou.com/projects/richedit/ 的逻辑,但无济于事。我正在使用 C++ 和 Winapi。 IE。没有 MFC,没有 .Net。非常感谢任何指导。

编辑:这是对我有用的逻辑:

HDC hdc = GetWindowDC(hwnd);
HTHEME themeHandle = OpenThemeData(hwnd, L"Edit");
if(themeHandle)
{
    int cxBorder = GetSystemMetrics(SM_CXBORDER);
    int cyBorder = GetSystemMetrics(SM_CYBORDER);
    RECT rc;
    GetClientRect(hwnd, &rc);                   
    OffsetRect(&rc, cxBorder, cyBorder);
    ExcludeClipRect(hdc, rc.left, rc.top, rc.right, rc.bottom);
    InflateRect(&rc, cxBorder, cyBorder);
    DrawThemeBackground(themeHandle, hdc, 0, 0, &rc, NULL);
    CloseThemeData(themeHandle);
 }

ReleaseDC(hwnd, hdc);

【问题讨论】:

    标签: c++ winapi themes createwindowex


    【解决方案1】:

    您必须自己绘制边框,使用来自另一个控件(例如,列表视图或树视图控件)的主题。对于自定义子控件,绘制边框非常简单——只需处理 WM_NCPAINT 消息即可。绘制边框时的part ID和state ID都应该是0。

    【讨论】:

    • 感谢您的回复。现在正在工作。我已经修改了上面的帖子以显示我正在使用的逻辑,以防万一它对其他人有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多