C++的MFC实现Bresenham算法画直线,从菜单和鼠标响应开始包含代码的完整良心教程

这篇具有很好参考价值的文章主要介绍了C++的MFC实现Bresenham算法画直线,从菜单和鼠标响应开始包含代码的完整良心教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先在菜单栏中加入这个工具

c++ 绘制的线相应鼠标,c++,开发语言

然后给他一个ID,注意要全大写

c++ 绘制的线相应鼠标,c++,开发语言 

在类视图中右键你的view,选择属性

c++ 绘制的线相应鼠标,c++,开发语言 

在消息栏添加鼠标消息,此时会自动添加一个空函数体。

c++ 绘制的线相应鼠标,c++,开发语言 

 在事件栏添加鼠标事件,为按下菜单栏按钮的时候添加要做的事情。此时也会生成一个空函数体叫做void CMFCApplication1View::OnBreLine()

c++ 绘制的线相应鼠标,c++,开发语言

给void CMFCApplication1View::OnBreLine()添加代码:

void CMFCApplication1View::OnBreLine()
{
	// TODO: 在此添加命令处理程序代码
	MenuDrawType = 3;
	PressNum = 0;
}

 在void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)函数体中添加bresenham的算法代码:

void CMFCApplication1View::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);//定义当前绘图区
	CRect rect;
    if (MenuDrawType == 3) {//拿的是bre线段工具
		if (PressNum == 0) {//第一次点击
			startP = point;
			endP = point;//使线段一直都在,终点始终是鼠标
			PressNum++;
		}
		else {//第二次点击
			endP = point;
			double k, e;
			int p, deltaX, deltaY, x1, y1, x2, y2;
			x1 = startP.x;
			y1 = startP.y;
			x2 = endP.x;
			y2 = endP.y;
			deltaX = abs(x2 - x1);
			deltaY = abs(y2 - y1);
			p = 2 * deltaY - deltaX;
			int twoDy = 2 * deltaY;
			int twoDx = 2 * deltaX;
			int twoDyDx = 2 * (deltaY - deltaX);
			int twoDxDy = 2 * (deltaX - deltaY);
			int x, y, xEnd, yEnd;

			if (deltaX == 0) {//k不存在
				if (y1 < y2) {
					x = x1;
					y = y1;
					yEnd = y2;
				}
				else {
					x = x2;
					y = y2;
					yEnd = y1;
				}
				for (y; y < yEnd; y++) {
					SetPixel(dc, x, y, RGB(0, 0, 255));
				}
			}
			else {//k存在
				k = deltaY / (double)deltaX;
				if (k <= 1.0) {//斜率绝对值k小于等于1
					if (x1 > x2) {//向左
						x = x2;
						y = y2;
						xEnd = x1;
						SetPixel(dc, x, y, RGB(0, 0, 255));
						while (x < xEnd) {
							x++;
							if (p < 0)
								p += twoDy;
							else {
								if (y1 < y2)//左下
									y--;
								else//左上
									y++;
								p += twoDyDx;
							}
							SetPixel(dc, x, y, RGB(0, 0, 255));
						}
					}
					else {//向右
						x = x1;
						y = y1;
						xEnd = x2;
						SetPixel(dc, x, y, RGB(0, 0, 255));
						while (x < xEnd) {
							x++;
							if (p < 0)
								p += twoDy;
							else {
								if (y1 < y2)//右下
									y++;
								else//右上
									y--;
								p += twoDyDx;
							}
							SetPixel(dc, x, y, RGB(0, 0, 255));
						}
					}
				}
				else {//斜率绝对值k大于1
					if (y1 < x2) {//向下
						x = x1;
						y = y1;
						yEnd = y2;
						SetPixel(dc, x, y, RGB(0, 0, 255));
						while (y < yEnd) {
							y++;
							if (p < 0)
								p += twoDx;
							else {
								if (x1 < x2)//右下
									x++;
								else//左下
									x--;
								p += twoDxDy;
							}
							SetPixel(dc, x, y, RGB(0, 0, 255));
						}
					}
					else {//向上
						x = x2;
						y = y2;
						yEnd = y1;
						SetPixel(dc, x, y, RGB(0, 0, 255));
						while (y < yEnd) {
							y++;
							if (p < 0)
								p += twoDx;
							else {
								if (x1 < x2)//右上
									x--;
								else//左上
									x++;
								p += twoDxDy;
							}
							SetPixel(dc, x, y, RGB(0, 0, 255));
						}

					}
				}
			}
			PressNum = 0;
		}
	}
}

 就可以画线了。如果要添加橡皮筋效应……就dd我让我更新橡皮筋篇。

各位加油文章来源地址https://www.toymoban.com/news/detail-739347.html

