Обработка контроля редактирования WinApi с помощью подкласса GLFW - PullRequest
0 голосов
/ 15 мая 2018

Я новичок в обработке 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.Это хорошо работает, я могу обрабатывать сообщения с этой кнопки и нажимать на нее.Но когда я создаю «edit control», он не реагирует на мои щелчки мышью и ключевые вводы.Что мне нужно сделать, чтобы это работало?Мой 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; 
}

1 Ответ

0 голосов
/ 17 мая 2018

Проблема в вашей процедуре WM_PAINT. Вы не позволяете WM_PAINT обрабатываться элементом управления.

Вы не дали возможности редактировать элемент управления отображением чего-либо. Подклассы означает: просто делай то, что необходимо. Позвольте остальному быть обработанным контролем. Также вызов DefWindowProc не подходит для создания подклассов. Вы должны использовать

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

Если этот windowproc используется для управления редактированием, мне интересно, что вы обрабатываете в нем сообщение WM_COMMAND. Сообщения WM_COMMAND не отправляются в элемент управления. Они отправляются в родительское окно. Также отсутствует перерыв.

Пожалуйста, прочитайте MSDN для получения более подробной информации .

Советы на будущее: Поскольку вы новичок в SO, пожалуйста, предлагайте как можно больше информации и кода, когда задаете вопрос.

...