【发布时间】:2018-05-14 02:20:48
【问题描述】:
编辑:我已经尝试解决这个问题一个多星期了,我也在这里和其他地方搜索过。
首先我想解释一下,我是一名业余程序员,没有人可以寻求帮助。我只能阅读我在互联网上购买的书籍和指南,所以如果这个问题非常愚蠢,我很抱歉。
案例:我有一个“Windows 窗体应用程序”,窗体本身大小为 500x500,其中我有一个“图片框”(大小 400x400,loc 0,0)。
我知道 Thread.Sleep 挂起接口,因为它不是多线程的。
我遇到的问题是启动程序时调用了“OnPaint”。 如果我添加一个按钮(从工具箱中拖出),那么“OnPaint”会被调用两次,依此类推,最多确认 4 个按钮。然而,这还不是最糟糕的部分。只需将鼠标悬停在按钮(任何按钮)上即可调用“OnPaint”。如您所见,“Invalidate()”尚未插入,因为我什至无法单击按钮。
如何防止这种情况发生?问题是什么?我应该做些什么不同的事情? 我的意思是,它做我想做的事,而不是当我想做的时候。
代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
int radie = 25;
Random random = new Random();
Graphics graphics = pictureBox1.CreateGraphics();
Color color = Color.Black;
SolidBrush brush = new SolidBrush(color);
for (int i = 2500; i > 0; i--)
{
color = Color.FromArgb(random.Next(0, 101), random.Next(0, 256), random.Next(0, 256), random.Next(0, 256));
brush.Color = color;
graphics.FillEllipse(brush, random.Next(0, 400 - radie * 2), random.Next(0, 400 - radie * 2), radie * 2, radie * 2);
Thread.Sleep(1);
}
}
}
对于那些想知道它做什么的人来说,它只是用不同颜色和不透明度的圆圈填充图片框。编辑:它不会立即填充,它应该看起来“漂亮”。
提前致谢!
【问题讨论】:
-
在需要绘制控件时调用
OnPaint事件。所以向它添加东西,移动它们等等。正如你所说,即使将鼠标移到它上面也意味着需要重绘控件。 -
如果目标是在图片框中设置一次圆圈并且不改变它们,那么从表单的 Load 事件中执行此操作。
-
@SamAxe 目标是连续绘制圆圈,也许我误解了应该如何使用 Graphics?我想到的是一个小动画。
-
@DavidG 我明白了。这解释了很多。如何制作单独的 OnPaint?
-
与什么分开?
标签: c# windows-forms-designer onpaint