LRESULT CALLBACK CMainWindow::WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { const int MESSAGE_PROCESSED = 0; if (uMsg == WM_CREATE) { LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam; CMainWindow *pMainWindow = (CMainWindow *)pcs->lpCreateParams; SetWindowLongPtrW( hwnd, GWLP_USERDATA, PtrToUlong(pMainWindow) ); return MESSAGE_PROCESSED; } CMainWindow *pMainWindow = reinterpret_cast<CMainWindow *>(static_cast<LONG_PTR>( GetWindowLongPtrW( hwnd, GWLP_USERDATA ))); if (pMainWindow != NULL) { switch (uMsg) { case WM_SIZE: { UINT width = LOWORD(lParam); UINT height = HIWORD(lParam); pMainWindow->OnResize( width, height ); } return MESSAGE_PROCESSED; case WM_PAINT: case WM_DISPLAYCHANGE: { PAINTSTRUCT ps; BeginPaint( hwnd, &ps ); pMainWindow->OnPaint( ps.hdc, ps.rcPaint ); EndPaint( hwnd, &ps ); } return MESSAGE_PROCESSED; case WM_KEYDOWN: { UINT uVirtKey = wParam; pMainWindow->OnKeyDown( uVirtKey ); } return MESSAGE_PROCESSED; case WM_DESTROY: { pMainWindow->OnDestroy(); PostQuitMessage( 0 ); } return MESSAGE_PROCESSED; } } return DefWindowProc( hwnd, uMsg, wParam, lParam ); }
LRESULT CALLBACK CMainWindow::MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { CMainWindow *pThis; LRESULT RetCode = 0; /* Get the object pointer from window context */ pThis = (CMainWindow *)GetWindowLongPtr(hwnd, GWLP_USERDATA); /* Check for an invalid pointer */ if (pThis == NULL) { /* Check that this isn't a create message */ if (msg != WM_CREATE) { /* Don't handle null info pointer */ goto HandleDefaultMessage; } } switch(msg) { case WM_CREATE: { /* Get the object pointer from the create param */ pThis = (CMainWindow *)((LPCREATESTRUCT)lParam)->lpCreateParams; /* Store the info pointer in the window's global user data */ SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis); /* Call the create handler */ RetCode = pThis->OnCreate(hwnd); break; } case WM_SIZE: { RetCode = pThis->OnSize(); break; } case WM_NOTIFY: { /* Handle the notify message */ RetCode = pThis->OnNotify(lParam); break; } case WM_TIMER: { RetCode = pThis->OnTimer(wParam); break; } case WM_ONTRAYICON: { switch(lParam) { case WM_RBUTTONDOWN: MessageBoxW(NULL, L"test", L"right", MB_OK); break; case WM_LBUTTONDOWN: MessageBoxW(NULL, L"test", L"left", MB_OK); break; } } case WM_COMMAND: { /* Handle the command message */ RetCode = pThis->OnCommand(wParam, lParam); /* Hand it off to the default message handler */ goto HandleDefaultMessage; } case WM_CLOSE: { /* Destroy the main window */ DestroyWindow(hwnd); } break; case WM_DESTROY: { /* Call the destroy handler */ RetCode = pThis->OnDestroy(); break; } default: { HandleDefaultMessage: RetCode = DefWindowProc(hwnd, msg, wParam, lParam); break; } } return RetCode; }