一个优秀的C#开源绘图软件 DrawTools

2023-10-29

1、Extensions to DrawTools

Author

I develop software for a leading healthcare system in Northern Illinois.

Draw Tools Redux Image

Introduction

Alex Fr provided an excellent set of drawing tools in his DrawTools article and these tools serve as a basis for this article, which expands on the original toolset in the following ways:

  1. In addition to the basic Rectangle, Ellipse, Line and Scribble tools, this version adds PolyLine, Filled Ellipse, Filled Rectangle, Text and Image tools
  2. Multiple drawing Layers
  3. Zooming
  4. Panning
  5. Rotation

In this article, I will describe how Layers were implemented, as well as the Text and Image tools.

Background

See the original DrawTools article for details on how the basic application is built, class structure, etc.

It is also assumed that the reader has a working understanding of GDI+ fundamentals, including Matrices. For an excellent introduction to GDI+, see www.bobpowell.net.

Implementing Layers

Adding Layers to the application involved adding two classes, Layer and Layers, where Layer defines a single Layer and Layers defines the collection of Layers in an ArrayList.

Each Layer exposes the following properties:

private string _name;
private bool _isDirty;
private bool _visible; private bool _active; private GraphicsList _graphicsList; 

Note that the Layer contains the GraphicsList - this is the key to the whole thing - each Layer contains its own list of drawing objects instead of DrawAreaDrawArea is modified to declare a Layers collection instead of a GraphicsList collection:

// Define the Layers collection
private Layers _layers;

When DrawArea is initialized, the Layers are initialized by creating the first Layer and setting it Active and Visible:

