/* You can not initialize the window class with a class method as the window procedure unless it is a static method, so the class also needs a static message handler that determines which instance of the class is the recipient of the message and calls that instance's window procedure. See "http://www.gamedev.net/reference/articles/article1810.asp" for more info. */ LRESULT CALLBACK Window::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { Window* pWnd = NULL; /* * A difference between a desktop version of Windows and the CE version is in the window creation process. * On the desktop WM_NCCREATE is the first message so the this pointer should be captured during the its processing. * In Windows CE this message doesn't exist. The first message is WM_CREATE so it must be used. */ #ifdef UNDER_CE if (uMsg == WM_CREATE) #else if (uMsg == WM_NCCREATE) #endif { // get the pointer to the window from lpCreateParams which was set in CreateWindow pWnd = reinterpret_cast<Window *>(((LPCREATESTRUCT)lParam)->lpCreateParams); ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pWnd)); pWnd->SetHandle(hwnd); // this is need, otherwise _hWnd not already set inside OnCreate() .. } else { // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); } // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
/* You can not initialize the window class with a class method as the window procedure unless it is a static method, so the class also needs a static message handler that determines which instance of the class is the recipient of the message and calls that instance's window procedure. See "http://www.gamedev.net/reference/articles/article1810.asp" for more info. */ LRESULT CALLBACK BaseDialog::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { BaseDialog* pWnd; // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
//--------------------------------------------------- LRESULT CALLBACK Window::stWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { Window* pWnd; if (uMsg == WM_NCCREATE) SetWindowLong(hWnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam))->lpCreateParams)); pWnd = GetObjectFromWindow(hWnd); if (pWnd) return pWnd->m_WndProcFunction(hWnd, uMsg, wParam, lParam, pWnd->m_WndProcOwner); else return DefWindowProc(hWnd, uMsg, wParam, lParam); }
LRESULT CALLBACK CWindow::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CWindow * pWnd = nullptr; if (uMsg == WM_NCCREATE) { // get the pointer to the window from lpCreateParams which was set in CreateWindow SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)((LPCREATESTRUCT(lParam))->lpCreateParams)); } // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) { switch (uMsg) { case WM_ACTIVATE: if ((wParam == WA_ACTIVE)&&(!pWnd->bWindowRestored)&&(!pWnd->sRegistryPath.empty())) { WINDOWPLACEMENT wpl = {0}; DWORD size = sizeof(wpl); if (SHGetValue(HKEY_CURRENT_USER, pWnd->sRegistryPath.c_str(), pWnd->sRegistryValue.c_str(), REG_NONE, &wpl, &size) == ERROR_SUCCESS) SetWindowPlacement(hwnd, &wpl); else ShowWindow(hwnd, SW_SHOW); pWnd->bWindowRestored = true; } break; case WM_CLOSE: if (!pWnd->sRegistryPath.empty()) { WINDOWPLACEMENT wpl = {0}; wpl.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hwnd, &wpl); SHSetValue(HKEY_CURRENT_USER, pWnd->sRegistryPath.c_str(), pWnd->sRegistryValue.c_str(), REG_NONE, &wpl, sizeof(wpl)); } break; } return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); } else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
/* You can not initialize the window class with a class method as the window procedure unless it is a static method, so the class also needs a static message handler that determines which instance of the class is the recipient of the message and calls that instance's window procedure. See "http://www.gamedev.net/reference/articles/article1810.asp" for more info. */ LRESULT CALLBACK CBaseWindow::stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { CBaseWindow* pWnd; if (uMsg == WM_NCCREATE) { // get the pointer to the window from lpCreateParams which was set in CreateWindow SetWindowLong(hwnd, GWL_USERDATA, (long)((LPCREATESTRUCT(lParam))->lpCreateParams)); } // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) return pWnd->WinMsgHandler(hwnd, uMsg, wParam, lParam); else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
LRESULT CALLBACK Canvas::stWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { Canvas* pWnd; if (uMsg == WM_INITDIALOG) { SetWindowLong(hwnd, GWL_USERDATA, lParam); } else if (uMsg == WM_CREATE) { SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)((LPCREATESTRUCT(lParam))->lpCreateParams)); } // get the pointer to the window pWnd = GetObjectFromWindow(hwnd); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) return pWnd->WindowProc(hwnd, uMsg, wParam, lParam); else return DefWindowProc(hwnd, uMsg, wParam, lParam); }
INT_PTR CALLBACK CDialog::stDlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { CDialog* pWnd; if (uMsg == WM_INITDIALOG) { // get the pointer to the window from lpCreateParams SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); pWnd = (CDialog*)lParam; pWnd->m_hwnd = hwndDlg; } // get the pointer to the window pWnd = GetObjectFromWindow(hwndDlg); // if we have the pointer, go to the message handler of the window // else, use DefWindowProc if (pWnd) { LRESULT lRes = pWnd->DlgFunc(hwndDlg, uMsg, wParam, lParam); SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, lRes); return lRes; } else return DefWindowProc(hwndDlg, uMsg, wParam, lParam); }