• 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);
        }
    };
  • 相关阅读:
    spring-mvc dispatcherServlet
    常用注解
    spring基础
    消息转换
    高级装配
    Leetcode第242题:有效的字母异位词
    Leetcode第76题:最小覆盖子串
    Leetcode633题平方数之和
    Leetcode454题四数之和II
    java从虚拟机执行角度解析案例(转)
  • 原文地址:https://www.cnblogs.com/beeasy/p/6125066.html
Copyright © 2020-2023  润新知