Duilib学习笔记
+ -

DUILIB消息机制-类指针传递

2023-05-22 20 0

Duilib的窗口均是通过CreateWindowEx函数来创建的,其函数原型如下:

HWND CreateWindowEx(
  DWORD dwExStyle, 
  LPCTSTR lpClassName, 
  LPCTSTR lpWindowName, 
  DWORD dwStyle, 
  int x, a
  int y, 
  int nWidth, 
  int nHeight, 
  HWND hWndParent, 
  HMENU hMenu, 
  HINSTANCE hInstance, 
  LPVOID lpParam 
);

其最后的一个参数lpParam是一个用户自定义指针,系统会将该指针在WM_CREATE消息的 CREATESTRUCT结构体成员中。
不过实际上是在WM_CREATE消息之前有一个WM_NCCREATE消息,其消息的结构体一样。

    if( uMsg == WM_NCCREATE ) {
        LPCREATESTRUCT lpcs = reinterpret_cast<LPCREATESTRUCT>(lParam);
        pThis = static_cast<CWindowWnd*>(lpcs->lpCreateParams);
        pThis->m_hWnd = hWnd;
        ::SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LPARAM>(pThis));
    }

使用SetWindowLongPtr再次保存类指针,这样当处理其它消息时只需要通过GetWindowLongPtr获取取类指针即可。

 pThis = reinterpret_cast<CWindowWnd*>(::GetWindowLongPtr(hWnd, GWLP_USERDATA));

当然,对于窗口消毁WM_NCDESTROY,需要将该指针清空。

        if( uMsg == WM_NCDESTROY && pThis != NULL ) {
            LRESULT lRes = ::CallWindowProc(pThis->m_OldWndProc, hWnd, uMsg, wParam, lParam);
            ::SetWindowLongPtr(pThis->m_hWnd, GWLP_USERDATA, 0L);
            if( pThis->m_bSubclassed ) pThis->Unsubclass();
            pThis->m_hWnd = NULL;
            pThis->OnFinalMessage(hWnd);
            return lRes;
        }

0 篇笔记 写笔记

DUILIB消息机制-类指针传递
Duilib的窗口均是通过CreateWindowEx函数来创建的,其函数原型如下:HWND CreateWindowEx( DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, ......
使用RegisterPowerSettingNotification判断笔记本的供电类型或供电改变消息回调
判断电源的供电类型,或当电原供电类型发生变化时,通知应用程序。#include #include #include #include // 电源设置更改回调......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!