c-访问不同开关情况下的变量(从WinApi中的WM_CREATE到WM_CTLCOLORSTATIC)



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

问题是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);
}

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

static HWND hwndConnection(NULL);

如果你有妄想症,你可能想检查一下你的case WM_CTLCOLORSTATIC:,如果它已经设置好了。然而,我不知道你怎么能在WM_CREATE之前得到WM_CTLCOLORSTATIC。。。

这个代码对我有效:

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

您的问题是,即使将hWndConnection移出switch,使其在两个case分支的作用域中,它也只在WM_CREATE分支中初始化(并且WM_CTLCOLORSTATIC只在对窗口过程的完全不同的调用中进行(。但是,您可以使用GetDlgItem()函数来获取子窗口的句柄,在本例中为:

case WM_CTLCOLORSTATIC:
hWndConnection = GetDlgItem(hWnd, 1); // 1 is the ID that was assigned as part of the CreateWindow call
hdc = GetDC(hWndConnection);
...
ReleaseDC(hdc);
break;

最新更新