Duilib学习笔记
+ -

DUILIB消息机制-类指针传递

2023-05-22 54 48

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 // 电源设置更改回调......
消息队列USER_MESSAGE_QUEUE
消息队列有7种:SendMessagesListHeadPostedMessagesListHeadHardwareMessagesListHeadNotifyMessagesListHeadGetMessage函数会处理SendMessage,但是不会处理PostMessage,Hardwa......
消息回调函数调用
消息队列属于窗口。GetMessage会在内核中处理所有的SendMeesage之后,再取出一个非SendMessageTranslateMessage:处理键盘的消息,本人认为会增加:WM_CHARDispatchMeesage:根据窗口句柄非发到窗口消息回调函数除了以上的函数调用消息回调......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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