首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【愚公系列】2023年11月 WPF控件专题 Line控件详解
2
【愚公系列】2023年11月 WPF控件专题 2023秋招WPF高频面试题
3
【愚公系列】2023年11月 Winform控件专题 Label控件详解
4
【愚公系列】2023年11月 Winform控件专题 Button控件详解
5
【愚公系列】2023年11月 Winform控件专题 Form控件详解
6
【愚公系列】2023年11月 Winform控件专题 TextBox控件详解
7
【愚公系列】2023年11月 Winform控件专题 CheckBox控件详解
8
【愚公系列】2023年11月 Winform控件专题 RadioButton控件详解
9
【愚公系列】2023年11月 Winform控件专题 ComboBox控件详解
10
【愚公系列】2023年11月 Winform控件专题 RichTextBox控件详解
11
【愚公系列】2023年11月 Winform控件专题 ListBox控件详解
12
【愚公系列】2023年11月 Winform控件专题 CheckedListBox控件详解
13
【愚公系列】2023年11月 Winform控件专题 numericUpDown控件详解
14
【愚公系列】2023年11月 Winform控件专题 LinkLabel控件详解
15
【愚公系列】2023年11月 Winform控件专题 DateTimePicker控件详解
16
【愚公系列】2023年11月 Winform控件专题 NotifyIcon控件详解
17
【愚公系列】2023年11月 Winform控件专题 ContextMenuStrip控件详解
18
【愚公系列】2023年11月 Winform控件专题 Timer控件详解
19
【愚公系列】2023年11月 Winform控件专题 PictureBox控件详解
20
【愚公系列】2023年11月 Winform控件专题 Chart控件详解
21
【愚公系列】2023年11月 Winform控件专题 DataGridView控件详解
22
【愚公系列】2023年11月 Winform控件专题 TableLayoutPanel控件详解
23
【愚公系列】2023年11月 Winform控件专题 ProgressBar控件详解
24
【愚公系列】2023年11月 Winform控件专题 Panel控件详解
25
【愚公系列】2023年11月 Winform控件专题 FlowLayoutPanel控件详解
26
【愚公系列】2023年11月 Winform控件专题 GroupBox控件详解
27
【愚公系列】2023年11月 Winform控件专题 SplitContainer控件详解
28
【愚公系列】2023年11月 Winform控件专题 TabControl控件详解
29
【愚公系列】2023年11月 Winform控件专题 ToolTip控件详解
30
【愚公系列】2023年11月 Winform控件专题 MaskedTextBox控件详解
31
【愚公系列】2023年11月 Winform控件专题 MonthCalendar控件详解
32
【愚公系列】2023年11月 Winform控件专题 TreeView控件详解
33
【愚公系列】2023年11月 Winform控件专题 MenuStrip控件详解
34
【愚公系列】2023年11月 Winform控件专题 OpenFileDialog控件详解
35
【愚公系列】2023年11月 Winform控件专题 SaveFileDialog控件详解
36
【愚公系列】2023年12月 Winform控件专题 FontDialog控件详解
37
【愚公系列】2023年12月 Winform控件专题 ColorDialog控件详解
38
【愚公系列】2023年12月 Winform控件专题 FolderBrowserDialog控件详解
39
【愚公系列】2023年12月 Winform控件专题 StatusStrip控件详解
40
【愚公系列】2023年12月 Winform控件专题 ToolStrip控件详解
41
【愚公系列】2023年12月 Winform控件专题 HelpProvider控件详解
42
【愚公系列】2023年12月 Winform控件专题 ToolStripContainer控件详解
43
【愚公系列】2023年12月 Winform控件专题 BackgroundWorker控件详解
44
【愚公系列】2023年12月 GDI+绘图专题 图形图像编程基础
45
【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘
46
【愚公系列】2023年12月 GDI+绘图专题 颜色获取和图形绘制
47
【愚公系列】2023年12月 GDI+绘图专题 Point
48
【愚公系列】2023年12月 GDI+绘图专题 Rectangle
49
【愚公系列】2023年12月 GDI+绘图专题 Matrix
50
【愚公系列】2023年12月 GDI+绘图专题 Pen

【愚公系列】2023年12月 GDI+绘图专题 图形图像的重绘

🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。 🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

图形图像的重绘是指在对图形或图像进行修改后,需要重新绘制该图形或图像以反映修改后的结果。重绘可以在屏幕上直接进行,也可以在内存中进行,最后再将修改后的图形或图像显示在屏幕上。

