關於dragon的wndproce

界面庫分析有個必需的方法,就是找窗口函數,一般情況下,作者都會命名爲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);
}



但是,到這個地方,還沒有找到消息如何處理的,這裏只是簡單的處理了幾個消息,那麼其它的消息是如何處理的呢,請看後續文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章