更改 SysLink 控件的颜色

Fra*_*une 5 c++ winapi native hyperlink

我正在为Autodesk 3ds Max编写一个插件,这是一个原生的、仅限 Windows 的应用程序。该插件是用 C++ 编写的,并使用原始的 Win32 API 来构建其用户界面,就像 3ds Max 插件应该做的那样。

我想在插件的 UI 中显示一个 HTML 链接,让用户从网络下载插件的新版本。该SYSLINK控制似乎做的工作。

难点在于:3ds Max 用户界面的颜色是可配置的。我希望我的插件成为一个好公民,所以我需要 SysLink 控件使用与其他静态标签相同的颜色。

不幸的是,现在 SysLink 控件的文本总是以蓝色绘制,这在 3ds Max 的深色主题中效果不佳。此外,看起来我无法向 3ds Max 询问其调色板。

如何让 SysLink 控件使用与其他静态标签相同的颜色?

带有浅色主题的插件用户界面 带有深色主题的插件用户界面

Bar*_*ani 5

编辑:

默认情况下,系统链接控件应该是这样的:

系统链接控件

注意静态部分是黑色的(和静态控件一样)。只有链接部分是蓝色的。在您的情况下,所有内容始终为蓝色,背景颜色与对话框颜色相匹配。因此,应用程序已经进行了自定义更改。

如果有正常的消息处理,那么下面的代码应该将所有内容更改为红色:


使用WM_CTLCOLORSTATIC,但您必须告诉 syslink 控件接受颜色更改:

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {

    case WM_CTLCOLORSTATIC:
    {
        HDC hdc = (HDC)wp;
        SetTextColor(hdc, RGB(255, 0, 0));
        SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
        return (LRESULT)GetSysColorBrush(COLOR_BTNFACE);
    }

    case WM_INITDIALOG:
    {
        ...
        LITEM item = { 0 };
        item.iLink = 0;
        item.mask = LIF_ITEMINDEX | LIF_STATE;
        item.state = LIS_DEFAULTCOLORS;
        item.stateMask = LIS_DEFAULTCOLORS;
        SendMessage(hsyslink, LM_SETITEM, 0, (LPARAM)&item);
        ...
        return TRUE;
    }
    ...    
    }
...
}
Run Code Online (Sandbox Code Playgroud)