由于一直在弄Qt,MFC基本没接触过,加上上课不认真听讲,没想到老师布置的一项简单作业就使我焦头烂额,最后通过各种百度,查MSDN,终于做完了作业,但觉得里面很多内容百度上都没有,很多都是自己一遍一遍尝试出来的,所以就写了博文,以便大家分享与指点

题目:鼠标处点击生成一张图标,图标中点为鼠标点击位置

第一步:导入bitmap图片
1、新建一个MFC单文档工程
2、导入bmp图片,vc6.0只支持bmp格式的图片,而且必须在24位及以下才显示得出来,这里推荐大家用电脑自带画图工具,导出时选择如下:
3、将导出的图片放到项目文件夹中,在vc6.0中选择insert>>资源>>bitmap>>引入,选择所有文件类型,导入刚才的图片,id名默认为IDB_BITMAP1

第二步:实现鼠标点击响应函数

第三步:代码实现
在view类头文件中添加bitmap成员变量,防止局部变量被释放

private:CBitmap bitmap;

在鼠标事件中添加代码:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);//实例绘画工具bitmap.LoadBitmap(IDB_BITMAP1);//加载图片CBrush brush(&bitmap);//创建画刷CPoint point1(point);CPoint point2(point.x+80,point.y+80);CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2dc.FillRect(&xRect,&brush);//用画刷出一个矩形CView::OnLButtonDown(nFlags, point);
}


发现绘制几次之后并不是我们想要的效果,没有实例化出一个一个图标,反而图标是连在一起的,而且图标大小也不对
解决方法
在构造函数加上


CDrawIconView::CDrawIconView()
{// TODO: add construction code herebitmap.LoadBitmap(IDB_BITMAP1);//加载图片
}

通过SetBrushOrg函数我们可以改变笔刷起点位置,每次鼠标事件均改变一次,则图案不连在一起,默认参数为(0,0),改为变量point,鼠标事件代码改为:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);//实例绘画工具CBrush brush(&bitmap);//创建画刷dc.SetBrushOrg(point);//改变笔刷起点CPoint point2(point.x+80,point.y+80);CRect xRect(point,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2dc.FillRect(&xRect,&brush);//用画刷出一个矩形CView::OnLButtonDown(nFlags, point);
}

效果为:

图标已经不连在一起了,但是大小不对,而且每次实例化的位置也不对,找到图标,点击属性,我们可以看到,图标的宽与高
则我们通过代码 dc.SetBrushOrg(point.x-88,point.y-84);可以实现每次都在鼠标点击处实例化一个图标,并且图标不连在一起,
然后通过创建两个点作为矩形的左上角与右下角点参数,我们可以实现鼠标点击处生成图标,并且图标大小与原图标一致

 CPoint point1(point.x-88,point.y-84);CPoint point2(point.x+88,point.y+84);

所以鼠标事件代码如下:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);//实例绘画工具CBrush brush(&bitmap);//创建画刷dc.SetBrushOrg(point.x-88,point.y-84);//改变笔刷起点CPoint point1(point.x-88,point.y-84);CPoint point2(point.x+88,point.y+84);CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2dc.FillRect(&xRect,&brush);//用画刷出一个矩形CView::OnLButtonDown(nFlags, point);
}

我们发现效果是这样的,明显已经达到了要求

补充:
虽然效果实现了,但并不是最好的,在上面我们是通过数字使得图标有效果,但是如果换了个图标,那么是不是又要改变数字。如果能够访问到图标的宽与高,就可以解决这个问题
代码如下:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: Add your message handler code here and/or call defaultCClientDC dc(this);//实例绘画工具BITMAP bmp;//通过该结构体可以访问图片宽高bitmap.GetBitmap(&bmp);CBrush brush(&bitmap);//创建画刷dc.SetBrushOrg(point.x-bmp.bmWidth/2,point.y-bmp.bmHeight/2);//改变笔刷起点CPoint point1(point.x-bmp.bmWidth/2,point.y-bmp.bmHeight/2);CPoint point2(point.x+bmp.bmWidth/2,point.y+bmp.bmHeight/2);CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2dc.FillRect(&xRect,&brush);//用画刷出一个矩形CView::OnLButtonDown(nFlags, point);
}

效果依然不变

虽然只是一个很简单的绘图事件的学习,但如果一个人做的话,在过程中寻找各种方法也可以学到许多内容

