ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

GDI绘图实践(Windows程序设计)

2020-05-13 12:05:57  阅读:386  来源: 互联网

标签:Windows MouseUp MouseMove 画布 绘图 GDI 图形 图元 public


前言

这次的作业逻辑略微有点混乱,后面才稍微有点清楚

完成功能

  • 提供对矩形/椭圆/直线/曲线的绘制,具有类似“橡皮筋”的视觉效果

  • 提供选项,允许用户对这些图形的颜色、线型、可填充性等属性进行选择

  • 抽象出一个图形基类,对每一种具体的图形类型进行独立编程,提供了更好的可扩展性

  • 实现重绘、永久保存/从文件加载图形集合,保存为图片等功能

  • 具有对图像进行擦除/复制/粘贴/剪切/撤销等基本操作

AYT_E_T7B_UEV_OVMS_0_~R.png

实现思路

双缓冲技术

  导致画面闪烁的关键原因是:窗口刷新一次的过程中,每一个图元的重绘都会立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。使用主画布和次画布,用户看不到次画布,闪烁等问题都留在次画布,最终完成之后再映射到主画布。

使用枚举和抽出基类

  • 使用枚举代码规范,可读性高
//枚举类型,各种绘图工具
        public  enum drawTools
        {
             Pen=0,Line, Ellipse, Rectangle, Rubber, None
        };
  • 抽出基类操作管理方便,简单高效
 public class Shape
    {
        //图形类型
        public drawTools DrawTool;

        public Pen pen;

        public Point start, end;

        public bool Fill;

        public Color FillColor;
        //一系列的点是为了记录曲线
        public List<Point> Points;
        //构造函数
        //显示函数

    }

利用MouseDown,MouseUp,MouseMove实现绘图

  总体思路就是MouseDown的时候初始化画布,MouseMove利用双缓冲来实现画布上的画图,MouseUp的时候将画的图形以数据的保存起来。复制,粘贴,剪切就是在MouseMove或者MouseUp的时候利用当前点找到所属图形,之后进行一系列操作。

源码

传送门

标签:Windows,MouseUp,MouseMove,画布,绘图,GDI,图形,图元,public
来源: https://www.cnblogs.com/xxhao/p/12881539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有