win32窗口程序中如果需要給窗口過程函數傳遞自定義參數,可以通過LPCREATESTRUCT結構體中的lpCreateParams進行傳遞。
創建窗口實例函數:
m_hWnd = CreateWindowEx(WS_EX_APPWINDOW, "FxWinAPP", "FxWinAPP", WS_OVERLAPPEDWINDOW, nPosX, nPosY, wndRect.right - wndRect.left, wndRect.bottom - wndRect.top, NULL, NULL, m_hInst, this); 其中: HWND CreateWindowEx( DWORD DdwExStyle, //窗口的擴展風格 LPCTSTR lpClassName, //指向註冊類名的指針 LPCTSTR lpWindowName, //指向窗口名稱的指針 DWORD dwStyle, //窗口風格 int x, //窗口的水平位置 int y, //窗口的垂直位置 int nWidth, //窗口的寬度 int nHeight, //窗口的高度 HWND hWndParent, //父窗口的句柄 HMENU hMenu, //菜單的句柄或是子窗口的標識符 HINSTANCE hInstance, //應用程序實例的句柄 LPVOID lpParam //指向窗口的創建數據 );
在窗口過程函數的返回參數lParam指向LPCREATESTRUCT結構體指針,獲取其中的了lpCreateParams:
LRESULT CALLBACK Win32Application::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; if(message == WM_CREATE) { LPCREATESTRUCT create_struct = reinterpret_cast<LPCREATESTRUCT>(lParam); void * lpCreateParam = create_struct->lpCreateParams; Win32Application * this_window = reinterpret_cast<Win32Application *>(lpCreateParam); SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this_window)); return DefWindowProc(hwnd, message, wParam, lParam); } Win32Application* pWin = reinterpret_cast<Win32Application *>(GetWindowLongPtr(hwnd, GWLP_USERDATA)); if(!pWin || !pWin->m_pRenderWindow ) return DefWindowProc(hwnd, message, wParam, lParam); RenderWindow* pRenderWnd = pWin->m_pRenderWindow; switch (message) { case WM_COMMAND: { wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case 0: break; default: return DefWindowProc(hwnd, message, wParam, lParam); } break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; }
可以參考:http://members.gamedev.net/sicrane/articles/WindowClass.html 這篇文章主要講如何在win32窗口程序中 將窗口過程函數定義爲窗口類的成員函數,而不是通常我們所寫的靜態函數。
貼下主要代碼:
class MyWindowClass { public: void WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK InitialWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { if (Msg == WM_NCCREATE) { LPCREATESTRUCT create_struct = reinterpret_cast<LPCREATESTRUCT>(lParam); void * lpCreateParam = create_struct->lpCreateParams; MyWindowClass * this_window = reinterpret_cast<MyWindowClass *>(lpCreateParam); SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(this_window)); SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(&MyWindowClass::StaticWndProc)); return this_window->WndProc(hWnd, Msg, wParam, lParam); } return DefWindowProc(hWnd, Msg, wParam, lParam); } static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { LONG_PTR user_data = GetWindowLongPtr(hWnd, GWLP_USERDATA); MyWindowClass * this_window = reinterpret_cast<MyWindowClass *>(user_data); return this_window->WndProc(hWnd, Msg, wParam, lParam); } };