如何以编程方式设置静态控件背景颜色 [英] how can I set static controls background color programmatically

查看:37
本文介绍了如何以编程方式设置静态控件背景颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在函数内更改标签背景颜色,我尝试了这段代码,但在调用 changecolor 函数后没有任何改变

I want to change label background color within a function, I tried this code but nothing changed after calling changecolor function

HWND hWndLabel;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        hWndLabel = CreateWindowEx(WS_EX_TRANSPARENT,
            L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU,
            75, 75, 70, 70, hWnd, (HMENU)labelId, hInst, NULL);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    case WM_COMMAND:  // all events are handled here
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}

DWORD WINAPI changecolor(){
    HDC hdc = GetDC(hWndLabel); // get context
    SetBkColor(hdc, RGB(0, 0, 230)); // Code Copied from the above answer by cpx.
    return 0;
}

我读到静态控件在它们自己绘制之前会向它们的父级发送 WM_CTLCOLORSTATIC 消息.代码是在 CALLBACK 函数内实现的,但是在调用此代码的地方(更改颜色)?,我如何在函数内调用 SetTextColor

I read that Static controls send their parent a WM_CTLCOLORSTATIC message just before they paint themselves. code is implemented within CALLBACK function, but where this code is called (changing color)?, how can I call SetTextColor within a function

代码示例:

case WM_CTLCOLORSTATIC:
  if (the_button_was_clicked) {
    HDC hdc = reinterpret_cast<HDC>(wParam);
    SetTextColor(hdc, COLORREF(0xFF, 0x00, 0x00));
  }
  return ::GetSysColorBrush(COLOR_WINDOW);  // example color, adjust for your circumstance

推荐答案

尝试更像这样的事情:

HWND hWndLabel;
HBRUSH hBrushLabel;
COLORREF clrLabelText;
COLORREF clrLabelBkGnd;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
        hWndLabel = CreateWindowEx(0, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT,
            75, 75, 70, 70, hWnd, (HMENU)labelId, hInst, NULL);
        hBrushLabel = NULL;
        clrLabelText = GetSysColor(COLOR_WINDOWTEXT);
        clrLabelBkGnd = GetSysColor(COLOR_WINDOW);
        break;

    case WM_DESTROY:
        if (hBrushLabel) DeleteObject(hBrushLabel);
        PostQuitMessage(0);
        break;

    case WM_CTLCOLORSTATIC: {
        HDC hdc = reinterpret_cast<HDC>(wParam);
        SetTextColor(hdc, clrLabelText);
        SetBkColor(hdc, clrLabelBkGnd);
        if (!hBrushLabel) hBrushLabel = CreateSolidBrush(clrLabelBkGnd);
        return reinterpret_cast<LRESULT>(hBrushLabel);
    }

    case WM_COMMAND:  // all events are handled here
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }
    return 0;
}

DWORD WINAPI changecolor()
{
    if (hBrushLabel) {
        DeleteObject(hBrushLabel);
        hBrushLabel = NULL;
    }
    clrLabelText = RGB(0xFF, 0x00, 0x00);
    clrLabelBkGnd = RGB(0, 0, 230);
    InvalidateRect(hWndLabel, NULL, TRUE);
    return 0;
}

WM_CTLCOLORSTATIC 文档.

以下 C++ 示例显示了如何设置静态控件的文本前景色和背景色以响应 WM_CTLCOLORSTATIC 消息.hbrBkgnd 变量是初始化为 NULL 的静态 HBRUSH 变量,并在调用 WM_CTLCOLORSTATIC 之间存储背景画笔.当不再需要画笔时,必须通过调用 DeleteObject 函数来销毁画笔,通常是在销毁关联的对话框时.

The following C++ example shows how to set the text foreground and background colors of a static control in response to the WM_CTLCOLORSTATIC message. The hbrBkgnd variable is a static HBRUSH variable that is initialized to NULL, and stores the background brush between calls to WM_CTLCOLORSTATIC. The brush must be destroyed by a call to the DeleteObject function when it is no longer needed, typically when the associated dialog box is destroyed.

case WM_CTLCOLORSTATIC:
    {
    HDC hdcStatic = (HDC) wParam;
    SetTextColor(hdcStatic, RGB(255,255,255));
    SetBkColor(hdcStatic, RGB(0,0,0));

    if (hbrBkgnd == NULL)
    {
        hbrBkgnd = CreateSolidBrush(RGB(0,0,0));
    }
    return (INT_PTR)hbrBkgnd;
    }

这篇关于如何以编程方式设置静态控件背景颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