鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠标左键时,确定圆周上的一点,从而画出相应的圆。直线、矩形等基本图形都可以采用橡皮筋技术。
效果图如下:
代码步骤
1.建立MFC工程文件;
2.向视图类中添加自定义的成员变量
用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。
proctected :
CPoint m_bO; // 圆心
CPoint m_bR; //圆上的点
int m_ist; //圆心与圆周上点的区别,m_ist=0,表示鼠标左击点为圆心,
//m_ist=1,表示鼠标左击点为圆周上的点
3.向视图类中添加自定义的成员函数原型:
public:
void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp);
int ComputeRadius(CPoint cenp,CPoint ardp);
具体操作方法:用鼠标右键单击视图类,选择“Add Member Function…”,分别添加上述两个成员函数,分别用于画圆和计算圆的半径
4.在视图类CPP文件的构造函数中初始化成员变量。
视图类的构造函数名与该视图类的名字相同。在视图类中选择构造函数,如:CXXXView(),用鼠标左键双击,输入下面程序代码:
CMouseSpringView:: CMouseSpringView()
{
//TODO: add construction code here
m_bO.x=0; m_bO.y=0; //圆心
m_bR.x=0; m_bR.y=0; //圆上的点
m_ist=0; //圆心与圆上的点区别
}
5.在视图类的OnDraw()函数中加入下列代码,实现视图绘图。
void CMouseSpringView::OnDraw(CDC* pDC)
{
CMouseSpringDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->SelectStockObject(NULL_BRUSH);
DrawCircle(pDC,m_bO,m_bR); // 调用自定义的成员函数画圆
}
6.向视图类中添加两个鼠标消息响应函数,并输入鼠标处理程序代码。
void CMouseSpringView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
pDC->SelectStockObject(NULL_BRUSH);
if (!m_ist) //绘制圆
{
m_bO=m_bR=point; //纪录第一次单击鼠标位置,定圆心
m_ist++;
}
else
{
m_bR=point; //记录第二次单击鼠标的位置,定圆周上的点
m_ist--; // 为新绘图作准备
DrawCircle(pDC,m_bO,m_bR); //绘制新圆
}
ReleaseDC(pDC); //释放设备环境
CView::OnLButtonDown(nFlags, point);
}
void CMouseSpringView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
int nDrawmode=pDC->SetROP2(R2_NOT); //设置异或绘图模式,并保存原来绘图模式
pDC->SelectStockObject(NULL_BRUSH);
if(m_ist==1)
{
CPoint prePnt,curPnt;
prePnt=m_bR; //获得鼠标所在的前一位置
curPnt=point;
//绘制橡皮筋线
DrawCircle(pDC,m_bO,prePnt); //用异或模式重复画圆,擦出所画的圆
DrawCircle(pDC,m_bO,curPnt); //用当前位置作为圆周上的点画圆
m_bR=point;
}
pDC->SetROP2(nDrawmode); //恢复原绘图模式
ReleaseDC(pDC); //释放设备环境
CView::OnMouseMove(nFlags, point);
}
7.添加成员函数的程序代码。分别为两个成员函数DrawCircle()和ComputeRadius()添加程序代码,程序如下:
void CMouseSpringView::DrawCircle(CDC *pDC, CPoint cenp, CPoint ardp)
{
int radius=ComputeRadius(cenp,ardp);
// 由圆心确定所画圆的外切区域
CRect rc(cenp.x-radius,cenp.y-radius,cenp.x+radius,cenp.y+radius);
pDC->Ellipse(rc); //画出一个整圆
}
int CMouseSpringView::ComputeRadius(CPoint cenp, CPoint ardp)
{
int dx=cenp.x-ardp.x;
int dy=cenp.y-ardp.y;
//sqrt()函数的调用,在头文件中加入#include "math.h"
return (int)sqrt(dx*dx+dy*dy);
}