Example #1
0
void CLockedEdit::mouseDoubleClickEvent(QMouseEvent *event)
{
   CPoint point(event->pos());
   unsigned int flags = 0;
   if ( event->modifiers()&Qt::ControlModifier )
   {
      flags |= MK_CONTROL;
   }
   if ( event->modifiers()&Qt::ShiftModifier )
   {
      flags |= MK_SHIFT;
   }
   if ( event->buttons()&Qt::LeftButton )
   {
      flags |= MK_LBUTTON;
   }
   if ( event->buttons()&Qt::MiddleButton )
   {
      flags |= MK_MBUTTON;
   }
   if ( event->buttons()&Qt::RightButton )
   {
      flags |= MK_RBUTTON;            
   }
   if ( event->button() == Qt::LeftButton )
   {
      OnLButtonDblClk(flags,point);
   }
}
Example #2
0
// 鼠标左键双击事件处理
void CDlgPopup::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	m_bIsLButtonDblClk = TRUE;

	if(m_pControl)
	{
		if(m_pControl->GetVisible() && m_pControl->GetRresponse())
		{
			CRect rc = m_pControl->GetRect();
			m_pControl->OnLButtonDblClk(nFlags, point);				

			if (!rc.PtInRect(point))
			{
				m_pControl = NULL;
			}
		}
		else
		{
			m_pControl = NULL;
		}
	}

	// 调用自身的函数
	if(OnLButtonDblClk(point))
	{
		DrawWindow();
	}

	ResetControl();

	CWnd::OnLButtonDblClk(nFlags, point);
}
Example #3
0
//窗口处理函数
LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, 
												 WPARAM wParam, LPARAM lParam )
{
	switch( msg )
	{
		case WM_MOUSEWHEEL:
			OnMouseWheel( hWnd, wParam );
			break;
		case WM_LBUTTONDBLCLK:
			OnLButtonDblClk( hWnd );
			break;
		case WM_PAINT:
			OnPaint( hWnd );
			break;
		case WM_MOUSEMOVE:
			OnMouseMove( hWnd, lParam );
			break;
		case WM_LBUTTONDOWN:
			OnLButtonDown( hWnd, wParam, lParam );
			break;
		case WM_LBUTTONUP:
			OnLButtonUp( hWnd, wParam, lParam );
			break;
		case WM_DESTROY:
			PostQuitMessage( 0 );
			break;
	}
	return DefWindowProc( hWnd, msg, wParam, lParam );
}
Example #4
0
void CMultiSelTreeCtrl::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	if (nChar == VK_RETURN)
	{
		HTREEITEM item = GetSelectedItem(0);
		if (item)
			OnLButtonDblClk(item);
		return;
	}
	CTreeCtrl::OnChar(nChar, nRepCnt, nFlags);
}
BOOL CXTPPropertyGridItemBool::OnKeyDown (UINT nChar)
{
	if (m_bCheckBoxStyle && IsAllowEdit() && (nChar == VK_SPACE))
	{
		CRect rc = GetValueRect();
		OnLButtonDblClk(0, rc.CenterPoint());

		return TRUE;
	}
	return FALSE;
}
BOOL CXTPPropertyGridItemBool::OnLButtonDown(UINT nFlags, CPoint point)
{
	if (!CXTPPropertyGridItem::OnLButtonDown(nFlags, point))
		return FALSE;

	if (m_bCheckBoxStyle)
	{
		if (PtInCheckBoxRect(point) && IsAllowEdit())
		{
			OnLButtonDblClk(nFlags, point);
		}
	}

	return TRUE;
}
Example #7
0
LRESULT CMainWindow::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	if (uMsg == WM_MOUSEMOVE)
		OnMouseMove(uMsg, wParam, lParam);

	if (uMsg == WM_RBUTTONDOWN)
	{
		LRESULT lRes = __super::HandleMessage(uMsg, wParam, lParam);
		OnRButtonDown(uMsg, wParam, lParam);
		return lRes;
	}

	if (uMsg == WM_LBUTTONDBLCLK)
		OnLButtonDblClk(uMsg, wParam, lParam);

 	if ((m_pSendEdit != NULL) && m_pSendEdit->IsFocused() 
 		&& (uMsg == WM_KEYDOWN) && (wParam == 'V') && (lParam & VK_CONTROL))	// 发送消息框的Ctrl+V消息
 	{
 		m_pSendEdit->PasteSpecial(CF_TEXT);
 		return TRUE;
 	}

	if (uMsg == WM_NOTIFY && EN_PASTE == ((LPNMHDR)lParam)->code)
	{
		ITextServices * pTextServices = m_pSendEdit->GetTextServices();
		if ((UINT)pTextServices == ((LPNMHDR)lParam)->idFrom)
		{
			AddMsgToSendEdit(((NMRICHEDITOLECALLBACK *)lParam)->lpszText);
		}
		if (pTextServices != NULL)
			pTextServices->Release();
	}

	if (uMsg == WM_MENU)
	{
		CControlUI * pControl = (CControlUI *)lParam;
		if (pControl != NULL)
			this->paint_manager_.SendNotify(pControl, _T("menu_msg"), wParam, lParam);
	}

	if (uMsg == FACE_CTRL_SEL)
		return OnFaceCtrlSel(uMsg, wParam, lParam);

	if (uMsg == WM_DROPFILES)
		return onDropFiles(uMsg, wParam, lParam);

	return __super::HandleMessage(uMsg, wParam, lParam);
}
Example #8
0
///*----------------------------------------------------------------------------------------
/// CWinCtrl
unsigned int CTree::Process( UINT uiMsg,WPARAM wParam,LPARAM lParam )
{
	if(!IsVision() ) return 0;

	POINT ptMouse = { LOWORD(lParam), HIWORD(lParam ) };
	//영역안에 있는지 체크
	if(!IsInside( ptMouse.x, ptMouse.y )) {
		//m_iButtonState = BS_NORMAL;
		return 0;
	}

	ptMouse.x -= m_sPosition.x;
	ptMouse.y -= m_sPosition.y;

	RECT rc = { 0,0,m_iWidth,m_iRowHeight };
	int iRow = 0;

	switch( uiMsg )
	{
	case WM_LBUTTONDOWN:
		{
			for( ; rc.bottom < m_iHeight; rc.top += m_iRowHeight, rc.bottom += m_iRowHeight, ++iRow )
			{
				if( PtInRect( &rc, ptMouse ) )
				{
					OnLButtonDown( iRow );
					return m_iControlID;
				}
			}
			break;
		}
	case WM_LBUTTONDBLCLK:
		{
			for( ; rc.bottom < m_iHeight; rc.top += m_iRowHeight, rc.bottom += m_iRowHeight, ++iRow )
			{
				if( PtInRect( &rc, ptMouse ) )
				{
					OnLButtonDblClk( iRow );
					return m_iControlID;
				}
			}
			break;
		}
	}
	return m_iControlID;
}
Example #9
0
BOOL CZoneTree::MenuSelect(UINT id)
{	
	HTREEITEM it, par;
	room_data *room;
	int index;
	CPoint pos;
	CWinDEDlg *parent = (CWinDEDlg*)GetParent();
	
	
	switch(id) {
	case ID_TREE_GOTO:
		par = GetSelectedItem();
		
		room = (room_data*)GetItemData(par);

		parent->in_room = room;

		parent->ShowRoom();
		break;
	case ID_TREE_EDIT_AREA:
	case ID_TREE_EDIT_ROOM:
	case ID_TREE_EDIT_MINDEX:
	case ID_TREE_EDIT_OINDEX:
	case ID_TREE_EDIT_MOB:
	case ID_TREE_EDIT_OBJ:
		GetCursorPos(&pos);
		OnLButtonDblClk(0, pos);
		break;
	case ID_TREE_DELETE_ROOM:
	case ID_TREE_DELETE_MOB:
	case ID_TREE_DELETE_OBJ:
	case ID_TREE_DELETE_OINDEX:
	case ID_TREE_DELETE_MINDEX:
		OnKeyUp(VK_DELETE, 1, 0);
		break;
	case ID_TREE_NEW_AREA:
		parent->OnNewArea();
		break;
	case ID_TREE_SAVE_AREA:
		parent->OnSave();
		break;
	case ID_TREE_OPEN_AREA:
		parent->OnOpen();
		break;
	case ID_TREE_DELETE_ROOMS:
		parent->DeleteAllRooms();
		break;
	case ID_TREE_DELETE_MOBS:
		parent->DeleteAllMobs();
		break;
	case ID_TREE_DELETE_OBJS:
		parent->DeleteAllObjs();
		break;
	case ID_TREE_ROOM_GRID:
		parent->OnCreateGrid();
		break;
	case ID_TREE_FRIENDS: {
		mob_index *mob;
		DlgEditFriends friends;

		it = GetSelectedItem();
		
		mob = (mob_index*)GetItemData(it);

		friends.mob = mob;

		friends.DoModal();
							   }
		break;
	case ID_TREE_REMOVE_PEOPLE:
		it = GetSelectedItem();
		par = GetParentItem(it);
		
		room = (room_data*)GetItemData(par);
		
		DeleteItem(it);
		
		if(room) {
			room->m_tPeople = parent->InsertItem(CString("Occupants"), room->m_tThis, NULL, PEOPLE);
			room->RemoveEveryone();
		}
		
		SortChildren(par);
		
		break;
	case ID_TREE_EDIT_EQUIP: {
		mob_index *mob;
		DlgEquipMob dlg_eq;

		it = GetSelectedItem();
		mob = (mob_index*)GetItemData(it);
		
		dlg_eq.mob = mob;
		dlg_eq.DoModal();
		}
		break;
	case ID_TREE_NEW_MOB:
		parent->OnNewMob();
		break;
	case ID_TREE_NEW_OBJ:
		parent->OnNewObject();
		break;
	case ID_TREE_NEW_ROOM:
		parent->OnNewRoom();
		break;
	case ID_TREE_EDIT_CONTENTS:
		{
			DlgEditContents dlg_inv(this);
			par = GetSelectedItem();
		
			dlg_inv.obj= (obj_index*)GetItemData(par);

			dlg_inv.DoModal();
		}

		break;
	case ID_TREE_REMOVE_CONTENTS:
		it = GetSelectedItem();
		par = GetParentItem(it);

		GetItemImage(par, index, index);

		switch(index) {
		case ROOM_DATA:
			room = (room_data*)GetItemData(par);
			
			DeleteItem(it);

			if(room) {
				room->m_tContents = parent->InsertItem(CString("Contents"), room->m_tThis, NULL, CONTENTS);
				room->RemoveContents();
			}
			
			SortChildren(par);
			
			break;
		case OBJECT_DATA: {
			object_data *obj = (object_data*)GetItemData(par);

			DeleteItem(it);

			if(obj) {
				obj->RemoveContents();
			}
			break;
		}
		case OBJ_INDEX: {
			obj_index *obj = (obj_index*)GetItemData(par);

			DeleteItem(it);

			if(obj)
				obj->RemoveContents();

			break;
		}
		case MOB_INDEX:
			break;
		case MOB_DATA:
			
			break;
		}
		break;
		
	}

	return true;
}
Example #10
0
void CZoneTree::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	CPoint pos;
	int i;
	HTREEITEM it;
	HTREEITEM contents;
	HTREEITEM parent;
	CWinDEDlg *dlg = (CWinDEDlg*)GetParent();

	GetCursorPos(&pos);

	if(nChar == VK_RETURN)    
	{       
		GetParent()->SetFocus();
		OnLButtonDblClk(nFlags, pos);
	}    
	else if(nChar == VK_DELETE)    
	{       
		it = GetSelectedItem();
		GetItemImage(it, i, i);
		switch(i) {
			case AREA_DATA:
				break;
			case ROOM_DATA: {
				room_data *room;
				room = (room_data*)GetItemData(it);
				dlg->DeleteRoom(room->vnum);
				break;
			}
			case MOB_DATA: {
				mob_data *mob;
				mob = (mob_data*)GetItemData(it);
				dlg->DeleteMob(mob->vnum);
				break;
			}
			case OBJECT_DATA: {
				object_data *obj;
				obj = (object_data*)GetItemData(it);
				dlg->DeleteObj(obj->vnum);
				break;
			}
			case MOB_INDEX: {
				mob_index *m_index;
				room_data *room;
				
				contents = GetParentItem(it);
				parent = GetParentItem(contents);
				
				m_index = (mob_index*)GetItemData(it);
				room = (room_data*)GetItemData(parent);
				
				room->RemovePerson(m_index);
				dlg->RemoveItem(m_index->m_tThis);

				delete m_index;
				break;
			}
			case OBJ_INDEX: {
				obj_index *o_index;
				o_index = (obj_index*)GetItemData(it);
				
				//get contents indexs parent item wich is the actual object
				contents = GetParentItem(it);
				parent = GetParentItem(contents);
				
				GetItemImage(parent, i, i);
				
				switch(i) {
					case OBJ_INDEX: {
						obj_index *o_parent;
						o_parent = (obj_index*)GetItemData(parent);
						o_parent->RemoveContent(&o_index);
						break;
					}
					case MOB_INDEX:
						break;
					case ROOM_DATA:
						room_data *room;
						room = (room_data*)GetItemData(parent);
						room->RemoveContent(o_index);
						break;
					case OBJECT_DATA: {
						object_data *obj_parent;
						obj_parent = (object_data*)GetItemData(parent);
						obj_parent->RemoveContent(o_index);
						break;
					}
					case MOB_DATA:
						break;
				}

				if(o_index)
					o_index->RemoveFromList();
				
				dlg->RemoveItem(it);
				break;
			}
		}
	}
}
Example #11
0
	//--------------------------------------------------------------------------------
	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;
	}
