首页 > 解决方案 > 使用 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; 
}

标签: winapiglfw

解决方案


问题是您的 WM_PAINT 例程。您不要让 WM_PAINT 由编辑控件处理。

您没有给编辑控件显示任何内容的机会。子类化意味着:只做必要的事情。让其余的由控件处理。对于子类化,调用DefWindowProc也是错误的。你必须使用

 return CallWindowProc(wndprocOrig, hwnd, wm, wParam, lParam);

如果此 windowproc 用于编辑控件,我想知道您在其中处理 WM_COMMAND 消息。WM_COMMAND 消息不会发送到控件。它们被发送到父窗口。还有一个休息缺失。

请阅读MSDN 了解更多详情

对未来的建议:由于您是 SO 新手,请在提问时提供尽可能多的信息和代码。


推荐阅读