C++语言学习笔记14:DrawScreen 截屏绘制插件

MFC小项目: DrawScreen 截屏绘制插件

已上传资源:点击此行文字可进行下载< DrawScreen 截屏绘制插件>并直接运行。

step 1 窗口样式修改
  1. 该插件不需要状态栏,因此进行如下修改:

    image-20220408124232826

  2. 该插件不需要菜单及标题和窗口边框,因此进行如下修改:

image-20220413150851049

  1. 该插件截屏需要直接最大化显示,因此进行如下修改:

img

step 2 工具栏图标设置
  1. 资源文件->绘制图标->修改ID

    image-20220408132839147

image-20220413150958574

  1. 工具栏显示

    image-20220408133417553

  2. 工具栏命令消息触发功能添加

    以直线为例,鼠标按下抬起操作视图内出现直线,因此命令消息的处理放到视图中进行。

    步骤:ON_COMMAND_RANGE -> 视图头文件类中函数申明 -> 视图源文件末进行函数定义

    image-20220408134752113

    image-20220408134825110

    image-20220408134855584

    • 退出

      image-20220408135651067

  3. 工具栏位置设置成在底部

    image-20220408135218197

step 3 esc关闭窗口的快捷键设置
  • 退出

    image-20220408140720161

    image-20220408140916407

step 4 窗口贴图(获取桌面)
  • 绘图前需要在第一次重绘之前就先获取桌面截图,因此在构造函数中进行如下操作:

    • 分析:由于快捷键Ctrl+Z撤销功能(撤销后删除当前贴图,在窗口贴上一张图),明显为栈区特性,先入后出。
      image-20220408142514988

    image-20220408142648197

  • 将获取到的图片贴到视图区域

    image-20220408143623982

    PS:由于此处BitBlt需要窗口大小,为提高代码复用性,将上一步中获取窗口分辨率的部分进行如下修改,int x,y 放入到类中,函数中直接赋值,具体如下图所示:

image-20220413151032498
image-20220408143824634

step 5 功能填充
曲线功能
  • 添加消息处理函数

    image-20220408161636523

image-20220413151400645

  • 以曲线功能为例,需要获取鼠标按下的坐标,因此类中设定一个获取坐标值的point,同时需要获取命令处理id,因此定义toolBarID

    image-20220408163344371

image-20220413151429203

  • 至此,开始编写功能

    image-20220408163933853

直线功能
  • 接着曲线功能的if往下写即可,注意需要先贴图清除鼠标移动下每次的直线痕迹

    image-20220408164608417

矩形功能
  • 据分析,除了曲线功能外,其他的都需要注意先贴图清除鼠标移动下每次的绘制痕迹,为提高代码复用性,可将该部分代码提取出来,程序修改情况如下:

    image-20220408165445972

  • 绘制的矩形是带有填充的白色,期望将白色填充去除(利用空/透明的画刷),因此代码如下:

    image-20220408165953566

实心圆
  • image-20220408170147653

  • 期望不要边线或边线颜色与填充颜色一致,因此修改代码如下:

    image-20220408170334401

三角形
  • image-20220408173051167
bug :绘制时图形闪烁明显
  • 解决方案:加一个缓冲的dc,先绘制到缓冲dc上再贴入窗口,代码修改如下:

    image-20220408174714741

    image-20220408174038024

bug:只能绘制一次
  • 情况:只能绘制一次,上一次绘制会被清除
  • 解决方案:每完成一次(鼠标抬起)时需要保存窗口最新的图放到栈中。
  • image-20220408175619651
step 6 ctrl+Z 快捷键撤回设置
  • image-20220408181407638

image-20220413151511485

  • 情况:crtl+Z后没有撤回,但是crtl+Z后再画图时会撤回上次绘制的图,说明窗口重绘没有及时更新

  • 解决方案:触发一下重绘函数

    image-20220408182228772

step 7 色板功能
  • image-20220408183548030

    image-20220408183612691

  • PS:绘制功能中需要在各部分加上选中颜色的画笔或者画刷,下面仅截图两处作为举例,其他不做赘述。
    image-20220413151538880
    image-20220413151605762

step 8 填充功能
  • image-20220408190213957

    image-20220408190247627

step 9 保存功能
  • 栈顶图片保存到本地(DealToolBar//处理工具栏命令的消息 中完成)
  • image-20220408212830605
step 10 回收空间
  • image-20220408215054128
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

97Marcus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值