win32程序通過LPCREATESTRUCT中的lpCreateParams傳遞參數給窗口過程函數

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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章