快捷搜索:  汽车  科技

窗口子类化:什么是窗口子类化

窗口子类化:什么是窗口子类化); LONG dwNewLong // new valueLONG SetWindowLong( HWND hWnd // handle to window int nlndex // offset of value to set

子类化听起来很是让人不觉明历,

其实就是自定义窗口的消息处理,截取消息

使用的方法就是 SetWindowLong

子类化设置

LONG SetWindowLong(

HWND hWnd // handle to window

int nlndex // offset of value to set

LONG dwNewLong // new value

);

常量

常量值

意义

GWL_EXSTYLE

设定一个新的扩展风格。

GWL_HINSTANCE

设置一个新的应用程序实例句柄。

GWL_ID

设置一个新的窗口标识符。

GWL_STYLE

设定一个新的窗口风格。

GWL_USERDATA

设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值。

GWL_WNDPROC

为窗口设定一个新的处理函数。

GWL_HWNDPARENT-8改变子窗口的父窗口 应使用SetParent函数。

其中 参数使用 GWL_WNDPROC,设置一个新的处理函数,就是所谓的窗口子类化

子类化示例:

比如截取CEF浏览器窗口 鼠标信息, 需要子类化CEF浏览器窗口

窗口子类化:什么是窗口子类化(1)

窗口子类化:什么是窗口子类化(2)

//首先要找准需要子类化的窗口 OldProc = (WNDPROC)SetWindowLong(cefHWND GWL_WNDPROC (LONG)ProcCEF);

窗口子类化:什么是窗口子类化(3)

窗口消息截取:

WNDPROC OldProc; LRESULT CALLBACK ProcCEF(HWND hWnd UINT Msg WPARAM wParam LPARAM lParam) { pClassform = (MyClassForm*)(nim_comp::WindowsManager::GetInstance()->GetWindow(MyClassForm::kClassName MyClassForm::kClassName)); if (Msg == WM_CHAR ) { MessageBeep(MB_OK); return 0; } else if (Msg == WM_LBUTTONDOWN) { int i = 0; i ; } else if (Msg == WM_MOUSEHOVER) { int xPos = GET_X_LPARAM(lParam); int yPos = GET_Y_LPARAM(lParam); std::wstring pos = nbase::StringPrintf(L"%d %d" xPos yPos); QLOG_APP(pos); } else if (Msg == WM_MOUSEMOVE) { int xPos = GET_X_LPARAM(lParam); int yPos = GET_Y_LPARAM(lParam); std::wstring pos = nbase::StringPrintf(L"%d %d" xPos yPos); QLOG_APP(pos); if (pClassform) pClassform->showCefBackBtn(TRUE); } else if (Msg == WM_MOUSELEAVE) { if (pClassform) pClassform->showCefBackBtn(false); } else return CallWindowProc(OldProc hWnd Msg wParam lParam); }

窗口子类化:什么是窗口子类化(4)

猜您喜欢: