C# GDI+编程之Graphics类

news2025/1/11 2:56:09

最近需要使用到C#DrawLine绘制直线这个功能,对这个了解的不多,记录一下使用的时候遇到的问题。

绘制线的基础部分,这个之前在《C#自学笔记(四十)之Windows绘图》就写过,有兴趣的可以看下

我这里主要说下Graphics类。

GDI+是GDI的后继者,它是.NET Framework为操作图形提供的应用程序编程接口,主要用在窗体上绘制各种图形图像,可以用于绘制各种数据图像、数学仿真等。

Graphics类是GDI+的核心,它提供将对象绘制到显式设备的方法。Graphics类封装了绘制直线、曲线、圆形、图像和文本的方法,是一切GDI+操作的基础类。在绘图之前,必须在指定的窗体上创建一个Graphics对象,才能调用Graphics类的方法画图。

1.1 Paint事件

在窗体或控件的Paint事件中创建,将其作为PaintEventArgs的一部分。在为控件创建绘制代码时,通常会使用此方法。

例如,在Paint事件中创建Graphics对象:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
      //创建Graphics对象实例
      Graphics g = e.Graphics;
      //设置画笔颜色和宽度            
      Pen p = new Pen(Color.Black, 1);
      // 绘制直线
      g.DrawLine(p, x1, y1, x2, y2);
}

1.2 CreateGraphics方法

调用窗体或控件的CreateGraphics方法可以获取对Graphics对象的引用,该对象表示控件或窗体的绘图画面。如果在已存在的窗体或控件身上绘图,应该使用此方法

例如,在窗体的Load事件中,通过CreateGraphics方法创建Graphics对象

private void Form1_MouseUp(object sender, MouseEventArgs e)
{
            rightPointX = e.X;
            rightPointY = e.Y;
            //创建Graphics对象实例
            Graphics g = this.CreateGraphics();
            //设置画笔颜色和宽度            
            Pen p = new Pen(Color.Black, 1);
            // 绘制直线
            g.DrawLine(p, leftPointX, leftPointY, rightPointX, rightPointY);
}

1.3 Graphics.FromImage方法

由从Image继承的任何对象创建Graphics对象,调用Graphics.FromImage方法即可,该方法在需要更改已存在的图像时十分有用,例:

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
            rightPointX = e.X;
            rightPointY = e.Y;
            //创建Graphics对象实例
            //Graphics g = this.CreateGraphics();
            g = Graphics.FromImage(myImage);
            //设置画笔颜色和宽度            
            Pen p = new Pen(Color.Black, 1);
 
            // 绘制直线
            g.DrawLine(p, leftPointX, leftPointY, rightPointX, rightPointY);
            pictureBox1.Refresh();
}

下边展示了三个例子:只是展示部分代码,资源在文末,可下载。

C#在窗体上绘制直线。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DrawLine
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        /// <summary>
        /// 左上角点坐标
        /// </summary>
        public int leftPointX = 0;
        public int leftPointY = 0;
        /// <summary>
        /// 右上角点坐标
        /// </summary>
        public int rightPointX = 0;
        public int rightPointY = 0;
 
        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            leftPointX = e.X;
            leftPointY = e.Y;
        }
 
        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            rightPointX = e.X;
            rightPointY = e.Y;
            //创建Graphics对象实例
            Graphics g = this.CreateGraphics();
            //设置画笔颜色和宽度            
            Pen p = new Pen(Color.Black, 1);
 
            // 绘制直线
            g.DrawLine(p, leftPointX, leftPointY, rightPointX, rightPointY);
        }
    }
}

C#在picturebox上绘制直线

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DrawLine_pictureBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
        public int x1;
        public int y1;
 
        public int x2;
        public int y2;
 
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            x1 = e.X;
            y1 = e.Y;
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            x2 = e.X;
            y2 = e.Y;
            pictureBox1.Refresh();
        }
 
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            //创建Graphics对象实例
            Graphics g = e.Graphics;
            //设置画笔颜色和宽度            
            Pen p = new Pen(Color.Black, 1);
 
            // 绘制直线
            g.DrawLine(p, x1, y1, x2, y2);
        }
    }
}

