简单的winapi c GUI改变静态文本背景

时间:2014-01-13 20:57:23

标签: c windows winapi

我使用简单的winapi来创建一个GUI,我是这种语言的新手,并且正在努力解决许多人认为基本的问题。有人可以向我解释我如何更改静态文本的背景颜色,因为目前是透明的。我用于文本的代码是:

 hwndStatic = CreateWindow(TEXT("static"), TEXT(""), 
              WS_CHILD | WS_VISIBLE,
              10, 70, 90, 25, hwnd, NULL, g_hinst, NULL); 

2 个答案:

答案 0 :(得分:1)

通常,您可以通过处理WM_GETCTLCOLORSTATIC更改静态文本控件的绘图。

在该处理程序中,您可以更改DC的内容,例如文本颜色,背景模式,背景颜色,甚至是所选的字体。

您还可以返回GDI画笔的句柄(使用强制转换来获取类型系统)。控件将首先使用画笔擦除自身,然后绘制文本。

对于作为当前窗口的子项的所有静态控件,将进行回调,因此您首先要测试它是否是您关心的孩子。

例如:

case WM_CTLCOLORSTATIC:
  HWND hwnd = (HWND) lParam;
  if (hwnd == hwndStatic) {
    HDC hdc = (HDC) wParam;
    ::SetTextColor(hdc, RGB(0xFF, 0, 0));  // set the text to red
    ::SetBkMode(hdc, OPAQUE);
    ::SetBkColor(hdc, RGB(0x00, 0xFF, 0x00));  // set background to green
    HBRUSH hbrBackground = ::GetSysColorBrush(COLOR_WINDOW);  
    return (INT_PTR) hbrBackground;
  }
  return 0;

这显示了一些你可以做的事情。你可能不想做所有这些,但看到它们都在行动中可能很有教育意义。

请注意,如果您创建要返回的画笔,则必须跟踪它并稍后将其删除。我依靠GetSysColorBrush避免了这个问题。系统拥有这些,所以你不应该删除它们。您还可以将GetStockObject用于您不必管理的系统GDI对象。但是,如果您需要自定义颜色,则必须使用CreateSolidBrush然后将其清理干净。

答案 1 :(得分:0)

回复程序中的WM_CTLCOLORSTATIC消息,让它返回正确颜色的画笔对象。

我稍微修改了链接中的示例:

case WM_CTLCOLORSTATIC:
    {
        HWND hWnd = (HWND) lParam;
        if (hWnd == hMyStatic)
        {
            HBRUSH hbrBkgnd = CreateSolidBrush(RGB(0,0,0));
            return (INT_PTR)hbrBkgnd;
        }
        return 0;
    }