更改 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 控件的颜色的主要内容,如果未能解决你的问题,请参考以下文章
无法在 C++ Win32 中将 URL 或 ID 设置为 SysLink