static void motion( GtkWidget *widget, GdkEventMotion *event, gpointer data ){ GLWindow *wnd = (GLWindow*)data; guint32 flags = 0; if ( ( event->state & GDK_BUTTON1_MASK ) != 0 ) { flags |= MK_LBUTTON; } if ( ( event->state & GDK_BUTTON2_MASK ) != 0 ) { flags |= MK_MBUTTON; } if ( ( event->state & GDK_BUTTON3_MASK ) != 0 ) { flags |= MK_RBUTTON; } if ( ( event->state & GDK_CONTROL_MASK ) != 0 ) { flags |= MK_CONTROL; } if ( ( event->state & GDK_SHIFT_MASK ) != 0 ) { flags |= MK_SHIFT; } wnd->OnMouseMove( flags, (int)event->x, (int)event->y ); }
LRESULT CALLBACK GLWindow::WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { GLWindow* instance = (GLWindow*) GetWindowLongPtr(hwnd, GWL_USERDATA); switch (msg) { case WM_CREATE: { CREATESTRUCT* create = (CREATESTRUCT*) lParam; instance = (GLWindow*) create->lpCreateParams; SetWindowLongPtr(hwnd, GWL_USERDATA, (LONG_PTR) instance); return 0; } case WM_SIZE: instance->OnResize(LOWORD(lParam), HIWORD(lParam)); return 0; case WM_CLOSE: DestroyWindow(hwnd); case WM_DESTROY: PostQuitMessage(0); return 0; case WM_KEYDOWN: instance->OnKeyDown(wParam); return 0; case WM_RBUTTONDOWN: case WM_LBUTTONDOWN: SetCapture(hwnd); instance->OnMouseDown(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; case WM_RBUTTONUP: case WM_LBUTTONUP: ReleaseCapture(); instance->OnMouseUp(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; case WM_MOUSEMOVE: instance->OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); return 0; case WM_ERASEBKGND: return 1; case WM_PAINT: if (GetUpdateRect(hwnd, NULL, FALSE)) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); instance->OnRender(); SwapBuffers(hdc); EndPaint(hwnd, &ps); } return 0; default: return DefWindowProc(hwnd, msg, wParam, lParam); } }