子類化聽起來很是讓人不覺明歷,
其實就是自定義窗口的消息處理,截取消息
使用的方法就是 SetWindowLong
子類化設置
LONG
SetWindowLong(
HWND
hWnd,
// handle to window
int
nlndex,
// offset of value to set
LONG
dwNewLong
// new value
);
常量 |
常量值 |
意義 |
---|---|---|
GWL_EXSTYLE |
-20 |
設定一個新的擴展風格。 |
GWL_HINSTANCE |
-6 |
設置一個新的應用程序實例句柄。 |
GWL_ID |
-12 |
設置一個新的窗口標識符。 |
GWL_STYLE |
-16 |
設定一個新的窗口風格。 |
GWL_USERDATA |
-21 |
設置與窗口有關的32位值。每個窗口均有一個由創建該窗口的應用程序使用的32位值。 |
GWL_WNDPROC |
-4 |
爲窗口設定一個新的處理函數。 |
GWL_HWNDPARENT | -8 | 改變子窗口的父窗口,應使用SetParent函數。 |
其中 參數使用 GWL_WNDPROC,設置一個新的處理函數,就是所謂的窗口子類化
子類化示例:
比如截取CEF瀏覽器窗口 鼠標信息, 需要子類化CEF瀏覽器窗口
HWND cefHWND = cef_student_->GetCefHandle();
HWND subHWND = GetTopWindow(cefHWND);
if (subHWND)
subHWND = GetTopWindow(subHWND);
cefHWND = subHWND;
TCHAR ch[100] = { 0 };
GetWindowText(cefHWND, ch, 100);
//首先要找準需要子類化的窗口
OldProc = (WNDPROC)SetWindowLong(cefHWND, GWL_WNDPROC, (LONG)ProcCEF);
窗口消息截取:
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);
}