WinForm画图

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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,用后请释放。

窗体的浏览效果:

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

以上是关于WinForm画图的主要内容,如果未能解决你的问题,请参考以下文章

WinForm画图

2017-5-3Winform 打印控件

关于ProcessOn在线做图工具上找不到宋体,黑体字体样式的解答

linux 环境下matplotlib 画图时不支持中文解决方案

linux 环境下matplotlib 画图时不支持中文解决方案

linux 环境下matplotlib 画图时不支持中文解决方案