MFC开发——点击页面生成图标功能相关推荐

  1. MFC开发——卡拉OK字幕制作

    依然是为了赶老师作业,又去学了点东西,然后做了个小项目.首先在开始做项目之前,说一下整体思路,要实现卡拉OK字幕效果,就要对文本类与定时器有一定的掌握,通过定时器的更新,可以实现字体颜色的变化,与字幕 ...

  2. 【Visual Studio 2019】创建 MFC 桌面程序 ( 安装 MFC 开发组件 | 创建 MFC 应用 | MFC 应用窗口编辑 | 为按钮添加点击事件 | 修改按钮文字 | 打开应用 )

    文章目录 一.安装 MFC 开发组件 二.创建 MFC 应用 三.MFC 应用窗口编辑 四.为按钮添加点击事件 五.修改按钮文字 六.打开系统其它应用 七.博客源码 一.安装 MFC 开发组件 打开 ...

  3. HTML下拉菜单去掉点,jQuery点击页面其他部分隐藏下拉菜单功能

    一.开发小要点 web页面中,我们一般不用select.option来实现下拉菜单效果,因为下拉框的样式丑且难以美化,所以我们选择控制ul显示隐藏来实现同样且高大上的效果,但是不能像下拉框那样点击页面 ...

  4. 最新鲁班H5页面生成工具系统源码+功能强大/仿易企秀

    正文: 最新鲁班H5页面生成工具系统源码+功能强大/仿易企秀,这系统的功能真的非常强大,都是主流很高级的一些技术开发的. Vue2.0开发,通过拖拽的形式,生成页面的工具,类似易企秀.百度H5等工具. ...

  5. 微信小游戏开发实战教程13-随机生成形状功能的实现

    微信小游戏开发实战系列的第13篇. 本节内容包括:通过使用列表来实现可以设置权重的随机功能,以及游戏中的随机生成形状功能的具体实现. 如果你没有任何的游戏开发经验,欢迎阅读我的"人人都能做游 ...

  6. H5页面开发怎么做?分析H5页面开发令人期待的 5 项功能。

    来源品略网:http://www.pinlue.com/article/2020/03/0518/019985707535.html H5页面开发怎么做-H5页面开发令人期待的 5 项功能 HTML ...

  7. Visual studio C++ MFC之点击按钮(菜单栏)生成新窗口

    背景 当前做的APP有菜单栏,菜单栏有一项需要对下位机相关参数进行设置,则必须弹出一个窗口来实现设置操作.本篇即对点击菜单栏生成新的窗口,在新的窗口内完成相应计划后结束新窗口并返回原窗口的方法进行简述 ...

  8. php读取模板生成静态功能,php 生成静态页面的办法与实现代码详细版

    php中主要用到的就是要用到fread()和fwirte().而静态页面生成了之后,就会牵扯到修改的问题.这里可以用到正则匹配的方法来替换模版中改变的部位.不过此种方法太麻烦,值得推荐的方法是直接把原 ...

  9. android开发 转跳功能,如何在Android中利用Intent实现一个页面跳转功能

    如何在Android中利用Intent实现一个页面跳转功能 发布时间:2021-02-20 17:06:31 来源:亿速云 阅读:113 作者:Leah 本篇文章为大家展示了如何在Android中利用 ...

最新文章

  1. python外星人入侵游戏图片_跪求一个问题@关于外星人入侵游戏(《python编程基础从入门到实...
  2. 题目1009:二叉搜索树
  3. Linux疑难杂症解决方案100篇(二)-SHELL编程函数的定义及调用
  4. flutter项目打包.exe文件发布windows版
  5. Java集合篇:fail-fast机制 与 fail-safe
  6. 列举Java开发者必不可少的9大编程网站
  7. nx set 怎么实现的原子性_【redis进阶(1)】redis的Lua脚本控制(原子性)
  8. jmeter+WebDriver:启动浏览器进行web自动化
  9. 这里有众多领域的数据集,然后还有一百万奖金等你来战!
  10. 如何用Pygame写游戏(二十)
  11. (18) HTML面试题集锦2
  12. Android Studio:Support Library依赖包的版本号
  13. Q4财报净亏损8350.2万美元,Unity何时摆脱亏损“魔咒”?
  14. 中国移动光猫外接一个路由器的方法
  15. 假设有一张纸可对折无限次,它的厚度为0.1毫米,珠穆朗玛峰的高度为8848.86米,求这张纸对折多少次后它的厚度会超过珠峰的高度。
  16. mysql中avg函数如果有空值_对于 AVG 函数,如果列中所有行的值都是 null,那么 AVG 函数返回的值是( )...
  17. 两张独立显卡连接两个显示器如何配置
  18. 全国各省-土地转让收入(1995-2019年)
  19. vue 引入 自定义字体文件
  20. [运放] 骨灰级运放LM1875T做功放板,音质刚刚的

热门文章

  1. vue开源项目(各大插件,gitup源码)
  2. 使用DW 创建一个注册网页
  3. Excel刷新数据时出现“查询XXX(步骤”XXX“)将引用其他查询或步骤,因此可能不会直接访问数据源。请重新生成此数据组合。”的解决办法
  4. sony的故事 第 35 章 【完结】
  5. 0.96寸ST7735的LCD 4线SPI调试小坑记录
  6. Matlab中导出清晰图片
  7. 视灯指数《2021 年度视频号互联网发展白皮书》:5 亿+DAU 的视频号,全面加速微信生态共建
  8. java创建的zip无法打开或打开显示不可预料的压缩文件
  9. 安卓手机管理软件_老牌管理软件,已破,无广告,全功能不受限。安替换手机文件管理软件吧。...
  10. 解决ps打开图片错误:无法完成请求,找不到不知名或无效的JPEG标志符类型