到了这里,关于C++的MFC实现Bresenham算法画直线,从菜单和鼠标响应开始包含代码的完整良心教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MFC下CPictureCtrl控件基于鼠标左键坐标的直线绘图

    本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系本人将于及时删除 目录 1.创建自定义类CMyPictureCtrl 2.布局Dlg 3.实验代码 4.运行结果 在基于对话框的MFC应用程序中,通过鼠标操作获取坐标并在CPictureCtrl控件中使用LineTo()函数画直线,涉及以下几个关键步骤:

    2024年04月25日
    浏览(32)
  • 霍夫变换直线检测算法实现OpenCV(C++)

    一、原理 对于霍夫变换的原理这里就不进行描述啦,感兴趣的可以自行搜索。也可以看知乎上面的这篇贴文通俗易懂理解——霍夫变换原理。 二、算法代码 三、效果测试 测试代码 上述代码中的drawLine()函数是《OpenCV4快速入门》一书的代码清单 7-2中的原函数,只用于画线。

    2024年02月05日
    浏览(45)
  • 原生js使用canvas实现鼠标绘制直线

    目录 目录 一、原理 二、具体实现 (1)、创建画布 (2)、获取鼠标位置 (3)、创建线段类 (4)、创建主绘制类 (5)、绘制 (6)、效果图  三、源代码 1、原生js 2、vue3实现  直线可以看成是一小段一小段的线段组成,并且两点确定一条直线; 首先当鼠标左键点击时候

    2024年02月12日
    浏览(47)
  • OPENCV C++(九)鼠标响应+dft+idft

    鼠标响应回调函数(固定格式)    这个鼠标响应函数 就是鼠标左键按下后,会标记一个点,画一个白色点,并将这个点存储到points当中 鼠标响应函数  mousecallback就是窗口名称,后面是图像,中间是函数名 选取多边形roi区域函数(结合鼠标响应)  建立一个全白色的mat,用

    2024年02月13日
    浏览(32)
  • QT实现鼠标点击鼠标右键创建菜单(带图标)

    最近在开发项目时用到鼠标右键创建菜单的功能,在此做一些记录。 功能描述:QT实现点击鼠标右键创建菜单,菜单带图标,并且可以点击菜单栏选项,出现相应的界面。效果如下图所示: 实现原理:要实现上图效果,我用到QMenu,创建菜单项,将菜单项加入菜单,然后关联

    2024年02月15日
    浏览(35)
  • 使用Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单

    分享一个基于Vue实现一个当鼠标悬浮时出现,鼠标离开时消失的双层菜单。同时也是为了以后需要类似的需求时,可以提供一个实现思路,以及可以快速ctrl+c和ctrl+v操作,提高工作效率~ (1)/src/views/Example/DiyNavMenu/index.vue // Todo

    2024年02月05日
    浏览(41)
  • OPENCV C++(三)二值化灰度函数+调用摄像头+鼠标响应+肤色检测

    图像 目标图像 rgb转灰度 灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法 灰度图,目标图,大于阈值的转换的像素值,自适应方法,二值化方法 虽然人物的信息丢失了很多,但是背景基本上被去掉了。丢失的人物的信息可以通过位运算等恢复。在去除背景

    2024年02月14日
    浏览(52)
  • javascript实现自定义右键菜单(绑定鼠标左右键)

    思路: 1.绑定右键函数。 2.获取鼠标右键按下位置的x坐标(到左面的距离),y坐标(到上面的距离)。 3.获取滚动条向下滚动距离,获取滚动条向左滚动距离 4.最后+‘px’,补全单位,添加到元素style属性,将元素移动到鼠标右键位置 1绑定右键函数 2.获取鼠标右键按下位置的

    2024年02月09日
    浏览(35)
  • 【vue+ElementUI】实现web端鼠标右击打开菜单

    最近做的开源项目有个需求就是在 ElementUI 的 NavMenu 侧边栏中,实现鼠标右击打开菜单功能,今天实现了一下,做个记录。 鼠标右击打开菜单 在鼠标右击的位置打开菜单 点击菜单项即可关闭菜单 点击菜单外关闭菜单 菜单置于图层的最顶层 菜单动态样式 2.1.在鼠标右击的位置

    2024年02月09日
    浏览(50)
  • matplotlib实现按钮以及鼠标响应事件

    用matplotlib绘图时,想要添加按钮,首先需要导入 1、设置按钮的位置,第一个值为水平位置,第二个为竖直位置,第三、四个表示按钮的大小。button距离画布左边0.81倍位置,距离下边0.05倍位置,坐标轴的整体宽度和高度占0.1和0.075倍大小。 2、创建按钮,button_axes是放置按钮

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包