如何在一个事件中开始抽奖并在另一个事件中继续
本文关键字:事件 开始 继续 另一个 一个 | 更新日期: 2023-09-27 18:05:16
我正在使用Visual Studio 2013编写Windows Forms C#应用程序。我想在Form1_Load
上画游戏板,在点击按钮时画棋子。我写了两种方法:InitDraw()
和Draw()
。当两种方法都处于Form1_Load()
或button1_Click()
时,没关系,但如果InitDraw()
在Form1_Load()
中并且Draw()
在button1_Click()
- 仅当我按 Alt 或将窗口移出屏幕并移回屏幕时,它才会绘制。我添加了Invalidate()
但这无济于事。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Bitmap drawBitmap;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
InitDraw();
}
private void button1_Click(object sender, EventArgs e)
{
Draw();
}
private void InitDraw()
{
drawBitmap = new Bitmap(500, 500);
pictureBox1.Image = drawBitmap;
}
private void Draw()
{
Graphics g = Graphics.FromImage(pictureBox1.Image);
Pen myPen = new Pen(Color.Black);
g.DrawLine(myPen, 0, 0, 100, 100);
myPen.Dispose();
g.Dispose();
Invalidate();
}
}
}
没有人会阻止你在任何地方画画,要记住的是要在位图图像上画,而不是试图强迫它到屏幕上。我的意思是你需要创建你自己的Bitmap
对象,你调用的任何绘制函数你都会调用它们。
若要在屏幕上实际显示此函数,请调用主机控件上的 Invalidate
函数 - 顺便说一下,这不是PictureBox
。像面板这样轻量级的东西就可以了。在该控件的 Paint
事件中,只需绘制图像即可。
你有点接近,但你在表单上调用Invalidate
,除了当你确切地知道需要重绘什么时,重绘所有内容是非常低效的,根本不会做任何事情。你不依赖于Paint
事件,而是依赖于PictureBox
与Bitmap
的内在约束力——Bitmap
谁来处理你永远不会改变。就PictureBox
而言,一切都是一样的,所以它实际上不会再次绘制自己。当您实际通过将窗口拖到屏幕边界之外然后返回屏幕边界来强制它自己绘制时,它将读取位图并绘制您期望的内容。
必须在图片框的Paint
事件中绘制。窗口可能随时触发Paint
事件,例如,如果删除其前面的窗口或移动包含图片框的窗体。
您在屏幕上绘制的内容是可变的;因此,让 Windows 决定何时(重新(绘制。您还可以使用
picturebox1.Invalidate();
或
picturebox1.Refresh();
区别:Invalidate
等到窗口空闲。 Refresh
立即抽签。
如果只在Form_Load或Button_Click中绘制,则当窗口自行触发绘画时,绘图可能会丢失。请尝试在这些事件中调用picturebox1.Invalidate
。