c - 从不同的 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);
}
解决方案
另一种方法是声明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;
推荐阅读
- spring-statemachine - 有人可以添加一种从状态机中检索错误的方法吗?
- django - NOT NULL 约束失败:- Django:IntegrityError
- c - 编译共享库,但其他链接器不起作用
- arrays - CharacterSet.contains() 方法中的奇怪行为,高 UTF8 字符与 ASCII 混合
- apache-spark - 使用 pyspark 将 StructType、ArrayType 转换/转换为 StringType(单值)
- java - 如何解决 MyBatis selectForUpdate 中的 indexOutOfBounds 错误?
- macos - Micronaut 使用 sdkman 安装,加入 micronaut 命令行权限被拒绝
- c# - 使用来自 web 服务响应的 c# lambda 表达式访问名称和标记
- javascript - 如何使用 JavaScript 更改 CSS 背景颜色?
- angular - Spring security addCorsMappings 没有效果