Рисование прямоугольника не работает в Windows Forms - PullRequest
0 голосов
/ 06 апреля 2011

Программа должна рисовать прямоугольник при нажатии.Но это не так.Может быть, некоторые проблемы с моим пониманием делегатов.В чем подвох?

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 ]

2 голосов
/ 06 апреля 2011

Код, который вы написали, работает для меня, но окно вашей формы должно быть достаточно большим, чтобы показать прямоугольник.

Диагностически, первое, что я проверю, это то, изменяется ли название формы на «aaaaa». Если это так, то вы знаете, что вызывается обработчик щелчка - но, возможно, у вас есть проблема с обработчиком рисования. Если это не так, то по какой-то причине ваш обработчик кликов не вызывается.

Обратите внимание, что это не обычный способ рисования прямоугольника при щелчке в Windows Forms, но я предполагаю, что это всего лишь учебное упражнение.

0 голосов
/ 06 апреля 2011

Глядя на ваш код, я понимаю, что вы пытаетесь добавить обработчик событий для события рисования при нажатии ... Вам также необходимо вызвать событие рисования. Вот пример кода, в котором я назначаю 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);
    } 
0 голосов
/ 06 апреля 2011

Он будет рисовать прямоугольник только в том случае, если он окажется внутри области, которая недействительна для обновления измененного текста.

Когда вы изменяете текст, он создает сообщение о том, что текст должен быть перерисован, что вызовет событие Paint для рисования. Событие будет иметь объект Graphics, который обрезается по прямоугольнику, который необходимо перерисовать для обновления текста, поэтому будет нарисована только та часть прямоугольника, которая пересекается с текстом.

Вы должны вызвать перерисовку, которая покрывает весь прямоугольник, поэтому проще всего сделать перерисовку всего окна:

this.Invalidate();

Обратите внимание, что вам не следует подключать событие Paint из обработчика события Click. Это означает, что событие будет подключаться еще один раз при каждом нажатии, поэтому после пяти щелчков обработчик события Paint будет вызываться пять раз каждый раз, когда необходимо что-то перерисовать.

0 голосов
/ 06 апреля 2011

Попробуйте принудительно перерисовать после назначения обработчика события:

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

Кроме того, если дважды щелкнуть мышью, обработчик событий будет назначен дважды, что не является тем, что вам нужно.

0 голосов
/ 06 апреля 2011

Я думаю, что вы подключаете только обработчик события Paint. Вы не вызываете событие Paint.

Попробуйте это

public void MujClickHandler(object sender,EventArgs e)
{
this.Text="aaaaa";
this.Paint+= new PaintEventHandler(MujPaintHandler);
this.Invalidate();
}
0 голосов
/ 06 апреля 2011

Может быть, вам придется перерисовать.Прямоугольник появляется, если вы перемещаете окно?Просто позвоните в PaintHandler после нажатия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...