2010-12-21 61 views
3

我正在用Windows API创建一个基本的GUI,并且遇到了问题。它以一个自定义背景色打开的主窗口开始,我设置了(RGB(230,230,230))。然后它会在静态控件的左上角显示文本。Static Control Background Color with C++

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

这工作,但会显示文字时,我需要一种方法来改变它的背景相匹配的主窗口,否则它只是看起来像它不混合。

我的问题是,我该怎么做?我目前使用下面的方法,它的工作原理,但我想知道,有没有办法永久设置背景颜色,在静态控制的CreateWindow函数之后,而不更改系统颜色,并且只适用于该方法控制,而不是任何发送消息的东西。我尝试过在消息循环之外使用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)); 
    } 

我想这样做,因为...

  • 我不想填补我的消息循环与需要被调用每一个窗口重新绘制时间的函数。
  • 这些更改仅适用于此静态控件。

我会非常感谢任何可以提供的帮助,至少指出我在正确的方向,谢谢。

+1

您可以通过检查'(HWND)lParam == settingstext'来限制'WM_CTLCOLORSTATIC'代码对静态控制的影响。 你的例子存在一个问题,那就是你创建的所有笔刷都不会被删除。 – 2010-12-21 01:45:59

回答

10

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

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230)); 

case WM_CTLCOLORSTATIC: 
{ 
    if (settingstext == (HWND)lParam) 

       //OR if the handle is unavailable to you, get ctrl ID 

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID 
    if (CtrlID == IDC_STATIC1) //If desired control 
    { 
     HDC hdcStatic = (HDC) wParam; 
     SetTextColor(hdcStatic, RGB(0,0,0)); 
     SetBkColor(hdcStatic, RGB(230,230,230)); 
     return (INT_PTR)hBrush; 
    } 
} 

如果你正在寻找使控制的背景透明了,你可以使用SetBkMode(hdcStatic, TRANSPARENT)父对话框。

+1

如果你已经调用过SetBkColor,你能解释为什么你需要为背景创建'hBrush'吗?而在透明背景的情况下,你是否还需要透明的画笔? – Ameen 2015-12-05 15:26:56

1

你有没有考虑继承静态窗口并做所有者绘制?

+0

我不知道这是什么,所以我会做一些快速研究的子类。 – contrapsych 2010-12-21 01:28:03

+0

基本上,它意味着你有消息发送到静态控制,而不是去你的代码(不要忘记把那些你不处理的原始处理程序)。如果你处理后台擦除和绘制消息,那么你可以让窗口显示任何你想要的。 – 2010-12-21 01:30:21

+0

因此,这将使它只发生在单一控件上,是否还有一种方法可以减少我为该控件制作的自定义过程中的函数数量。基本上,我对整个“程序中不是很多功能”的看法是,它似乎会减慢应用程序在每次必须重新绘制时不得不执行这些功能,或者这不是什么大问题? – contrapsych 2010-12-21 01:43:32

1

我认为有一个永久性的方法来做到这一点。

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

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

它应该这样做。