//--------------------------------------------------------------------------------
	bool CPointerController::ProcessMessage( COSWindow& Window, Cmp_long_ptr& lResult, unsigned int uMsg, Cmp_uint_ptr wParam, Cmp_long_ptr lParam )
	{
		_WINQ_FCONTEXT( "CPointerController::ProcessMessage" );

		bool bProcessed = ProcessHook( Window, lResult, uMsg, wParam, lParam );

		switch ( uMsg )
		{
		case COSWindow::wmMouseMove:
			{
				OnMouseMove( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmLButtonDown:
			{
				OnLButtonDown( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmLButtonUp:
			{
				OnLButtonUp( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmLButtonDblClk:
			{
				OnLButtonDblClk( Window, wParam, lParam );
				lResult = 0;
				bProcessed= true;
			}
			break;
		case COSWindow::wmRButtonDown:
			{
				OnRButtonDown( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmRButtonUp:
			{
				OnRButtonUp( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmRButtonDblClk:
			{
				OnRButtonDblClk( Window, wParam, lParam );
				lResult = 0;
				bProcessed= true;
			}
			break;
		case COSWindow::wmMButtonDown:
			{
				OnMButtonDown( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmMButtonUp:
			{
				OnMButtonUp( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmMButtonDblClk:
			{
				OnMButtonDblClk( Window, wParam, lParam );
				lResult = 0;
				bProcessed= true;
			}
			break;
#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)
		case COSWindow::wmMouseWheel:
			{
				OnMouseWheel( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
#endif
		case COSWindow::wmCaptureChanged:
			{
				COSWindow::refType refWindow = COSWindow::FromHandle( CWindowHandle( 0, (void*)(lParam) ).Ref() );
				OnCaptureChanged( Window, refWindow );
				lResult = 0;
				bProcessed = true;
			}
			break;

#if((_WIN32_WINNT >= 0x0400) || (WINVER >= 0x0500))
		case COSWindow::wmMouseHover:
			{
				OnMouseHover( Window, wParam, lParam );
				lResult = 0;
				bProcessed = true;
			}
			break;
		case COSWindow::wmMouseLeave:
			{
				OnMouseLeave( Window );
				lResult = 0;
				bProcessed = true;
			}
			break;
#endif
		}

		return bProcessed;
	}
bool CUIMainDialog::MsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    // Mouse messages
    switch(uMsg)
    {
    case WM_LBUTTONDOWN:
    case WM_MBUTTONDOWN:
    case WM_RBUTTONDOWN:
        SetCapture(hWnd);
        break;
    case WM_LBUTTONUP:
    case WM_MBUTTONUP:
    case WM_RBUTTONUP:
        ReleaseCapture();
        break;
    }
    switch(uMsg)
    {
    case WM_MOUSEMOVE:
    case WM_LBUTTONDOWN:
    case WM_LBUTTONUP:
    case WM_MBUTTONDOWN:
    case WM_MBUTTONUP:
    case WM_RBUTTONDOWN:
    case WM_RBUTTONUP:
    case WM_LBUTTONDBLCLK:
    case WM_MBUTTONDBLCLK:
    case WM_RBUTTONDBLCLK:
    case WM_MOUSEWHEEL:
    {
        POINT mousePoint = { short(LOWORD(lParam)), short(HIWORD(lParam)) };
        switch(uMsg)
        {
        case WM_LBUTTONDBLCLK:
            OnLButtonDblClk(mousePoint);
            break;
        case WM_LBUTTONDOWN:
            OnLButtonDown(mousePoint);
            break;
        case WM_LBUTTONUP:
            OnLButtonUp(mousePoint);
            break;
        case WM_RBUTTONDBLCLK:
            OnRButtonDblClk(mousePoint);
            break;
        case WM_RBUTTONDOWN:
            OnRButtonDown(mousePoint);
            break;
        case WM_RBUTTONUP:
            OnRButtonUp(mousePoint);
            break;
        case WM_MBUTTONDBLCLK:
            OnMButtonDblClk(mousePoint);
            break;
        case WM_MBUTTONDOWN:
            OnMButtonDown(mousePoint);
            break;
        case WM_MBUTTONUP:
            OnMButtonUp(mousePoint);
            break;
        case WM_MOUSEMOVE:
            OnMouseMove(mousePoint);
            break;
        case WM_MOUSEWHEEL:
            //GetCursorPos(&mousePoint);
            ::ScreenToClient(hWnd,&mousePoint);
            OnMouseWheel(mousePoint,(short) HIWORD(wParam));
            break;
        }
    }
    break;
    }

    UISetHWND(hWnd);
    // Let the CUIIMEEditBox's static message proc handle the msg.
    // This is because some IME messages must be handled to ensure
    // proper functionalities and the static msg proc ensures that
    // this happens even if no control has the input focus.
    if(CIME::StaticMsgProc(uMsg, wParam, lParam))
    {
        //return true;
    }

    switch(uMsg)
    {
    case WM_SIZE:
    {
        RECT rc= {0,0,LOWORD(lParam), HIWORD(lParam)};
        OnSize(rc);
    }
    break;
    case WM_ACTIVATEAPP:
        // Call OnFocusIn()/OnFocusOut() of the control that currently has the focus
        // as the application is activated/deactivated.  This matches the Windows
        // behavior.
        if(s_pControlFocus &&
                s_pControlFocus->GetEnabled())
        {
            if(wParam)
                s_pControlFocus->OnFocusIn();
            else
                s_pControlFocus->OnFocusOut();
        }
        break;
    // Keyboard messages
    case WM_KEYDOWN:
    case WM_SYSKEYDOWN:
    case WM_KEYUP:
    case WM_SYSKEYUP:
    {
        // If a control is in focus, it belongs to this dialog, and it's enabled, then give
        // it the first chance at handling the message.
        if(s_pControlFocus &&
                s_pControlFocus->GetEnabled())
        {
            if(s_pControlFocus->HandleKeyboard(uMsg, wParam, lParam))
                return true;
        }
    }
    break;
    case WM_CAPTURECHANGED:
    {
        // The application has lost mouse capture.
        // The dialog object may not have received
        // a WM_MOUSEUP when capture changed. Reset
        // m_bDrag so that the dialog does not mistakenly
        // think the mouse button is still held down.
// 			if((HWND)lParam != hWnd)
// 			{
// 				SetPressed(false);
// 			}
// 			break;
    }
    }

    // 含焦点的控件 要优先处理消息 跨dialog处理
    if(s_pControlFocus &&
            s_pControlFocus->GetEnabled())
    {
        // If the control MsgProc handles it, then we don't.
        if(s_pControlFocus->MsgProc(uMsg, wParam, lParam))
            return true;
    }

    if(CUIDialog::MsgProc(hWnd, uMsg, wParam, lParam))
    {
        return true;
    }

    //ClearState();
    return false;
}