我们在那篇文章的基础上实现这样的功能,当你左键点击的坐标点大于举行的宽度,就往右移动,否则往左。右键点击同样。在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();
}
}
代码实现就你自己来好了,我就不贴图片了