【问题标题】:How do I set the text and background color of an single static control c++?如何设置单个静态控件 C++ 的文本和背景颜色?
【发布时间】:2018-07-18 00:05:03
【问题描述】:

标题是我的问题。我设法设置了静态和编辑的颜色 当我将它们全部设置为相同颜色时进行控制,但我不知道如何 只设置一个颜色而不影响其他颜色。我在互联网上环顾四周,但我发现的东西都不是关于如何设置一个颜色的 静态或编辑控件。这是我目前用来设置所有静态文本字段颜色的代码:

#include <windows.h>

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

HWND staticTextField, staticTextFieldTwo;

char szClassName[ ] = "WindowsApp";

int WINAPI WinMain(HINSTANCE hThisInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR lpszArgument,
                   int nFunsterStil)

{
    HWND hwnd;
    MSG messages;
    WNDCLASSEX wincl;

    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS; 
    wincl.cbSize = sizeof (WNDCLASSEX);

    wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    wincl.hbrBackground = CreateSolidBrush(RGB(0, 255, 255));

    if (!RegisterClassEx (&wincl))
        return 0;

    hwnd = CreateWindowEx (
       0,
       szClassName,
       "Windows app",
       WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       544,
       375,
       HWND_DESKTOP,
       NULL,
       hThisInstance,
       NULL
    );

    ShowWindow (hwnd, nFunsterStil);

    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }

    return messages.wParam;
}


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
    HDC hdcStatic = (HDC)wParam;

switch (message)
{
    case WM_DESTROY:
        PostQuitMessage (0);
        break;
    case WM_CREATE:

         staticTextField = CreateWindow("STATIC", "static 1", WS_VISIBLE 
         | WS_CHILD, 20, 20, 300, 25, hwnd, NULL, NULL, NULL);


         staticTextFieldTwo = CreateWindow("STATIC", "static2", WS_VISIBLE | 
         WS_CHILD | WS_BORDER, 100, 200, 300, 20, hwnd, NULL, NULL, NULL);

         break;
    case WM_CTLCOLORSTATIC:
        SetTextColor(hdcStatic, RGB(255, 0, 0));
        SetBkColor(hdcStatic, RGB(0, 255, 255));
        return (INT_PTR)CreateSolidBrush(RGB(0, 255, 255));
        break;
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
}

return 0;
}

任何帮助将不胜感激,我花了很长时间试图弄清楚我几乎放弃了! :-) 提前致谢。

【问题讨论】:

  • 您可以考虑使用 GUI 框架,例如 Qt、wxWidgets、FLTK 等。一般来说,这些比 Windows API 更容易使用,并且作为奖励,如果您打算在将来的某个时间这样做,移植到另一个操作系统会变得更加容易......

标签: c++ winapi


【解决方案1】:

响应WM_CTLCOLORSTATIC时,检查lParam,它持有控件的句柄。

CreateSolidBrush 创建一个 GDI 对象。应该用DeleteObject 删除它,否则会导致资源泄漏。您可以将画笔声明为static,并在最后将其删除。示例:

LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HBRUSH hbrush = NULL;
    switch(message)
    {
    case WM_DESTROY:
        if (hbrush) DeleteObject(hbrush);
        hbrush = NULL;
        PostQuitMessage(0);
        break;
    case WM_CREATE:
        staticTextField = CreateWindow("STATIC", "static 1", WS_VISIBLE
            | WS_CHILD, 20, 20, 300, 25, hwnd, NULL, NULL, NULL);
        staticTextFieldTwo = CreateWindow("STATIC", "static2", WS_VISIBLE |
            WS_CHILD | WS_BORDER, 100, 200, 300, 20, hwnd, NULL, NULL, NULL);
        break;
    case WM_CTLCOLORSTATIC:
    {
        HDC hdcStatic = (HDC)wParam;
        if(lParam == (LPARAM)staticTextFieldTwo)
        {
            SetTextColor(hdcStatic, RGB(0, 255, 0));
            SetBkColor(hdcStatic, RGB(0, 255, 255));
            if (!hbrush)
                hbrush = CreateSolidBrush(RGB(0, 255, 255));
            return (LRESULT)hbrush;
        }
        break;
    }
    default:
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

【讨论】:

  • @JonathanPotter 谢谢,已修复。
  • 当然,您对hbrush 的操作假定在任何时候只有一个窗口使用此窗口过程。即使这在具体代码中是正确的,解决方案也不好。正确总是将某些类与窗口相关联,hbrush 必须是类成员
  • @RbMm 你是对的。我再次对其进行了更改,以便它可以使用static 画笔与多个窗口一起使用。这假定静态画笔始终是相同的颜色。
  • @Barmak Shemirani 非常感谢!那行得通。只是想知道,我如何对按钮做同样的事情?
  • 你不能用按钮做到这一点。您可以使用 WM_CTLCOLORBTN 但这仅适用于 "owner draw" 按钮,它需要 BS_OWNERDRAW 标志。或者你可以使用 "custom draw" 方法。请参阅此问答link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2011-05-28
  • 2013-07-29
  • 2011-02-14
  • 2017-09-04
  • 2011-07-20
  • 1970-01-01
相关资源
最近更新 更多