界面库分析有个必需的方法,就是找窗口函数,一般情况下,作者都会命名为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);
}
但是,到这个地方,还没有找到消息如何处理的,这里只是简单的处理了几个消息,那么其它的消息是如何处理的呢,请看后续文章