winapi - 使用 GLFW 的子类处理 WinApi 编辑控件
问题描述
我是winapi处理和opengl渲染的新手。我尝试使用 GLFW 窗口来渲染我的图形并处理来自 WinApi 窗口的消息。为了处理来自 winapi 的消息,我创建了 GLFW 窗口的子类并替换 wndproc 函数,如下所示:
window = glfwCreateWindow(WIDTH, HEIGHT, "Window", nullptr, nullptr);
GLWINDOW = window;
HWND hWnd = glfwGetWin32Window(window);
SetParent(hWnd, mainWindow);
LONG nNewStyle = GetWindowLong(hWnd, GWL_STYLE) & ~WS_POPUP | WS_CHILDWINDOW;
SetWindowLong(hWnd, GWL_STYLE, nNewStyle);
ULONG_PTR cNewStyle = GetClassLongPtr(hWnd, GCL_STYLE) | CS_DBLCLKS;
SetClassLongPtr(hWnd, GCL_STYLE, cNewStyle);
SetWindowSubclass(hWnd, &msgProc, 0, 0);
glfwShowWindow(window);
然后我创建我的按钮和 wndproc 函数。效果很好,我可以处理来自此按钮的消息并单击它。但是当我创建“编辑控件”时,它不会对我的鼠标点击和按键输入做出反应。我需要做什么才能使其工作?我的 wndproc:
LRESULT CALLBACK msgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
PAINTSTRUCT PS;
switch(message)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
BeginPaint(hWnd, &PS);
EndPaint(hWnd, &PS);
break;
case WM_COMMAND:
if(LOWORD(wParam)==1)
glEnabled = true;
if(LOWORD(wParam)==2)
{
printf("system: application terminated \n");
terminate = true;
}
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
解决方案
问题是您的 WM_PAINT 例程。您不要让 WM_PAINT 由编辑控件处理。
您没有给编辑控件显示任何内容的机会。子类化意味着:只做必要的事情。让其余的由控件处理。对于子类化,调用DefWindowProc
也是错误的。你必须使用
return CallWindowProc(wndprocOrig, hwnd, wm, wParam, lParam);
如果此 windowproc 用于编辑控件,我想知道您在其中处理 WM_COMMAND 消息。WM_COMMAND 消息不会发送到控件。它们被发送到父窗口。还有一个休息缺失。
请阅读MSDN 了解更多详情。
对未来的建议:由于您是 SO 新手,请在提问时提供尽可能多的信息和代码。
推荐阅读
- python-3.x - 在没有 python 的情况下将 py2app 应用程序发送到 Mac
- java - 无法使用 JsonPath 库获取带空格的键值
- c# - Windows 失去焦点后 IStylusSyncPlugin 未接收数据
- java - Java 日期和时间从给定日期“2019-12-03T10:00:00-06:00”中删除时区,预计日期为“2019-12-03T10:00:00”
- python - Django Rest Framework:序列化程序方法字段的总和
- yocto - Yocto:检查 MACHINE_FEATURES 的最终内容
- ios - 错误类型错误:null 不是对象(评估“this._icon.imageSource.ios”)
- python - iOS+GoogleChrome 上的“内容处置”[Google App Engine 上的 Flask]
- mysql - 数据库中的嵌套表
- oracle - 试图通过logstash从oracle数据库中获取数据,但数据没有进入elasticsearch