C++ 带有C+的静态控制背景色+;

C++ 带有C+的静态控制背景色+;,c++,winapi,controls,static,background-color,C++,Winapi,Controls,Static,Background Color,我正在用WindowsAPI创建一个基本的GUI,我遇到了一个问题。它从一个主窗口开始,该窗口以我设置的自定义背景色(RGB(230230))打开。然后在左上角使用静态控件显示文本 settingstext = CreateWindow("STATIC", "SETTINGS", SS_LEFT | WS_CHILD, 12

我正在用WindowsAPI创建一个基本的GUI,我遇到了一个问题。它从一个主窗口开始,该窗口以我设置的自定义背景色(RGB(230230))打开。然后在左上角使用静态控件显示文本

settingstext = CreateWindow("STATIC",
                             "SETTINGS",
                             SS_LEFT | WS_CHILD,
                             12,
                             20,
                             100,
                             20,
                             hwnd,
                             NULL,
                             proginstance,
                             NULL);
ShowWindow(settingstext, 1);
这是可行的,但当文本显示时,我需要一种方法来改变它的背景以匹配主窗口,否则它看起来就好像没有融入其中

我的问题是,我该怎么做?我目前使用下面的方法,它可以工作,但我想知道,有没有一种方法可以在静态控件的
CreateWindow
函数之后,在不更改系统颜色的情况下,以某种方式永久设置背景色,只需将其应用于一个控件,而不是发送
WM\u CTLCOLORSTATIC
消息的任何东西。我尝试过在消息循环之外使用
GetDC
函数和
SetBkColor
函数,但没有任何效果

    case WM_CTLCOLORSTATIC:
    {
    HDC hdcStatic = (HDC) wParam;
    SetTextColor(hdcStatic, RGB(0,0,0));
    SetBkColor(hdcStatic, RGB(230,230,230));
    return (INT_PTR)CreateSolidBrush(RGB(230,230,230));
    }
我想这样做是因为

  • 我不想用每次窗口重新绘制时都需要调用的函数来填充消息循环
  • 使更改仅应用于此静态控件

我非常感谢能提供的任何帮助,至少为我指明了正确的方向,谢谢。

你考虑过将静态窗口子类化并进行所有者绘制吗?

对于静态文本控件,没有固定的方法来设置文本颜色或其背景。即使要将更改应用于单个静态控件;在控件即将绘制时,您仍然需要在父dlgproc中处理WM_CTLCOLORSTATIC通知消息

这是由于
DefWindowProc
在每次处理
WM\u CTLCOLORSTATIC
时都会覆盖对设备上下文的更改,如下所述:

默认情况下,DefWindowProc函数为静态控件选择默认系统颜色

settingstext = CreateWindow("STATIC",
                             "SETTINGS",
                             SS_LEFT | WS_CHILD,
                             12,
                             20,
                             100,
                             20,
                             hwnd,
                             NULL,
                             proginstance,
                             NULL);
ShowWindow(settingstext, 1);

如果您希望使控件的背景在父对话框上透明,您可以使用
SetBkMode(hdcStatic,transparent)

我认为有一种永久的方法可以做到这一点

创建标签后,使用GetDC()函数获取设备上下文。 然后使用:

SetTextColor(hdcStatic, RGB(0,0,0));
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx.

这应该可以。

我不知道这是什么,所以我将对子类化进行一些快速研究。基本上,这意味着您将消息发送到静态控件,而不是发送到您的代码(不要忘记将您没有处理的消息传递给原始处理程序)。如果您处理背景擦除和绘制消息,那么您可以让窗口显示您想要的任何内容。因此,这将使它只发生在单个控件上,是否还有一种方法可以减少我为该控件创建的自定义过程中的函数数。基本上,我对整个“过程中没有太多函数”的理解是,每次必须重新绘制时,应用程序执行这些函数的速度似乎会减慢,或者这真的没什么大不了的?不会变慢,因为绘制例程将替换当前的例程(无论如何都要粉刷)。此外,您没有为每个子类控件编写绘制例程。您可以使用相同的WndProc对多个窗口进行子类化。我一直都在这样做。但是,对于您所需要的内容来说,这可能有些过分。我不完全确定。您可以通过检查
WM\u CTLCOLORSTATIC
代码将
的效果限制为仅对静态控件有效(HWND)lParam==settingstext
。您的示例存在一个问题,即您创建的所有画笔都不会被删除。如果您已经调用了
SetBkColor
,您能否解释一下为什么需要为背景创建
hBrush
?如果背景是透明的,您还需要透明画笔吗?这不起作用因为
DefWindowProc
每次处理控件的
WM_CTLCOLORSTATIC
消息时都会将这些更改重置为设备上下文:“默认情况下,DefWindowProc函数为静态控件选择默认系统颜色。”