在计算机图形学中,图形图像的重绘通常是使用图形库或绘图软件完成的。这些工具提供了各种绘制工具和绘制函数,能够快速、准确地绘制出修改后的图形或图像。在重绘时,需要注意如下几个方面:

  1. 及时重绘:在进行修改后,应该及时对图形或图像进行重绘,否则用户可能看不到修改的结果。
  2. 避免闪烁:在重绘时,应该尽量避免图形或图像的闪烁现象,可以采用双缓冲技术或透明绘制技术等来避免。
  3. 优化性能:图形或图像的重绘可能会消耗大量的计算资源,因此需要对重绘进行优化,如避免不必要的重绘、使用硬件加速等。

🚀一、图形图像的重绘

🔎1.放大圆形半径案例

下面是一个简单的WinForms应用程序,用于在窗体中绘制和重绘一个圆形:

代码语言:csharp
复制
using System;
using System.Drawing;
using System.Windows.Forms;

namespace GdiPlusDemo
{
    public partial class Form1 : Form
    {
        private int radius = 50;
        private Point center;

        public Form1()
        {
            InitializeComponent();
            center = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
            DoubleBuffered = true;
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            Graphics graphics = e.Graphics;
            graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            graphics.Clear(Color.White);
            graphics.DrawEllipse(Pens.Red,
                center.X - radius, center.Y - radius, radius * 2, radius * 2);
        }

        protected override void OnResize(EventArgs e)
        {
            base.OnResize(e);
            center = new Point(ClientSize.Width / 2, ClientSize.Height / 2);
            Invalidate();
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Button == MouseButtons.Left)
            {
                radius += 10;
                Invalidate();
            }
            else if (e.Button == MouseButtons.Right)
            {
                radius -= 10;
                Invalidate();
            }
        }
    }
}

在该程序中,通过重写OnPaint方法来绘制圆形,并在OnResize方法中重绘。OnMouseDown方法用于捕获鼠标事件,当左键或右键被按下时,修改圆形的半径并重绘。

在重绘图形时,调用Invalidate方法来请求重新绘制窗体。在OnPaint方法中,使用Graphics对象进行绘制,可以使用GDI+提供的各种绘图函数和属性来实现不同的效果。要对图形进行平滑处理,可以将SmoothingMode属性设置为AntiAlias。

注意,在窗体的构造函数中,需要将DoubleBuffered属性设置为true,以启用双缓冲技术,避免图形的闪烁现象。

🔎2.缩放矩形长宽

在WindForm中,SetStyleInvalidateUpdateRefresh 是用于处理界面控件的重要方法。让我为你详细解释每个方法的作用和用法:

  1. SetStyle 方法:
    • 作用:SetStyle 方法用于设置控件的样式和行为属性。
    • 用法:你可以使用此方法来启用或禁用控件的不同样式和属性。例如,你可以通过 ControlStyles.ResizeRedraw 样式来启用在调整控件大小时重绘控件。使用掩码来指定要设置的样式,例如:SetStyle(ControlStyles.ResizeRedraw | ControlStyles.DoubleBuffer, true);
  2. Invalidate 方法:
    • 作用:Invalidate 方法用于标记控件的指定区域为无效,需要重新绘制。
    • 用法:通常在你希望控件重绘时调用此方法。你可以传递一个矩形区域参数,以指定要使其无效的区域。例如:Invalidate(new Rectangle(0, 0, Width, Height));
  3. Update 方法:
    • 作用:Update 方法用于立即使控件重绘,而不是等待消息队列处理。
    • 用法:通常与 Invalidate 方法一起使用,以立即触发控件的重绘。这在需要即时响应用户操作时非常有用。例如:Invalidate(); Update();
  4. Refresh 方法:
    • 作用:Refresh 方法用于立即使控件重绘,并在内部调用 InvalidateUpdate 方法。
    • 用法:与 Update 类似,但更方便,因为它会自动调用 InvalidateUpdate。例如:Refresh();
代码语言:csharp
复制
public partial class lblFont : Form
{
    int index = 0;
    public lblFont()
    {
        InitializeComponent();
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
        SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        Graphics graphics = e.Graphics;
        switch (index)
        {
            case 0:
                Rectangle rectangle = new Rectangle(0, 0, 400, 400);
                graphics.FillRectangle(Brushes.Black, rectangle);
                break;
            case 1:
                rectangle = new Rectangle(0, 0, 200, 200);
                graphics.FillRectangle(Brushes.Black, rectangle);
                break;
            case 2:
                rectangle = new Rectangle(0, 0, 100, 100);
                graphics.FillRectangle(Brushes.Black, rectangle);
                break;
        }

    }

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        index = comboBox1.SelectedIndex;
        this.Invalidate();
        this.Update();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        comboBox1.SelectedIndex = 0;
    }
}

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

下一篇
举报
领券