C#在bitmap上绘制直线。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace DrawLine
{
    public partial class Form1 : Form
    {
 
        Graphics g;
        Bitmap myImage;
        int PBwidth, PBheight;
        public Form1()
        {
            InitializeComponent();
            PBwidth = pictureBox1.Width; PBheight = pictureBox1.Height;
            myImage = new Bitmap(PBwidth, PBwidth);
            g = Graphics.FromImage(myImage);
            //g.Clear(Color.White);
            pictureBox1.Image = myImage;
        }
 
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            leftPointX = e.X;
            leftPointY = e.Y;
        }
 
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            rightPointX = e.X;
            rightPointY = e.Y;
            //创建Graphics对象实例
            //Graphics g = this.CreateGraphics();
            //设置画笔颜色和宽度            
            Pen p = new Pen(Color.Black, 1);
 
            // 绘制直线
            g.DrawLine(p, leftPointX, leftPointY, rightPointX, rightPointY);
            pictureBox1.Refresh();
 
        }
 
        /// <summary>
        /// 左上角点坐标
        /// </summary>
        public int leftPointX = 0;
        public int leftPointY = 0;
        /// <summary>
        /// 右上角点坐标
        /// </summary>
        public int rightPointX = 0;
 
        public int rightPointY = 0;
    }
}

可以注意一下上边三个示例中对Graphics的调用。

具体Graphics的属性及其调用的方法请点击csdn查看

有好的建议,请在下方输入你的评论。

 

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

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

相关文章

选择最佳安全文件传输方法的重要性

在数字化时代&#xff0c;文件的传输是商务、教育、科研、医学等领域不可或缺的工作流程。为了保障数据安全&#xff0c;选择最佳安全文件传输方法非常关键。在本文中&#xff0c;我们将探讨选择最佳安全文件传输方法的重要性。 第一、最佳安全文件传输方法可以保证文件内容不被…

【C++进阶】可变模版参数

一、前言 我们在之前Linux的学习中了解过命令行参数&#xff0c;可以让我们在命令行中传入多个参数&#xff0c;并且之前在学习printf&#xff0c;scanf等接口时&#xff0c;接触过可变模版参数&#xff1a; 而今天学习的可变参数模板和普通模板的语义是一样的&#xff0c;只…

Mac 系统钥匙串证书不受信任

Mac 系统钥匙串证书不受信任 解决办法 通过尝试安装 Apple PKI 的 Worldwide Developer Relations - G4 (Expiring 12/10/2030 00:00:00 UTC) 解决该异常问题 以上便是此次分享的全部内容&#xff0c;希望能对大家有所帮助!

[USACO14OPEN] Odometer S

洛谷[USACO14OPEN] Odometer S 题目大意 当一个数的每一位中有至少一半的数字相同&#xff0c;那么这个数就是一个有趣的数。求区间 [ L , R ] [L,R] [L,R]中有多少个有趣的数。 100 ≤ L ≤ R ≤ 1 0 18 100\leq L\leq R\leq 10^{18} 100≤L≤R≤1018 题解 这道题很容易能想…

AcWing242. 一个简单的整数问题

输入样例&#xff1a; 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 Q 1 Q 2 C 1 6 3 Q 2输出样例&#xff1a; 4 1 2 5 #include<bits/stdc.h> using namespace std; const int N1e55; int n,m,a[N],c[N],x,y,d; char ch; int lowbit(int x){return x&-x; } void add(int x,int…

pytest--allure报告中添加用例详情

前言 前面介绍了如何生成allure的报告&#xff0c;看着allure的页面非常好看&#xff0c;但是感觉少了一些内容&#xff0c;allure还可以增加一些用例详情内容&#xff0c;这样让我们的报告看着更加绚丽。 allure增加用例详情 我们可以在报告测试套件中增加用例详情内容。 …

Spring初识(四)

文章目录 前言一.Bean的作用域1.1 作用域例子1.2 Bean的作用域类型 二.Bean的生命周期 前言 在前面我们学习了spring简单的读取和存储对象之后,Spring 中 Bean 是最核心的操作资源&#xff0c;我们接下来会介绍Bean对象. 一.Bean的作用域 什么是Bean作用域呢? 限定程序中变…

[DDPM] Denoising Diffusion Probabilistic Models

直接看paper云里雾里&#xff0c;一些推荐的讲解&#xff1a; The Annotated Diffusion Model 生成扩散模型漫谈&#xff08;一&#xff09;&#xff1a;DDPM 拆楼 建楼 生成扩散模型漫谈&#xff08;二&#xff09;&#xff1a;DDPM 自回归式VAE 生成扩散模型漫谈&#xff…

