之前我们已经可以画出直线和曲线了。但是算法虽容易理解,但是复杂度高,今天就介绍比较流行的DDA画线法,还有,对鼠标进行事件有所响应,即,在画板上,鼠标左键单击,移动至另外一个地方松开,此时在这两个点之间画一条线。
算法代码
void DDA_Line(int x1, int y1, int x2, int y2, int color)
{
CDC *pDC = GetDC();//获取设备环境
int k,i; float x, y, dx, dy;
k = abs(x2-x1);
if (abs(y2-y1)>k)
{
k = abs(y2-y1);
}
dx = float(x2-x1)/k;
dy = float(y2-y1)/k;
x=x1;
y=y1;
for (i=0;iSetPixel(x, y, color);
x = x+dx;
y = y+dy;
}
}
网上好多人画图解释说明,这里我就不说了。
下面就是处理鼠标事件
我们先添加四个成员变量x1,y1,x2,y2表示线段端点坐标
添加完如下图
在菜单栏
view(视图) –> 鼠标事件 – >右边Class name 选择CXXXView(注:XXX为你的项目名)–>在Messages:找到WM_LBUTTONDOWN 双击或者先单击,再在右边选择Add Function
最后点击Edit Code
如图
这是鼠标单击响应事件函数,我们编辑代码:
void OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonDown(nFlags, point);
x1 = point.x;
y1 = point.y;
}
按照上面的方法步骤,继续添加鼠标左键松开的响应事件。
同时即可画出线段。
void OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
x2 = point.x;
y2 = point.y;
DDA_Line(x1,y1,x2,y2,RGB(255,0,0));
}
下面,我们以所画的线段为对角线,画一个矩形。
这个也很简单,自己画个图,就可以写出代码
DDA_Line(x1,y1,x2,y1,RGB(0,255,0));
DDA_Line(x1,y1,x1,y2,RGB(0,255,0));
DDA_Line(x1,y2,x2,y2,RGB(0,255,0));
DDA_Line(x2,y1,x2,y2,RGB(0,255,0));
打完收工。。。