首页 > 解决方案 > 从不同的 switch case 访问变量(从 WinApi 中的 WM_CREATE 到 WM_CTLCOLORSTATIC)

问题描述

我正在尝试更改我正在制作的 WinApi 窗口中标签的颜色。我hwndConnection从我的 switch 语句CreateWindowW()WM_CREATE一部分中获取 , 并尝试将它传递给我的语句hdcConnection()WM_CTLCOLORSTATIC一部分。

问题在于它hwndConnection是未初始化的,因为它不能从 switch 语句传递到 switch 语句。因此,我不知道应该如何在两者之间发送它。

我试着用谷歌搜索答案。我发现了这个,这并没有真正帮助我。接受的答案建议CreateWindowW()移出WM_CREATE(无论如何我都是这样解释的),这不会导致编译器错误,而是冻结屏幕。第二个使用类,以及一些我以前从未见过的奇怪语法(我公开承认我不懂 C++)。

这是我的代码的精简版本(我只是WndProc为了保持简洁,但如果需要我可以包括其余部分)

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
    WPARAM wParam, LPARAM lParam) {

    HWND hwndConnection;
    HDC hdcConnection;

    switch (msg) {

    case WM_CREATE:

        hwndConnection = CreateWindowW(L"Static", L"Not Connected", WS_CHILD | WS_VISIBLE | SS_LEFT, 260, 0, 100, 20, hwnd, (HMENU)1, NULL, NULL);

        break;

    case WM_CTLCOLORSTATIC: 
        hdcConnection = GetDC(hwndConnection);  // Uninitialised local variable 'hwndConnection' used
        SetBkColor(hdcConnection, RGB(255, 0, 0));
        return (LRESULT)GetStockObject(NULL_BRUSH);
        break;


    case WM_COMMAND:
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    }
    return DefWindowProcW(hwnd, msg, wParam, lParam);
}

标签: cwinapiswitch-statement

解决方案


另一种方法是声明hwndConnection静态:

static HWND hwndConnection(NULL);

如果你是偏执狂,你可能想检查一下case WM_CTLCOLORSTATIC:它是否已经设置好了。WM_CTLCOLORSTATIC但是,我看不到您之前如何获得WM_CREATE...

这段代码对我有用:

case WM_CTLCOLORSTATIC:
  if ((HWND)lParam == hwndConnection)
  {
    HDC hdcStatic = (HDC)wParam;
    SetBkColor(hdcStatic, RGB(255, 0, 0));
    return (LRESULT)GetStockObject(NULL_BRUSH);
  }
  break;

推荐阅读