Управление видимостью растрового изображения в .NET - PullRequest
2 голосов
/ 18 апреля 2010

Я пытаюсь создать это простое приложение на языке c #: когда пользователь дважды щелкает мышью на определенном месте в форме, будет нарисован маленький круг. Если одним щелчком мыши текущее местоположение отмечено кружком, то оно будет удалено.

Я пытаюсь сделать это, просто зарегистрировав события MouseDoubleClick и MouseClick и нарисовав круг из файла .bmp следующим образом:

private void MouseDoubleClick (object sender, MouseEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Bitmap myImage = (Bitmap)Bitmap.FromFile("Circle.bmp");
    g.DrawImage(myImage, e.X, e.Y);
}

Моя проблема в том, что я не знаю, как сделать круг невидимым, когда пользователь щелкает его местоположение: я знаю, как проверить, содержит ли выбранное место круг (управляя списком всех местоположений, содержащих круги ...) , но я не знаю, как именно его удалить.

Другой вопрос: должен ли я вызывать метод this.CreateGraphics () каждый раз, когда пользователь дважды щелкает местоположение, как я написал в своем фрагменте кода, или я должен вызывать его один раз при инициализации?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Я предпочитаю помещать мои изображения в экземпляры класса Picturebox. Причина в том, что я могу просто вызвать функцию Hide() каждой Picturebox (или установить для Visible значение false).

То, что вы делаете, рисует непосредственно в клиентской области окна, что технически не так, но обычно это следует делать в обработчике Paint формы. Если в какой-то момент вы решите, что не хотите больше видеть свой круг, вы можете вызвать метод формы Invalidate(), который вызывает событие Paint. Там вы явно не рисуете свой круг, и поэтому для пользователя круг исчезает.

Приятной особенностью Picturebox является то, что он постоянен - ​​вы помещаете в него свое изображение и, возможно, рисуете на нем, но вам нужно рисовать только один раз. Если вы используете технику рисования, ваш код для рисования вызывается каждый раз, когда необходимо перерисовать форму.

Изменить:

Вот некоторый код, который иллюстрирует мою информацию об обработчике Paint:

private void Form_Paint(object sender, PaintEventArgs e)
{
   e.Graphics.Clear();  // clear any and all circles being drawn

   if (CircleIsVisible)
   {
     e.Graphics.DrawEllipse( ... ); // OR, DrawImage( ) as in your example
   }
}

private void MouseDoubleClick (object sender, MouseEventArgs e)
{
   CircleIsVisible = true;
   Invalidate();  // triggers Paint event
}

Если вы рисуете растровые изображения, я бы однажды загрузил растровое изображение и сохранил его как переменную класса. Таким образом, вам не нужно нажимать на жесткий диск каждый раз, когда вы хотите нарисовать. Утилизируйте растровое изображение, когда вы избавляетесь от своего класса (в данном случае, вашего окна).

0 голосов
/ 18 апреля 2010

Если у вас простой цвет фона, вы можете использовать Graphics.DrawEllipse для рисования кругов, а затем просто изменить цвет круга на цвет фона. Также вам необходимо иметь коллекцию всех нарисованных кругов, чтобы вы могли получить доступ к любому нарисованному кругу.

0 голосов
/ 18 апреля 2010

Я думаю, вам нужно очистить все изображение, которое вы рисуете, до следующего двойного щелчка.
Например, Graphics.Clear ().
С другой стороны, вы не должны создавать объект Graphics или располагать его каждый раз.

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