绘图矩形在Windows窗体中不起作用

时间:2011-04-06 06:25:31

标签: c# winforms delegates

程序应该在点击时绘制一个矩形。但事实并非如此。也许我对代表的理解有些问题。有什么收获?

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace forms1
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            //
            // The InitializeComponent() call is required for Windows Forms designer support.
            //
            InitializeComponent();

            //this.Paint+= new PaintEventHandler(MujPaintHandler);

            this.Click += new EventHandler(MujClickHandler);

        }

        public void MujPaintHandler(object sender,PaintEventArgs e)
        {
            Graphics gfx=e.Graphics;
            gfx.FillRectangle(new SolidBrush(Color.DarkViolet),100,100,200,200);
        }

        public void MujClickHandler(object sender,EventArgs e)
        {
            this.Text="aaaaa";
            this.Paint+= new PaintEventHandler(MujPaintHandler);
        }

    }
}

6 个答案:

答案 0 :(得分:2)

您编写的代码对我有用,但您的表单窗口必须足够大才能显示矩形。

在诊断上,我要检查的第一件事是表单的标题是否变为“aaaaa”。如果是,那么你知道正在调用click处理程序 - 但是你可能遇到了paint处理程序的问题。如果没有,那么由于某种原因你的点击处理程序没有被调用。

请注意,这不是您在Windows窗体中单击一个矩形的常规方法,但我认为这只是一个学习练习。

答案 1 :(得分:0)

也许你必须强制重绘。如果移动窗口,是否会出现直肠?只需在点击后调用PaintHandler即可。

答案 2 :(得分:0)

我认为你只附加了Paint事件处理程序。您没有调用Paint事件。

试试这个

public void MujClickHandler(object sender,EventArgs e)
{
this.Text="aaaaa";
this.Paint+= new PaintEventHandler(MujPaintHandler);
this.Invalidate();
}

答案 3 :(得分:0)

在分配事件处理程序后尝试强制重绘:

    public void MujClickHandler(object sender,EventArgs e)
    {
        this.Text="aaaaa";
        this.Paint+= new PaintEventHandler(MujPaintHandler);
        this.Invalidate();
    }

此外,如果单击两次,事件处理程序将被分配两次,这不是您想要的。

答案 4 :(得分:0)

如果矩形恰好位于无效区域内,则只会绘制矩形,以更新您更改的文本。

当您更改文本时,它会创建一条消息,表明文本必须重新绘制,这将调用Paint事件进行绘图。该事件将有一个Graphics对象,该对象被剪裁到需要重新绘制的矩形以更新文本,因此只会绘制与文本相交的矩形部分。

您必须重新绘制覆盖整个矩形的内容,因此最简单的方法是重绘整个窗口:

this.Invalidate();

请注意,您不应该从Paint事件处理程序挂钩Click事件。这意味着事件将在每次单击时再连接一次,因此在每次需要重新绘制某些内容后,在五次单击后,Paint事件处理程序将被调用五次。

答案 5 :(得分:0)

查看你的代码,我知道你正在尝试在Click上为paint事件添加一个事件处理程序...你还需要调用paint事件..这是一个示例代码,我在其中分配Paint EventHandler按钮单击并在执行时单击点击上的绘制事件

  public Form1()
    {
        InitializeComponent();

        this.Click += new EventHandler(MujClickHandler);
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.ControlKey)
        {
            MessageBox.Show(e.KeyCode.ToString());
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //this.Paint += new PaintEventHandler(MujPaintHandler);
    }

    public void MujPaintHandler(object sender,PaintEventArgs e)   
    {
        Graphics gfx=e.Graphics;  
        gfx.FillRectangle(new SolidBrush(Color.DarkViolet),100,100,200,200);  

    }

    public void MujClickHandler(object sender,EventArgs e)      
    { 
        this.Text="aaaaa";

        this.RaisePaintEvent(this, new PaintEventArgs(this.CreateGraphics(), this.RectangleToClient(new Rectangle())));
    }

    private void button1_Click(object sender, EventArgs e)
    {
        this.Paint += new PaintEventHandler(MujPaintHandler);
    }