public DrawArea()
{
// create list of Layers, with one default active visible layer
_layers = new Layers();
_layers.CreateNewLayer("Default"); _panning = false; _panX = 0; _panY = 0; // This call is required by the Windows.Forms Form Designer. InitializeComponent(); } 

In the Layers class, the CreateNewLayer() method actually creates the new Layer:

/// <summary>
/// Create a new layer at the head of the layers list and set it /// to Active and Visible. /// </summary> /// <param name="theName">The name to assign to the new layer</param> public void CreateNewLayer(
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个优秀的C#开源绘图软件 DrawTools 的相关文章

随机推荐

  • 归并排序(C)递归与分治策略

    归并排序 C 习题描述 题目描述 采用归并排序算法 并利用递归函数完成n个数字 n lt 100 的从小到大排序 输入描述 输入包括两行 第一行1个数字n 表示要排序的数字的个数 第二行有连续n个待排序数字 输出描述 输出只有一行 有n个排
  • Weex内置组件的使用——Weex的学习之路(二)

    最近公司项目不是很忙 就和组内成员商量利用时间学学新技术 最终在Weex和Flutter做选择 Weex是由阿里的大牛们开发出来语言 Flutter是由Google公司开发的 各种网上查找得出的评论都是Flutter更有前景 但是最终我们还
  • unity-Camera参数介绍、种类、操作以及获取相机截图画面

    总结一下学到的Camera 相关知识 unity中的Camera unity中相机参数介绍 Camera种类 对相机操作 截取相机画面到本地 unity中的Camera 相机是我们观察游戏世界的窗口 在unity中至少需要一个相机 可以使用
  • 使用Git在cmd控制台上传到Gitee平台文件

    注 以下操作实在Git安装完整且环境配置成功后才可正常操作 还需提前注册好Gitee账号 一 选择你要上传的文件夹 进到文件夹目录 输入cmd进入控制台 在控制台输入Git v 查询自己的Git环境变量是否配置成功 控制台继续输入Git i
  • Linux进程栈区、堆区、数据区、程序区

    1 内存映射 堆区 栈区 程序区 数据区 函数参数从右向左入栈 栈溢出原理 栈中保存的局部变量缓冲区发生溢出 导致栈中其它存储单元内容被重写 导致溢出的常用函数strcpy memcpy 1 gt 栈区 主要用来存放局部变量 传递参数 存放
  • MAE ViT过程,随机选取75%的patch mask掉。将原始图像分块作为一个list,然后random shuffle一遍,选取shuffle后在list中排在后75%的 patch,将他们ma

    在看到ViT出来的时候 我就在想 既然都已经把图像token化了 并且结构上都保持与BERT一致 那为什么最后的预训练目标非得是图像分类而不直接保持BERT的Mask Language Model的预训练目标呢 果然 在MAE中就尝试了这种
  • Ubuntu 16.04 x64搭建GitLab服务器操作笔记

    本人在作业部落上的原文 https www zybuluo com lovemiffy note 418758 本文主要记录在Ubuntu 16 04操作系统中搭建GitLab服务器的操作记录 以下是操作步骤 主要参考资料 https ab
  • OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人

    内容一览 她时代 来临 一些有着强大信念与热情的女性 纷纷投身至 AI 领域 成为不可或缺的存在与力量 值此国际妇女节到来之际 HyperAI超神经盘点了领域内令人印象深刻的杰出的女性代表 关键词 国际妇女节 人工智能 杰出女性 技术本无关
  • 南丁格尔玫瑰图

    1 绘制南丁格尔玫瑰图的步骤 数据准备工作 准备好角度数值和半径数值 建立画布 并将直角坐标转化为极坐标 并对极坐标进行一定的设置 使用bar函数进行绘图 对图形进行美化处理 2 上代码 import numpy as np import
  • 基于SSM的教师管理系统

    文末获取源码 项目技术栈 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用HTML和Vue相结合开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Ec
  • CocosCreater 教程(中)

    1 图形渲染 1 1 渲染管线 RenderPipeline 用于控制场景的渲染流程 包括光照管理 物体剔除 渲染物体排序 渲染目标切换等 引擎默认使用 前向渲染管线 前向渲染管线的执行流程如下图所示 1 2 相机 游戏中的相机是用来捕捉场
  • linux查看MySQL服务状态

    最近自己的博客服务器总是挂掉 虽然用的是阿里云配置比较低的 但是之前也是好好的还相对比较稳定的 感觉这套路云又在搞事情 首先要看一下MySQL服务状态 一般来说我们都会用命令交互命令mysql来 service mysql status 但
  • 《管理的套路》简述(一)

    1 SMART原则 适用于目标设定 任务委派 Specific 具体明确的 Measurable 可衡量的 Achievable or Attainable 可达成的 Relevant or Realistic 相关的或现实的 Time l
  • 《AI秘籍》预告

    Hi 大家好 我是茶桁 这里为自己做个广告 目前打算开始写一整个系列 AI秘籍 这一段时间内我写过一个系列 零基础学习大语言模型 目前还没写完 说实话 这个系列其实原出处并不是我 严谨的说来 有涉嫌擦边 洗稿 的嫌疑 所以最后放弃了收费的想
  • Shiro面试必问

    Shiro的优点 简单的身份认证 支持多种数据源 对角色的简单的授权 支持细粒度的授权 方法级 支持一级缓存 以提升应用程序的性能 内置的基于 POJO 企业会话管理 适用于 Web 以及非 Web 的环境 非常简单的加密 API 不跟任何
  • Sass 基础教程——安装

    本篇主要如何安装 Sass 并不需要 CSS 知识 不过对 CSS 不熟悉的同学可参考我之前写的系列教程 CSS入门篇 CSS进阶篇 CSS高级篇 上一篇我们提到过 Sass 是一种 CSS 的扩展语言 也是一种脚本语言 需要转换成 CSS
  • MyBatis-Plus学习笔记

    一 MyBatis Plus 1 简介 MyBatis Plus opens new window 简称 MP 是一个 MyBatis opens new window 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发
  • 【Python】群体智能算法优化支持向量机

    Python 群体智能算法优化支持向量机 本文主要介绍了基于流行智能算法Grey Wolf Optimizer GWO 来优化支持向量机模型的代码 from sklearn svm import SVR import pandas as p
  • 解决 TypeError: 'NoneType' object has no attribute '__getitem__'

    其实这个问题的出现一般是某个变量是空 也就是 NoneType 类型导致的 大致按照这个方向排错即可解决 最近在处理一个图片问题的时候 大致写的代码是把某个路径下面的图片找到 读到内存里面 在依据x1 y1 x2 y2四个坐标值把图片的RO
  • 一个优秀的C#开源绘图软件 DrawTools

    1 Extensions to DrawTools Author Mark Miller I develop software for a leading healthcare system in Northern Illinois Dow