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;
}