【问题标题】:Setting title bar and border colors programmatically以编程方式设置标题栏和边框颜色
【发布时间】:2015-11-25 10:23:39
【问题描述】:

我正在尝试以编程方式更改我的应用程序的标题栏和边框颜色。我尝试了很多东西但没有成功,并决定在系统范围内更改这些颜色。因为我也可以在我的应用程序运行时更改标题栏和边框颜色,并在我的应用程序结束时恢复它们。 (托管环境,运行少量应用程序)

是否可以动态更改这些颜色(进程范围或系统范围,除非可以进行进程范围更改)?您能提出任何实现这一目标的方法吗?

我尝试了以下类似的方法,但没有达到我想要的效果:

int aElements[2] = {COLOR_WINDOW, COLOR_ACTIVECAPTION};
DWORD aOldColors[2];
DWORD aNewColors[2];

aOldColors[0] = GetSysColor(aElements[0]); 
aOldColors[1] = GetSysColor(aElements[1]); 
aNewColors[0] = RGB(0x80, 0x80, 0x80);  // light gray 
aNewColors[1] = RGB(0x80, 0x00, 0x80);  // dark purple 

SetSysColors(2, aElements, aNewColors);
SetSysColors(2, aElements, aOldColors);

提前致谢

编辑

这正是我想要的:

【问题讨论】:

标签: c++ windows winapi hook


【解决方案1】:

我知道您使用的是 C++,但我很擅长使用 C#。为了让您有所了解,请看下面的代码,它修改了表单外观。

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("User32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    const int WM_NCPAINT = 0x85;
    if (m.Msg == WM_NCPAINT)
    {
        IntPtr hdc = GetWindowDC(m.HWnd);
        if ((int)hdc != 0)
        {
            Graphics g = Graphics.FromHdc(hdc);
            g.FillRectangle(Brushes.Green, new Rectangle(0, 0, 4800, 23));
            g.Flush();
            ReleaseDC(m.HWnd, hdc);
        }
    }
}

另外,您可以使用 CodePlex 的 Drawing Custom Borders in Windows Forms 项目。该项目是一个小型库,允许用户自定义 Windows 窗体,例如自定义窗口的非客户区。

【讨论】:

  • 你能解释一下为什么这个答案没有用吗?我清楚地提到,从这个代码块中你可以得到一些想法。
  • 如果此建议有帮助,请标记为答案。
  • 免责声明:我没有投票。但是,我认为这个答案被殴打的原因包括 (a) 没有返回值。 (b) 在绘制之前调用 DefWindowProc 的大致等效项 - 这不会遮挡按钮吗? (c) 不引用通过 WM_NCPAINT 传递的 HRGN (d) 使用硬编码的矩形大小值来绘制(并且还在客户端上绘制area) (e) 代码确实与C++ 代码非常不同,GDI+ Graphics 类的使用几乎是唯一的共同点。 (f) 似乎是为您争取代表点数,而不是为 OP 提供答案。
  • 这段代码在 Win8.1 中没有任何作用。我在互联网上看到了这种方法并尝试了这种方法,但是桌面窗口管理器不允许这种代码对窗口标题或边框(实际上是任何非客户区对象)进行任何更改,我相信这不会在运行 Vista 或更高版本的系统上执行任何操作
  • 这个答案只是给一些想法重新调整自定义表单标题栏。请再次查看geekswithblogs.net/kobush/articles/CustomBorderForms.aspx 我对 C++ 不太方便,所以分享其他语言示例。
【解决方案2】:

移除第二个 SetSysColors(2, aElements, aOldColors);代码行,它恢复到原来的颜色,然后再试一次。您拥有的代码示例似乎与 MSDN 链接 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx 链接减去睡眠几乎相同。他们的示例展示了如何设置颜色、休眠然后恢复。

【讨论】:

    【解决方案3】:

    我不建议自定义边框和标题重绘。 以正确的方式做到这一点真的很难。 Office 只是在客户区域中自行绘制所有内容,但使用正常边框。 以正确的方式使用 NC_PAINT 会很痛苦,并且可能会导致闪烁。 尤其是最小化、最大化和关闭按钮的定位很困难,因为每个窗口的做法都不一样。 还要考虑可访问性、使用的较大字体、自定义用户设置。

    改变颜色的目的是什么?

    要更改全局颜色,您至少必须分离代码

    // 在应用程序启动时调用一次(例如在 WM_CREATE 中)

    SetSysColors(2, aElements, aNewColors); 
    

    // 在关闭应用程序时调用它(例如在 WM_DESTROY 中)

    SetSysColors(2, aElements, aOldColors); 
    

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多