SQL-每日一题【619.只出现一次的最大数字】

题目 MyNumbers 表&#xff1a; 单一数字 是在 MyNumbers 表中只出现一次的数字。 请你编写一个 SQL 查询来报告最大的 单一数字 。如果不存在 单一数字 &#xff0c;查询需报告 null 。 查询结果如下例所示。 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 1.题目要求我…

MyBatis---多表查询,动态sql的详细介绍

目录 1.命名规则 1.resultMap&#xff08;对应类属性名称与数据库字段名称&#xff09; 2.多表查询&#xff08;ResultMap&#xff09; 1.创建articleInfo类 2.创建ArticleMapper.xml配置文件和ArticleMapper接口 ①&#xff1a;不建议使用 &#xff08;文件之间耦合严重…

十大排序算法详解

目录 1. 冒泡排序 a. 思路 b. code 2. 插入排序 a. 思路 b. code 3. 希尔排序【插入排序plus】 a. 思路 b. code 4. 选择排序 a. 思路 b. code 5. 基数排序 a. 前置知识 b. 思路 c. code 6. 计数排序 a. 思路 b. code 7. 桶排序&#xff08;计数排序plus &…

怎么在shell中查看python版本以及降低anaconda的python版本

输入命令 python --version 电脑anaconda的python版本为3.11&#xff0c;如何降低版本 &#xff0c;输入命令 conda install python3.9 当安装完anaconda后&#xff0c;ubuntu系统的shell命令行最前面会出现base字样&#xff0c;此时要退出&#xff0c;就输入命令 conda deacti…

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件

如何开启QQ邮件的SMTP服务以及如何使用Python发送邮件 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

Qt应用开发——Drag and Drop

目录 一、前言 二、相关事件和类 三、实例 拖动文件到编辑框 一、前言 在实际场景中&#xff0c;经常会有导入文件的需求。导入文件一般两种方式&#xff0c;第一种QFileDialog显示一个文件选择窗口&#xff0c;选择后处理和显示。第二种就是使用拖放机制实现。还有在一些制…

.faust加密勒索数据库恢复---惜分飞

有客户的win服务器被勒索病毒加密,里面运行有用友系统的Oracle数据库&#xff0c;加密提示为&#xff08;camry2020aol.com&#xff09;&#xff1a; 加密的数据文件类似&#xff08;.DBF.id[0E564ACA-3493].[camry2020aol.com].faust&#xff09;: 通过工具检测发现少量bl…

(2)前端控制器的扩展配置, 视图解析器类型以及MVC执行流程的概述

SpringMVC入门程序的扩展说明 注册前端控制器的细节 在web.xml文件注册SpringMVC的前端控制器DispatcherServlet时使用url-pattern标签中使用/和/*的区别 /可以匹配.html或.js或.css等方式的请求路径,但不匹配*.jsp的请求路径/*可以匹配所有请求(包括.jsp请求), 例如在过滤器…

Kotlin空安全类型之平台类型

前言 众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题 一般类型分为: 可空类型如 String? 不可空类型 String其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理 而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时…

JAVA基础-Stream流

引言 Java 8 版本新增的Stream&#xff0c;配合同版本出现的Lambda &#xff0c;给我们操作集合&#xff08;Collection&#xff09;提供了极大的 便利。Stream流是JDK8新增的成员&#xff0c;允许以声明性方式处理数据集合&#xff0c;可以把Stream流看作是遍历数据集 合的一个…

【后端面经-Java】Java基本概念

【后端面经-Java】Java基本概念&#xff09; 1. 面向对象和面向过程1.1 概念1.2 优缺点对比 2. C和Java的区别2.1 "去其糟粕"——Java同学&#xff0c;你对C的这些东西有什么意见&#xff1f;2.2 改进之处————Java同学&#xff0c;你的这个论文&#xff0c;&…

伦敦金投资仓位控制的方法

留意本栏目过去的文章的朋友都会发现&#xff0c;其实小编认为资金管理很重要&#xff0c;甚至重要性超过技术分析找到入场机会。在资金管理中&#xff0c;关于仓位的控制是一门很大的学问&#xff0c;在伦敦金投资中&#xff0c;仓位的控制关系到我们盈亏的多少&#xff0c;甚…