当前位置:C++技术网 > 资讯 > OffsetRect为什么移不动矩形如何移动矩形深入分析(MFC版)

OffsetRect为什么移不动矩形如何移动矩形深入分析(MFC版)

更新时间:2016-01-08 21:42:56浏览次数:1+次

在《OffsetRect为什么移不动矩形,OffsetRect移动矩形深入分析》文章是用win32来写的,这里用MFC来实现,同时利用MFC的某些封装特性,拓展功能。

我们在那篇文章的基础上实现这样的功能,当你左键点击的坐标点大于举行的宽度,就往右移动,否则往左。右键点击同样。在win32中要实现这样的功能,不得不说,有点麻烦。不过也是还好。首先,我们需要得到点击的坐标点坐标,在win32中,利用GetCursor便可以,不过MFC的左键按键消息响应函数的传参里面封装了对应的坐标点,你直接利用就行。在之前的windows版本中,Rect类封装的四个字段分别是left,top,right,bottom,分别对应矩形左上角的坐标x,y值,矩形右下角坐标x,y值。如今的Rect在MFC中封装的字段不同,尽管MFC在每个类的类名前面加了一个C用以区分,现在CRect类封装字段是起始点坐标,然后就是矩形的宽,高字段。下面我们看看源代码:

void COffsetRectDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(point.x<rect.Width())
	{
		if(!OffsetRect(&rect,-x,0))
		{
			MessageBox(_T("移动失败"));
		}
	}
	else
	{
		if(!OffsetRect(&rect,x,0))
		{
			MessageBox(_T("移动失败"));
		}
	}
	Invalidate();
	CDialogEx::OnLButtonDown(nFlags, point);
}


void COffsetRectDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if(point.y<rect.Height())
	{
		if(!OffsetRect(&rect,0,-y))
		{
			MessageBox(_T("移动失败"));
		}
	}
	else
	{
		if(!OffsetRect(&rect,0,y))
		{
			MessageBox(_T("移动失败"));
		}
	}
	Invalidate();
	CDialogEx::OnRButtonDown(nFlags, point);
}


int COffsetRectDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialogEx::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	SetRect(&rect,0,0,100,100);
	return 0;
}
void COffsetRectDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		pDC=BeginPaint(&ps);
		pDC->SelectObject(GetStockObject(LTGRAY_BRUSH));
		pDC->Rectangle(&rect);
		EndPaint(&ps);
		CDialogEx::OnPaint();
	}
}
代码实现就你自己来好了,我就不贴图片了