我正在尝试更改正在制作的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;