用VS建MFC工程,鼠标左键点击任意点,使用中点画线法连线

        效果:
        运行项目,任意点击画板空白处,点击第一次不连线(只有一个点),点击第二次开始,把这次点击的点和上次点击的点使用中点画线法进行连线。

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、效果

    运行项目出现弹窗提示功能

    点击任意点,第一次点击不连线,点两个点及之后多个点,对最近两次点击的点进行连线。并对每次点击的点坐标进行展示,线的颜色使用随机数生成。效果如下图所示:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值