Example #12
0
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;
}
Example #13
0
LRESULT D3D11App::MsgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg)
	{
		// WM_ACTIVATE is sent when the window is activated or deactivated.  
		// We pause the game when the window is deactivated and unpause it 
		// when it becomes active.  
	case WM_ACTIVATE:
/*
		if (LOWORD(wParam) == WA_INACTIVE)
		{
			mAppPaused = true;
			mTimer.Stop();
		}
		else
		{
			mAppPaused = false;
			mTimer.Start();
		}*/
		return 0;
		// WM_SIZE is sent when the user resizes the window.  
	case WM_SIZE:
		// Save the new client area dimensions.
		mClientWidth = LOWORD(lParam);
		mClientHeight = HIWORD(lParam);
		if (SwapChainPtr->GetState())
		{
			if (wParam == SIZE_MINIMIZED)
			{
				mAppPaused = true;
				mMinimized = true;
				mMaximized = false;
			}
			else if (wParam == SIZE_MAXIMIZED)
			{
				mAppPaused = false;
				mMinimized = false;
				mMaximized = true;
				OnResize();
			}
			else if (wParam == SIZE_RESTORED)
			{

				// Restoring from minimized state?
				if (mMinimized)
				{
					mAppPaused = false;
					mMinimized = false;
					OnResize();
				}

				// Restoring from maximized state?
				else if (mMaximized)
				{
					mAppPaused = false;
					mMaximized = false;
					OnResize();
				}
				else if (mResizing)
				{
					// If user is dragging the resize bars, we do not resize 
					// the buffers here because as the user continuously 
					// drags the resize bars, a stream of WM_SIZE messages are
					// sent to the window, and it would be pointless (and slow)
					// to resize for each WM_SIZE message received from dragging
					// the resize bars.  So instead, we reset after the user is 
					// done resizing the window and releases the resize bars, which 
					// sends a WM_EXITSIZEMOVE message.
				}
				else // API call such as SetWindowPos or mSwapChain->SetFullscreenState.
				{
					OnResize();
				}
			}
		}
		return 0;
		// WM_EXITSIZEMOVE is sent when the user grabs the resize bars.
	case WM_ENTERSIZEMOVE:
		mAppPaused = true;
		mResizing = true;
		mTimer.Stop();
		mClientWidthOld = mClientWidth;
		mClientHeightOld = mClientHeight;
		return 0;

		// WM_EXITSIZEMOVE is sent when the user releases the resize bars.
		// Here we reset everything based on the new window dimensions.
	case WM_EXITSIZEMOVE:

		mAppPaused = false;
		mResizing = false;
		mTimer.Start();
		if ((mClientWidthOld != mClientWidth) && (mClientHeightOld!= mClientHeight))
		{
			OnResize();
		}
		return 0;

/*
	case WM_PAINT:
		hDC = BeginPaint(hwnd, &paintStruct);
		EndPaint(hwnd, &paintStruct);
		break;*/
		// Catch this message so to prevent the window from becoming too small.
	case WM_GETMINMAXINFO:
		((MINMAXINFO*)lParam)->ptMinTrackSize.x = 200;
		((MINMAXINFO*)lParam)->ptMinTrackSize.y = 200;
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_LBUTTONDOWN:
	case WM_MBUTTONDOWN:
	case WM_RBUTTONDOWN:
		OnMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_LBUTTONUP:
	case WM_MBUTTONUP:
	case WM_RBUTTONUP:
		OnMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case WM_MOUSEMOVE:
		OnMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	case  WM_MOUSEWHEEL:
	{
		short zDelta = (short)HIWORD(wParam);
		OnMouseWheel(zDelta, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	}
	case  WM_LBUTTONDBLCLK:
		OnLButtonDblClk(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
		return 0;
	default:
		return DefWindowProc(hwnd, msg, wParam, lParam);
	}

	return 0;
}