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);
}
时间: 2024-10-14 13:05:39

MFC实现静态图片控件拖动(改)的相关文章

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法. ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾水. 一.静态显示bmp图片

VS2010/MFC常用控件:图片控件Picture Control

图片控件Picture Control 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属类都是CStatic类,有关成员函数已在前面介绍,这里就不重复了. 图片控件静态和动态加载图片 鸡啄米下面为大家演示如何为图片控件静态和动态加载位图图片. 1. 图片控件静态加载图片 1)创建一个基于对话框的MFC工程,名称设置为“

OpenCV 2.2版本号以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本号取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序猿无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上非常多人表示仅仅要将那两个文件人为的提取出来然后放到project里面就解决这个问题了,也提供了两个文件的下载,可是这麻烦不说.还会导致一些奇奇怪怪的报错(至少本人是这种,非常崩溃!).所以在了解了一些gdi画图之后结合网上的代码写了例如以下的函数,仅仅需调用就能够将O

MFC小程序003------MFC使用WebBrowser组件,在对话框中创建滚动视图,动态创建一个静态文本控件并设置鼠标单击的消息响应

MFC小程序截图: 一.在MFC中简单使用WebBrowser的ActiveX插件的方法: 见博文:  http://blog.csdn.net/supermanking/article/details/5866213 二.在对话框中创建视图(我这里创建的是一个滚动视图): 见博文: http://blog.csdn.net/clever101/article/details/4873994 http://blog.csdn.net/clever101/article/details/37790

MFC 学习之 模态对话框图片控件上作图

首先说明一点,onpaint 是更新面板用的,作图的话应在控件上进行. 新建 MFC 对话框工程,面板上添加按钮 IDC_START , IDC_SHOW , IDC_STOP 添加两个对话框,ID 分别设为(简写)ld 和 cd. ld 上添加三个图片控件,并且每一个均关联一个 CSTATIC 型变量. cd 上添加一个图片控件,操作如上. 分别为两个对话框添加类,名称自己设,我的是 CLineDlg 和 CCompDlg . 主对话框头文件中包含两个类的头文件. 添加声明: CLineDlg

OpenCV 2.2版本以上显示图片到 MFC 的 Picture Control 控件中

OpenCV 2.2 以及后面的版本取消掉了 CvvImage.h 和CvvImage.cpp 两个文件,直接导致了苦逼的程序员无法调用里面的显示函数来将图片显示到 MFC 的 Picture Control 控件中.为此,网上很多人表示只要将那两个文件人为的提取出来然后放到工程里面就解决问题了,也提供了两个文件的下载,但是这麻烦不说,还会导致一些奇奇怪怪的报错(至少本人是这样的,很崩溃!).所以在了解了一些gdi绘图之后结合网上的代码写了如下的函数,只需调用就可以将OpenCV的图片显示在上面

VS2010-MFC(常用控件:图片控件Picture Control)

转自:http://www.jizhuomi.com/software/193.html 本节主要讲一种简单实用的控件,图片控件Picture Control.我们可以在界面某个位置放入图片控件,显示图片以美化界面. 图片控件简介 图片控件和前面讲到的静态文本框都是静态文本控件,因此两者的使用方法有很多相同之处,所属类都是CStatic类,有关成员函数已在前面介绍,这里就不重复了. 图片控件静态和动态加载图片 下面为大家演示如何为图片控件静态和动态加载位图图片. 1. 图片控件静态加载图片 1)

VC++图片控件(Picture Control)显示资源位图(BMP)、文件位图(BMP)、其它格式文件图片(JPG\PNG\BMP)的方法

在VC++ MFC编程中,我们常使用Picture Control图片控件来显示图像.下面简单归纳几种显示不同的方式: (实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8341525) 第一种.资源位图方式显示BMP图片 如果要显示的是一张BMP位图,则可以采用资源位图方式,具体步骤如下: (1)将BMP文件拷贝到工程的res目录下: (2)在对话框中添加一个Picture Control控件,例如:ID为IDC_STATI

MFC&amp;Opencv 在Picture控件里显示和处理图像

在VS2005和2008里,我们可以用一个 Solution 来组合几个 Project (每个 Project 基本上只包含一个 Program),当我们要构建一个多Program的应用时(例如一个客户端程序加一个服务器应用程序),利用 Solution 可以将这些 Projects 组合起来.并且共享文件和函数库.通常需要为Solution创建一个主路径,其中包含了有Projects的路径.不过在这篇文章里,我们只构建一个简单的Project,所以在创建MFC的New Project对话框里