效果:
运行项目,任意点击画板空白处,点击第一次不连线(只有一个点),点击第二次开始,把这次点击的点和上次点击的点使用中点画线法进行连线。
1、添加消息函数
在项目中打开类向导,选择消息,找到OnLButtonDown,双击,点击右侧添加处理程序。
2、代码
代码中设置了颜色随机生成,鼠标在画板中左键点击,显示该点的坐标位置,不想要的可以注释。使用结构体存储坐标点的值。由于onLButtonDown中只存一个点的坐标,故在这里存点费了点功夫。通过i++和i--实现回滚,让每次新点击的点都能被存储到,以便连接新线。
void CMFCApplication2View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
int i = 0, x0 = 0, x1 = 0, y0 = 0, y1 = 0;
while(i < 1) {
CString str;
str.Format(_T("[%d,%d] "), point.x, point.y); //引号中的两个空格是为了消除重叠现象
CDC* pDC = GetDC();
pDC->TextOut(point.x, point.y, str); //窗口左上角坐标为(0,0),修改可改变鼠标坐标的显示位置
group[i].x = point.x;
group[i].y = point.y;
ReleaseDC(pDC);
CString IntType;
i++;
x0 = group[i].x;
y0 = group[i].y;
//IntType.Format(_T("msg %d %d %d"), i,group[i].x, group[i].y);
/*IntType.Format(_T("msg %d %d"),x0,y0);
MessageBox(IntType);*/
}
group[i].x = point.x;
group[i].y = point.y;
i--;
x1 = group[i].x;
y1 = group[i].y;
//CString IntType;
//IntType.Format(_T("msg %d %d"), x1,y1);
//MessageBox(IntType);
//IntType.Format(_T("(%d , %d ) (%d , %d)"), x0, y0, x1, y1);
//MessageBox(IntType);
//中点画线法连线
CDC* pDC = GetDC(); // 获得设备指针
if (x0 != 0||y0!=0) {
if (x0 > x1) {
int k = x0;
x0 = x1;
x1 = k;
k = y0;
y0 = y1;
y1 = k;
}
int c = RGB(0 + rand() % 255, 0 + rand() % 255, 0 + rand() % 254); //定义直线颜色
float x, y;
float dx, dy, k;
dx = (float)(x1 - x0);
dy = (float)(y1 - y0);
k = dy / dx;//计算斜率
y =float(y0); x = float(x0);
CString IntType;
IntType.Format(_T("k %f,dx %f,dy %f , (%d , %d ) (%d , %d),(%f,%f)"),k,dx,dy, x0, y0, x1, y1,x,y);
MessageBox(IntType);
//不能用abs(k),类型转化出问题,会导致k<-1的线画不出来
if (dx>dy)
{
for (; x <= x1; x++)
{
pDC->SetPixel(x, int(y + 0.5), c);
y = y + k;
}//x自增,y=y+k
}
else
{
for (; y <= y1; y++)
{
pDC->SetPixel(int(x + 0.5), y, c);
x = x + 1 / k;
}
}
}
ReleaseDC(pDC); //释放设备指针
CView::OnLButtonDown(nFlags, point);
}
3、效果
运行项目出现弹窗提示功能
点击任意点,第一次点击不连线,点两个点及之后多个点,对最近两次点击的点进行连线。并对每次点击的点坐标进行展示,线的颜色使用随机数生成。效果如下图所示: