WinForm(十二)画图

在.NET中,画图主要是通过Graphics类实现的,这个类主要通过两类方法完成画图,一类是DrawXXX,画各种线条图形;另一类是FillXXX,用各种形状,填充各种图形。Graphics是画板,Draw各个方法是各种盏笔(不过在调用Draw方法时,参数需要一个Pen对象),Fill的各个方法就是种种刷子(确实Fill的方法参数也需要一个Brush对象)。首先要熟悉各个Draw和Fill方法,以及他们的参数,那么剩下的事就是对坐票了,画什么,在那里画,怎么用Draw和Fill了。

下面是在Form上画了一个小票,然后调用打印组件在虚拟打印机里打印出来的效果。

using QRCoder;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;namespace WinFormsDemo12
{public partial class Form1 : Form{public Form1(){InitializeComponent();}void Draw(Graphics graphics){var y = 15;using var logo = new Bitmap(Directory.GetCurrentDirectory() + "/aeon.png");graphics.DrawImage(MakeGrayscale(logo), 60, y, 200, 80);graphics.DrawLine(new Pen(Color.Black, 2), 10, y += 80, 310, y);graphics.DrawLine(new Pen(Color.Black, 2), 10, y += 4, 310, y);var font = new Font("黑体", 10);var brush = new SolidBrush(Color.Black);graphics.DrawString("分店:012", font, brush, 10, y += 1);graphics.DrawString("店员:张三", font, brush, 160, y);graphics.DrawString($"时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}", font, brush, 10, y += 20);var no = "000000000001";graphics.DrawString($"流水号:{no}", font, brush, 10, y += 20);graphics.DrawLine(new Pen(Color.Black, 2), 10, y += 25, 310, y);graphics.DrawString("名称       数量  单价  金额", font, brush, 10, y += 5);graphics.DrawString("西红柿     500g  26.00 15.00", font, brush, 10, y += 20);graphics.DrawString("西葫芦    1000g  23.00 23.00", font, brush, 10, y += 20);graphics.DrawString("茄子       500g  50.00 25.00", font, brush, 10, y += 20);graphics.DrawString("豆角       500g  38.00 19.00", font, brush, 10, y += 20);graphics.DrawLine(new Pen(Color.Black, 2), 10, y += 20, 310, y);graphics.DrawLine(new Pen(Color.Black, 2), 10, y += 4, 310, y);var sumfont = new Font("黑体", 12);graphics.DrawString("              小计:82", sumfont, brush, 10, y += 5);var qrCodeAsBitmapByteArr = PngByteQRCodeHelper.GetQRCode(no, QRCodeGenerator.ECCLevel.Q, 20, false);using var qrcode = Image.FromStream(new MemoryStream(qrCodeAsBitmapByteArr));graphics.DrawImage(qrcode, 100, y += 50, 120, 120);}public static Bitmap MakeGrayscale(Bitmap original){var newBitmap = new Bitmap(original.Width, original.Height);var g = Graphics.FromImage(newBitmap);var colorMatrix = new System.Drawing.Imaging.ColorMatrix(new float[][]{new float[] {.3f, .3f, .3f, 0, 0},new float[] {.59f, .59f, .59f, 0, 0},new float[] {.11f, .11f, .11f, 0, 0},new float[] {0, 0, 0, 1, 0},new float[] {0, 0, 0, 0, 1}});var attributes = new System.Drawing.Imaging.ImageAttributes();attributes.SetColorMatrix(colorMatrix);g.DrawImage(original, new Rectangle(0, 0, original.Width, original.Height), 0, 0, original.Width, original.Height, GraphicsUnit.Pixel, attributes);g.Dispose();return newBitmap;}   private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e){if (e.Graphics != null){Draw(e.Graphics);}}private void button2_Click(object sender, EventArgs e){printDocument1.Print();}private void button1_Click(object sender, EventArgs e){var graphics = this.CreateGraphics();Draw(graphics);}}
}

MakeGrayscale方法是把彩色logo转黑白的一个算法,关注画图部分请忽略。

Graphics实现了IDisposable,用后请释放。

窗体的浏览效果:

38403f84f6a3cb85b001111ca9b61b14.png

虚拟打印机输出的PDF效果图:

e2432f3756beb71591c384a53af6bae5.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从4个方面简单介绍SaaS

你了解什么是SaaS吗?SaaS有什么优势?选择SaaS平台要注意哪些要素?在这里,怡海软件将针对这些问题进行简单介绍: 什么是SaaS?SaaS是Software-as-a-Service(软件即服务)的简称&#xf…

腾讯的一笔画游戏--巧妙解法

根据这个图形我们可以发现图中的规律。 所有数据的和 所有边长的和-最后一个形状的一个边-除最后一个边之外所有边的一半。 知道了这个规律后我们就很容易去实现代码了: 这里的解决关键点为——“余弦定理”,因为角度我们可以用(n-2&#xf…

Map value类型不同的写法

Map value类型不同的写法 Map<String, Object> accountMapnew HashMap<String, Object>(); int userId data.get("userId").getAsInt(); int accType data.get("accType").getAsInt();String name data.get("accType").getAsStr…

mysql中局部变量说法正确的是_mysql全局变量和局部变量

全局变量和局部变量在服务器启动时&#xff0c;会将每个全局变量初始化为其默认值(可以通过命令行或选项文件中指定的选项更改这些默认值)。然后服务器还为每个连接的客户端维护一组会话变量&#xff0c;客户端的会话变量在连接时使用相应全局变量的当前值初始化。举一个例子&a…

Web应用架构-Full-text Search Service

Elasticsearch转载于:https://www.cnblogs.com/zhitianji/p/9728016.html

终于找到你!如何将前端console.log的日志保存成文件?

本篇文章来自一个需求&#xff0c;前端websocket会收到各种消息&#xff0c;但是调试的时候&#xff0c;我希望把websoekt推送过来的消息都保存到一个文件里&#xff0c;如果出问题的时候&#xff0c;我可以把这些消息的日志文件提交给后端开发区分析错误。但是在浏览器里&…

基于 .NET 6 开发的开源远程终端工具

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘记关注。今天介绍一个非常实用的工具 mRemoteNG&#xff0c;这是一个基于 .NET 6 开发的远程终端软件&#xff0c;开源免费&#xff0c;不用担心版权和软件费用…

mysql 行列转换 动态_mysql 行列动态转换的实现(列联表,交叉表)

(1)动态&#xff0c;适用于列不确定情况create table table_name(id int primary key,col1 char(2),col2 char(2),col3 int);insert into table_name values(1 ,A1,B1,9),(2 ,A2,B1,7),(3 ,A3,B1,4),(4 ,A4,B1,2),(5 ,A1,B2,2),(6 ,A2,B2,9),(7 ,A3,B2,8),(8 ,A4,B2,5),(9 ,A1,…

第六次作业—例行报告

本周PSP 进度条 代码累计折线图 博文累计折线图 本周饼状图 转载于:https://www.cnblogs.com/zej87/p/7738895.html

Tomcat7/8开启WebDAV的支持

WebDAV是一种超文本传输协议&#xff0c;Tomcat默认是支持WebDAV的&#xff0c;且默认为禁用状态。 更多详细信息&#xff0c;请参考&#xff1a; https://zh.wikipedia.org/wiki/WebDAV http://www.webdav.org/ 开启步骤如下&#xff1a; 1、在Tomcat的webapps目录下新建webda…

算法复杂度分析(下)

前一篇文章算法复杂度分析&#xff08;上&#xff09;讲述了复杂度的大 O 表示法和几个分析原则&#xff0c;这篇文章我们来讲讲另外几种复杂度&#xff0c;最好情况时间复杂度&#xff08;best case time complexity&#xff09;、最坏情况时间复杂度&#xff08;worst case t…

免费分享一些.NET Core比较优秀的社区资料和微软官方资料

这次小编所分享的这套笔记手册&#xff0c;主要是分享一些.NET Core比较优秀的社区资料和微软官方资料。已经把所有的重要知识点进行了完整的归类和整理&#xff0c;可以让大家更清晰和快速的学习.NET Core&#xff0c;不浪费任何多余的时间&#xff01;全网首发&#xff01;相…

python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

问题引入在小强学PythonOpenCV之&#xff0d;1.4.2裁剪一节&#xff0c;我们使用的是numpy数组切片功能实现图片区域的裁剪。那么&#xff0c;如果我们想要裁剪图像中任意形状的区域时&#xff0c;应该怎么办呢&#xff1f;答案是&#xff0c;使用掩膜(masking)。但是这一节我们…

51 Nod 1670 打怪兽

1670 打怪兽lyk在玩一个叫做“打怪兽”的游戏。游戏的规则是这样的。lyk一开始会有一个初始的能量值。每次遇到一个怪兽&#xff0c;若lyk的能量值>怪兽的能量值&#xff0c;那么怪兽将会被打败&#xff0c;lyk的能量值增加1&#xff0c;否则lyk死亡&#xff0c;游戏结束。若…

QQ协议调试器 QQDebugger

QQ协议老变&#xff0c;为了分析协议&#xff0c;单用抓包工具还是不够的&#xff0c;还是得需要很好的调试工具。在网上找了几个调试工具&#xff0c;易用性均欠佳&#xff0c;不得已自己开发了一个 QQDebugger&#xff0c;不敢专美&#xff0c;特意发布出来。QQDebugger 在功…

PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.5. 修改表

5.5. 修改表 5.5.1. 增加列5.5.2. 移除列5.5.3. 增加约束5.5.4. 移除约束5.5.5. 更改列的默认值5.5.6. 修改列的数据类型5.5.7. 重命名列5.5.8. 重命名表当我们已经创建了一个表并意识到犯了一个错误或者应用需求发生改变时&#xff0c;我们可以移除表并重新创建它。但如果表中…

Uptime-Kuma 一个轻量的开源监控工具

点击蓝字 关注我们你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘记关注。今天给大家介绍一个开源的监控工具 Uptime Kuma, 主要用来监控 Web 以及网络, 和 Prometheus 相比, 它是轻量的, Uptime Kuma 是基于…

怎么查看mysql正在运行的语句_MySQL如何查询当前正在运行的SQL语句

通过status命令&#xff0c;查看Slow queries这一项&#xff0c;如果值长时间>0,说明有查询执行时间过长以下为引用的内容&#xff1a;mysql> status;--------------mysql Ver 11.18 Distrib 3.23.58, for redhat-linux-gnu (i386)Connection id: 53Current database: (n…

SpringBoot实战之SpringBoot自动配置原理

SpringBoot 自动配置主要通过 EnableAutoConfiguration, Conditional, EnableConfigurationProperties 或者 ConfigurationProperties 等几个注解来进行自动配置完成的。EnableAutoConfiguration 开启自动配置&#xff0c;主要作用就是调用 Spring-Core 包里的 loadFactoryName…

Install OpenCV-Python in Ubuntu

之前安装python版opencv&#xff0c;需要下载whl文件&#xff0c;进行安装&#xff0c;这是在window环境下的&#xff1a;安装opencv_python,下载whl包安装系统python下的opencv 今天发现一个简单的方法。Install OpenCV-Python in UbuntuInstall package python-opencv with f…