更改 SysLink 控件的颜色

Posted

技术标签:

【中文标题】更改 SysLink 控件的颜色【英文标题】:Change color of SysLink control 【发布时间】:2015-12-01 22:41:55 【问题描述】:

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

我想在插件的 UI 中显示一个 html 链接,以便用户从网络下载插件的新版本。 SysLink control 似乎可以胜任。

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

不幸的是,现在 SysLink 控件的文本总是以蓝色绘制,这与 3ds Max 的深色主题效果不太好。而且,看起来我不能向 3ds Max 询问它的调色板。

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

【问题讨论】:

整个 UI 以定制的方式设计。 Windows 用于控制外观的方法无济于事,因为 3ds 正在绘画。我认为这意味着您需要使用 3ds 知道如何设置样式的控件。看起来它无法识别系统链接。切换到 3ds 知道的控件。 问题是,虽然按钮和文本编辑控件是自定义 3ds Max 控​​件,但所有静态标签都是普通的 Windows 控件。令人气愤的是,SysLink 看起来不错并且可以按预期工作,但在使用深色主题时却无法以可读的颜色显示。 虽然它们可能是 Windows 控件,但似乎 3ds 正在绘制它们 另一方面,也许 LIS_DEFAULTCOLOR 是您需要的。然后你更大的问题是你找不到 3ds 的调色板......他们真的用愚蠢的造型把你卖掉了。 在这一点上,如果我能改变 SysLink 的颜色,我会很高兴的。现在父窗口似乎没有收到WM_CTLCOLORSTATIC 事件。 【参考方案1】:

编辑:

这是系统链接控件默认的样子:

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

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


使用WM_CTLCOLORSTATIC,但你必须告诉系统链接控件接受颜色变化:

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;
    
    ...    
    
...

【讨论】:

感谢您的回答。我尝试了您的代码,但由于某种原因,我的消息循环没有收到任何 WM_CTLCOLORSTATIC 事件。仍在调查中。 According to MSDN, WM_CTLCOLORSTATIC 仅用于静态或编辑控件。 SysLink 是否属于该类别? 如何让 SysLink 控件使用与其他静态标签相同的颜色? 再想一想,syslink 控件的静态部分应该与其他静态标签具有相同的颜色控件(即使您没有进行我建议的任何更改)。背景似乎是正确的颜色。也许WM_CTLCOLORSTATIC 在不同的地方处理。在一个简单的窗口或对话框中,您应该能够捕捉到WM_CTLCOLORSTATIC 感谢@Barmak 的详细回答。我假设您的代码可以在正常的 Win32 环境中运行;不幸的是,它不在 3ds Max 中。我将此答案标记为已接受,因为它确实很好地回答了这个问题,并且可能对其他人有所帮助。再次感谢。

以上是关于更改 SysLink 控件的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 MFC SysLink 控件的字体

添加 syslink 不显示 mfc 对话框

无法在 C++ Win32 中将 URL 或 ID 设置为 SysLink

cnpm install时提示resource busy or locked,syslink...

基于OMPAL138 +FPGA异构多核运动控制器的设计

基于OMAPL:Linux3.3内核的编译