C# 一段绘图代码 在form_load事件不能显示图

  今天无意将一段绘图代码 写在form_load事件了,结果不能显示绘图。(代码:Graphics g = this.CreateGraphics();Pen pen = new Pen(Color.Red, 10);Rectangle r = new Rectangle(70, 20, 100, 60);g.DrawEllipse(pen, r);。经过查询得知:Form_Load事件是在窗体首次显示时发生的也就是说,在Form_Load过程中,这个Form里所有需要在屏幕上呈现的东西都还没开始绘制,所以你在Load中去绘制东西是看不到的Windows系统中,窗体的Load事件执行完毕后,系统才开始绘制窗体并显示在屏幕上。

  其实,只有当Form_Load方法执行完后,我们才能看见窗体。当Form_Paint方法执行完后才显示出我们想要绘制的完整的图形。并且窗体Repaint后,窗体的Graphics就被清空了。每次刷新的时候都需要绘制,在窗体Load也会刷新。

 

转载于:https://www.cnblogs.com/czx1/p/5360984.html

### 回答1: 好的,以下是一段C#代码示例,可以在WinForm窗体的Load事件中添加,以在窗口重新打开后显示之前的绘图: ``` private List<Point> points = new List<Point>(); //存储绘图点坐标的列表 private void Form1_Load(object sender, EventArgs e) { //在窗口打开后重新绘制之前的图形 this.Refresh(); foreach (Point p in points) { //绘制每个点 Graphics g = this.CreateGraphics(); g.FillEllipse(Brushes.Black, p.X, p.Y, 5, 5); g.Dispose(); } } private void Form1_Paint(object sender, PaintEventArgs e) { //绘制当前的图形 foreach (Point p in points) { e.Graphics.FillEllipse(Brushes.Black, p.X, p.Y, 5, 5); } } private void Form1_MouseDown(object sender, MouseEventArgs e) { //将鼠标点击位置加入到点列表中 points.Add(new Point(e.X, e.Y)); //重新绘制窗口 this.Invalidate(); } ``` 这段代码利用一个点列表存储所有的绘图点坐标,并在窗口重新打开时重绘之前的图形。当用户在窗口中点击鼠标时,新的点将被添加到列表中,并且窗口将被重新绘制以显示新的和之前的点。 ### 回答2: 编写一个实现上述功能的示例代码如下: 1. 首先,在WinForm窗口类中添加一个成员变量用于保存之前绘制的图形对象,例如`private Graphics previousGraphics;`。 2. 在窗口加载时,将当前绘图保存到`previousGraphics`中。可以在窗口的`Load`事件处理程序中实现,如下所示: ```csharp private void Form1_Load(object sender, EventArgs e) { previousGraphics = this.CreateGraphics(); // 在这里进行之前的绘图操作,例如: // previousGraphics.DrawLine(Pens.Red, new Point(0, 0), new Point(100, 100)); // previousGraphics.DrawEllipse(Pens.Blue, new Rectangle(200, 200, 100, 100)); } ``` 3. 当窗口重新打开时,再次绘制之前的图形。可以在窗口的`Paint`事件处理程序中实现,如下所示: ```csharp private void Form1_Paint(object sender, PaintEventArgs e) { // 在这里重新绘制之前的图形 if (previousGraphics != null) { e.Graphics.DrawImage(previousGraphics, 0, 0); } } ``` 这样,当窗口重新打开时,之前绘制的图形就会显示在窗口中。您可以根据实际需求在`Load`事件处理程序中进行之前的绘图操作,然后在`Paint`事件处理程序中重新绘制图形。 ### 回答3: 要实现让WinForm窗口重新打开后显示之前的绘图,可以使用以下步骤: 1. 在WinForm窗口的代码中添加一个PictureBox控件,用于显示绘图。 2. 在窗口的Load事件中,加载之前保存的绘图数据。可以将绘图数据保存在文件中,或者在程序中使用变量保存。 3. 在加载绘图数据之前,先清空PictureBox控件中的内容,以确保之前的绘图已经清除。 4. 通过绘图数据,重新绘制在PictureBox控件中。 以下是示例代码: ```csharp using System; using System.Drawing; using System.Windows.Forms; namespace WinFormApp { public partial class MainForm : Form { // 保存绘图数据 private Bitmap previousDrawing; public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { // 加载之前保存的绘图数据 LoadPreviousDrawing(); } private void LoadPreviousDrawing() { // 清空PictureBox控件中的内容 pictureBox.Image = null; // 判断是否存在之前的绘图数据 if (previousDrawing != null) { // 将之前保存的绘图数据绘制到PictureBox控件中 pictureBox.Image = previousDrawing; } } private void SaveCurrentDrawing() { // 获取当前绘图,并保存到previousDrawing变量中 previousDrawing = new Bitmap(pictureBox.ClientSize.Width, pictureBox.ClientSize.Height); using (Graphics graphics = Graphics.FromImage(previousDrawing)) { graphics.Clear(Color.White); // 清空绘图 // 在此处添加绘图逻辑,绘制到graphics中 } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 保存当前绘图数据 SaveCurrentDrawing(); // 可以将previousDrawing保存到文件中,以便下次加载 } } } ``` 以上代码中,当窗口加载后,会自动加载之前保存的绘图数据,并将其绘制到PictureBox控件中。在窗口关闭时,会保存当前的绘图数据,以便下次打开时加载。为了简化示例,绘图的逻辑未在代码中提供,需要根据具体需求自行添加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值