6

C# 相对较新;希望我只是忽略了一些简单的事情。

我有一个名为“Exercise1”的表单,其中包含一个名为“drawingArea”的图片框和几个按钮。练习1的构造函数代码如下:

public Exercise1()
{
    InitializeComponent();
    paper = drawingArea.CreateGraphics();
    balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, 
        drawingArea.Height / 2, 30);
    paper.Clear(Color.White);
    balloon.Display(paper);   
}
...

'paper' 和 'balloon' 在构造函数上方创建为全局变量,用于表单上的其他方法。'paper' 和 'balloon' 都按照在构造函数中在表单上定义的其他方法中初始化的方式工作。

无论出于何种原因,命令

paper.Clear(Color.White);

balloon.Display(paper);

应该清除图片框并显示一个红色椭圆,不要执行(至少是可见的)。是什么赋予了?

更新: 我想我会喜欢这个网站的……你们很快!
@Nitesh:Exercise1 的构造函数是从另一种形式调用的。代码如下:

private void button1_Click(object sender, EventArgs e)
        {
            int exSelector = (int)numericUpDown1.Value;
            switch (exSelector)
            {
                case 1:
                    Exercise1 form1 = new Exercise1();
                    form1.Show();
                    break;
...

@Sean Dunford:是的,是的。
@RBarryYoung:玩了一下,但没有运气。什么命令触发了练习 1 的 Form_Load 事件?

更新:此更改后的代码按预期工作:

public Exercise1()
        {
            InitializeComponent();
            paper = drawingArea.CreateGraphics();
            drawingArea.BackColor = Color.White;
            drawingArea.Paint += new PaintEventHandler(this.drawingArea_Paint);
            balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, drawingArea.Height / 2, 30); 
        }
        private void drawingArea_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.Clear(Color.White);
            balloon.Display(e.Graphics);
        } 
...

感谢所有的帮助!

4

3 回答 3

5

您不能在构造函数中进行绘图。要进行正确的绘图,您需要在屏幕上显示表格。您可以尝试使用该Shown事件来进行渲染(不过,当重新绘制表单时,这可能会丢失)。

通常最好的方法是在构造函数中设置你需要的任何标志,然后使用Paint表单的事件来完成所有的绘制。稍后,当您需要重新绘制某些内容时,设置需要呈现的任何状态,使您的表单无效(这会导致一个Paint事件),然后您可以重新绘制新状态。

如果您尝试进行自定义绘图(在您的Paint活动之外),您将面临随机变为空白的风险,或者当您调整/最小化表单时您的绘图可能会消失。

于 2012-10-09T20:10:39.567 回答
1

您在构造函数中使用 Graphics,这意味着您只在纸上绘制一次,无论出于何种原因在构造函数之后发生的任何重绘都将以原始方式绘制绘图区域。尝试将 PaintEventHandler 添加到 drawingArea 然后在 balloon.Display(e.Graphics); 内部调用

    public Exercise1()
    {
        InitializeComponent();

        balloon = new Balloon("redBalloon", Color.Red, drawingArea.Width / 2, 
        drawingArea.Height / 2, 30);


        drawingArea.Paint += new PaintEventHandler(drawingArea_Paint);
    }

    void drawingArea_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.Clear(Color.White);
        baloon.Display(e.Graphics);
    }
于 2012-10-09T20:10:11.387 回答
0

您应该覆盖表单OnPaint事件处理程序。这样做,您可以获得将重新绘制纸张和气球区域的图形上下文。

于 2012-10-09T20:12:42.577 回答