C++语言学习笔记14:DrawScreen
MFC小项目: DrawScreen 截屏绘制插件
step 1 窗口样式修改
-
该插件不需要状态栏,因此进行如下修改:
-
该插件不需要菜单及标题和窗口边框,因此进行如下修改:
- 该插件截屏需要直接最大化显示,因此进行如下修改:
step 2 工具栏图标设置
-
资源文件->绘制图标->修改ID
-
工具栏显示
-
工具栏命令消息触发功能添加
以直线为例,鼠标按下抬起操作视图内出现直线,因此命令消息的处理放到视图中进行。
步骤:ON_COMMAND_RANGE -> 视图头文件类中函数申明 -> 视图源文件末进行函数定义
-
退出
-
-
工具栏位置设置成在底部
step 3 esc关闭窗口的快捷键设置
-
退出
step 4 窗口贴图(获取桌面)
-
绘图前需要在第一次重绘之前就先获取桌面截图,因此在构造函数中进行如下操作:
- 分析:由于快捷键Ctrl+Z撤销功能(撤销后删除当前贴图,在窗口贴上一张图),明显为栈区特性,先入后出。
- 分析:由于快捷键Ctrl+Z撤销功能(撤销后删除当前贴图,在窗口贴上一张图),明显为栈区特性,先入后出。
-
将获取到的图片贴到视图区域
PS:由于此处BitBlt需要窗口大小,为提高代码复用性,将上一步中获取窗口分辨率的部分进行如下修改,int x,y 放入到类中,函数中直接赋值,具体如下图所示:
step 5 功能填充
曲线功能
-
添加消息处理函数
-
以曲线功能为例,需要获取鼠标按下的坐标,因此类中设定一个获取坐标值的point,同时需要获取命令处理id,因此定义toolBarID
-
至此,开始编写功能
直线功能
-
接着曲线功能的if往下写即可,注意需要先贴图清除鼠标移动下每次的直线痕迹
矩形功能
-
据分析,除了曲线功能外,其他的都需要注意先贴图清除鼠标移动下每次的绘制痕迹,为提高代码复用性,可将该部分代码提取出来,程序修改情况如下:
-
绘制的矩形是带有填充的白色,期望将白色填充去除(利用空/透明的画刷),因此代码如下:
实心圆
-
-
期望不要边线或边线颜色与填充颜色一致,因此修改代码如下:
三角形
bug :绘制时图形闪烁明显
-
解决方案:加一个缓冲的dc,先绘制到缓冲dc上再贴入窗口,代码修改如下:
bug:只能绘制一次
- 情况:只能绘制一次,上一次绘制会被清除
- 解决方案:每完成一次(鼠标抬起)时需要保存窗口最新的图放到栈中。
step 6 ctrl+Z 快捷键撤回设置
-
情况:crtl+Z后没有撤回,但是crtl+Z后再画图时会撤回上次绘制的图,说明窗口重绘没有及时更新
-
解决方案:触发一下重绘函数
step 7 色板功能
-
-
PS:绘制功能中需要在各部分加上选中颜色的画笔或者画刷,下面仅截图两处作为举例,其他不做赘述。
step 8 填充功能
step 9 保存功能
- 栈顶图片保存到本地(DealToolBar//处理工具栏命令的消息 中完成)