首页 > 代码库 > MFC实现静态图片控件拖动(改)

MFC实现静态图片控件拖动(改)

从这篇文章中提炼http://blog.csdn.net/cq20110310/article/details/6926017

注意几点

1.传入MoveWindow()的是相对坐标

2.传入CImgeList class member方法的是绝对坐标

BOOL CNewPlan::PreTranslateMessage(MSG* pMsg)
{
	
	
	// TODO: 在此添加专用代码和/或调用基类
	if(pMsg-> message==WM_LBUTTONDBLCLK)     
	{ 
		//若在图片中双击跳出参数调节对话框
		if (IsInTaskPic(m_iPicOffset) == TRUE)
			EndDialog(TASK1_SETTING);
		
	} 
	if(pMsg-> message==WM_LBUTTONDOWN)   
	{

		//拷贝控件范围位图到兼容DC
		if(IsInTaskPic(m_iPicOffset))

		{

			//获取Picture控件大小
			CRect rtPicture;
			GetDlgItem(IDC_TASK1 + m_iPicOffset)->GetWindowRect(&rtPicture);

			CDC	*pDC	= GetDlgItem(IDC_TASK1 + m_iPicOffset)->GetDC();
			CDC	*pMemDC	= new CDC;
			CPoint point;
			GetCursorPos(&point); 
			//创建位图内存
			CBitmap		bitmapTemp;
			CBitmap		*pOldBitmap;
			bitmapTemp.CreateCompatibleBitmap(pDC, rtPicture.Width(), rtPicture.Height());
			pMemDC->CreateCompatibleDC(pDC);
			pOldBitmap	= pMemDC->SelectObject(&bitmapTemp);
			pMemDC->BitBlt(0, 0, rtPicture.Width(), rtPicture.Height(), pDC, 0, 0, SRCCOPY);
			pMemDC->SelectObject(pOldBitmap);
			delete	pMemDC;
			ReleaseDC(pDC);


			m_bIsLButtonDown	= TRUE;
			m_ptOffset.x	= point.x-rtPicture.left;
			m_ptOffset.y	= point.y-rtPicture.top;
			m_imgDrag.DeleteImageList();
			m_imgDrag.Create(rtPicture.Width(), rtPicture.Height(), ILC_COLOR32|ILC_MASK, 0, 1);
			m_imgDrag.Add(&bitmapTemp, RGB(0, 0, 0));
			m_imgDrag.BeginDrag(0, m_ptOffset);
			m_imgDrag.DragEnter(NULL, point);

			SetCapture();

		}
	}
	if(pMsg->message == WM_MOUSEMOVE)   
	{
		if(m_bIsLButtonDown)

		{

			CRect rtClient, rtPicture;
			CPoint ptMove;
			GetCursorPos(&ptMove); //相对于显示器左上角坐标

			GetDlgItem(IDC_TASK1 + m_iPicOffset)->GetWindowRect(&rtPicture);
			GetClientRect(&rtClient);
			ClientToScreen(&rtClient);
			
			

			//防止鼠标出边界产生的负效应
			if(rtClient.left > ptMove.x - m_ptOffset.x)
				ptMove.x	= rtClient.left + m_ptOffset.x;

			if(rtClient.top > ptMove.y - m_ptOffset.y)
				ptMove.y	= rtClient.top + m_ptOffset.y;

			if(rtClient.right - rtPicture.Width()  < ptMove.x  - m_ptOffset.x)
				ptMove.x	= rtClient.right - rtPicture.Width() +  m_ptOffset.x;

			if(rtClient.bottom - rtPicture.Height()  < ptMove.y  - m_ptOffset.y)
				ptMove.y	= rtClient.bottom - rtPicture.Height() + m_ptOffset.y;



			m_imgDrag.DragMove(ptMove);

		}

	}
	
	if(pMsg->message == WM_LBUTTONUP)  
	{
		if(m_bIsLButtonDown)
		{
			CRect rtClient;
			CRect rtPicture;
			CWnd* pPic = GetDlgItem(IDC_TASK1 + m_iPicOffset);
			CPoint ptMove;
			GetCursorPos(&ptMove);//相对于显示器左上角坐标
			ScreenToClient(&ptMove);//转换到客户端坐标
			GetClientRect(&rtClient);
			pPic->GetWindowRect(&rtPicture);//获取控件大小

			//防止鼠标出边界产生的负效应
			if(ptMove.x - m_ptOffset.x < 0)
				ptMove.x = m_ptOffset.x;

			if(ptMove.y - m_ptOffset.y < 0)
				ptMove.y = m_ptOffset.y;

			if(rtClient.right - rtPicture.Width()  < ptMove.x  - m_ptOffset.x)
				ptMove.x = rtClient.right - rtPicture.Width() +  m_ptOffset.x;

			if(rtClient.bottom - rtPicture.Height()  < ptMove.y  - m_ptOffset.y)
				ptMove.y = rtClient.bottom - rtPicture.Height() + m_ptOffset.y;

			//移动控件到鼠标区域
			pPic->MoveWindow(ptMove.x-m_ptOffset.x, ptMove.y-m_ptOffset.y, rtPicture.Width(), rtPicture.Height());

			m_bIsLButtonDown	= FALSE;
			m_imgDrag.DragLeave(this);
			m_imgDrag.EndDrag();
			ReleaseCapture();

			//刷新控件
			pPic->Invalidate();
			pPic->UpdateWindow();

		}

	}

	return CDialog::PreTranslateMessage(pMsg);
}


MFC实现静态图片控件拖动(改)