界面庫分析有個必需的方法,就是找窗口函數,一般情況下,作者都會命名爲wndproce,引用"志乃"的話說,要問爲什麼的話,因爲我就是這麼幹的,不妨使用understand找找看,一不小心還真的找到了。
LRESULT HwndHost::_WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
HwndHost* pThis = (HwndHost*)hwnd;
return LRESULT HwndHost::_WndProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
<span style="white-space:pre"> </span>HwndHost* pThis = (HwndHost*)hwnd;
<span style="white-space:pre"> </span>return pThis->WndProc( uMsg, wParam, lParam );
}
}
這裏調用了pThis->WndProc( uMsg, wParam, lParam );
<pre name="code" class="cpp">//
// [private] LRESULT WndProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
//
// 窗口被子類化過之後的窗口過程
//
LRESULT HwndHost::WndProc( UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_SETFOCUS:
{
this->SetFocus(true);
WindowBase* pWindow = this->GetWindowObject();
if (pWindow)
{
pWindow->GetMouseMgr()->SetFocusObjectDirect(this);
::UISendMessage(this, WM_SETFOCUS,
(WPARAM)pWindow->GetMouseMgr()->GetOldFocusObject(),
0 );
}
}
break;
case WM_KILLFOCUS:
{
this->SetFocus(false);
WindowBase* pWindow = this->GetWindowObject();
if (pWindow)
{
::UISendMessage(this, WM_KILLFOCUS,
(WPARAM)pWindow->GetMouseMgr()->GetFocusObject(),
0 );
}
}
break;
case WM_NCDESTROY:
{
LRESULT lRet = DefWindowProc(uMsg,wParam,lParam);
this->UnSubclassWindow(); // 會清空 oldwndproc,因此先調用默認過程
m_hWnd = NULL;
return lRet;
}
break;
case WM_STYLECHANGED:
{
UpdateTabStopStyle();
}
break;
case WM_WINDOWPOSCHANGED:
{
UIASSERT(m_pParent);
if (m_pParent->GetObjectType() == OBJ_WINDOW) // 直接放在了父窗口下面
{
::GetWindowRect(m_hWnd, &m_rcParent);
HWND hWndParent = ::GetParent(m_hWnd);
::MapWindowPoints(NULL, hWndParent, (LPPOINT)&m_rcParent, 2);
}
else // 有可能是放在了一個panel下面
{
RECT rcWindow;
::GetWindowRect(m_hWnd, &rcWindow);
HWND hWndParent = m_pIHwndHost->GetHWND();
::MapWindowPoints(NULL, hWndParent, (LPPOINT)&rcWindow, 2);
m_pParent->WindowRect2ObjectClientRect(&rcWindow, &m_rcParent);
}
}
break;
}
return DefWindowProc(uMsg,wParam,lParam);
}
但是,到這個地方,還沒有找到消息如何處理的,這裏只是簡單的處理了幾個消息,那麼其它的消息是如何處理的呢,請看後續文章