无法与Window交互

时间:2014-09-12 04:20:18

标签: winapi opengl

我创建了一个在Windows上运行的简单OpenGL渲染器。我没有创建窗口和设置渲染上下文的问题。窗口设置后会出现此问题。

我根本无法与Window交互。如果我将鼠标移到窗口的任何位置,我的光标将显示为加载光标。这是我用来创建Window的函数。为什么会这样?

bool BroGLWin::B_CreateWindow(int width, int height, int colorBits) {
if (!classRegistered) {
    WNDCLASS wc;

    memset(&wc, 0, sizeof(wc));

    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    wc.lpfnWndProc = (WNDPROC)wndproc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = sizeof(void*) + sizeof(int);
    wc.hInstance = GetModuleHandle(NULL);
    //wc.hIcon = LoadIcon(hinstOpenGL, MAKEINTRESOURCE(IDI_ICON1));
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = NULL;
    wc.lpszMenuName = 0;
    wc.lpszClassName = WINDOW_CLASS_NAME;

    if (!RegisterClass(&wc)) {
        // TODO: Add safe error here
        // unable to register class
    }
    classRegistered = true;
}

// create HWND
if (!hWnd) {
    hWnd = CreateWindowEx(
        WS_EX_APPWINDOW | WS_EX_WINDOWEDGE,
        WINDOW_CLASS_NAME,
        "BroGL",
        WS_VISIBLE | WS_OVERLAPPEDWINDOW,
        0,
        0,
        width,
        height,
        NULL,
        NULL,
        hinstOpenGL,
        this
        );

    if (!hWnd) {
        // error creating the window
    }

    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
}

if (!(hDC = GetDC(hWnd))) {
    ShowWindow(hWnd, SW_HIDE);
    DestroyWindow(hWnd);
    hWnd = NULL;
    return false;
}

// Create OpenGL Context
if (!MakeContext()) {
    ShowWindow(hWnd, SW_HIDE);
    DestroyWindow(hWnd);
    hWnd = NULL;

    return false;
}

SetForegroundWindow(hWnd);
SetFocus(hWnd);

return true;
}

如果需要更多信息,请与我们联系。

编辑:这是消息循环。

LONG WINAPI BroGLWin::MainWndProc(HWND n_hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
  switch (uMsg) {
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    case WM_CREATE:
    {
      LPCREATESTRUCT cs = reinterpret_cast<LPCREATESTRUCT>(lParam);
      void * lpCreateParam = cs->lpCreateParams;
      BroGLWin *win = reinterpret_cast<BroGLWin *>(lpCreateParam);
      assert(win == this);
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
  return 0;
}

编辑2:我通过正确实现消息循环解决了我的问题。添加的代码允许正确读取新消息。感谢那些回答并留下建设性意见的人。我还发现以下网站在这个例子中非常有用:http://www.winprog.org/tutorial/message_loop.html

这是我添加到WinMain

中的main.cpp功能的代码
// pump the message loop
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
    if (GetMessage(&msg, NULL, 0, 0) < 0) {
        // Some error checking
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

2 个答案:

答案 0 :(得分:2)

您报告的行为是无法响应邮件的应用程序的症状。因此,您似乎很可能只是无法实现消息循环,或者实现了一个损坏的消息循环。

答案 1 :(得分:1)

听起来像是丢失或错误实现的消息循环。请注意,当指针进入窗口时要更新光标图像,您必须调用SetCursor以响应窗口中的鼠标输入或鼠标移动事件,或者在窗口类中设置光标并且如果您不自行处理这些消息,请致电DefWindowProc。将所有消息传递给&#39; DefWindowProc`总是一个好主意,并且只排除那些您自己处理的消息不要想要被默认的Windows行为解释。