Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прорисовка одного элемента поверх другого

440
12 марта 2011 года
[FENIX]
83 / / 29.01.2007
Народ, подскажите, что делать. В общем у меня есть объект Image, из которого берется картинка, и рисуется на форме. Мне нужно, чтобы при нажатии на кнопку рисовалась линия, причём поверх картинки. Линия рисуется, но только вот как сделать так, чтобы она рисовалась именно поверх картинки? Как только курсор выходит за пределы кнопки, часть линии исчезает.



C#

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Моделирование_лаба1
{
    public partial class Form1 : Form
    {
        Image My_Image = Image.FromFile("C:\\Documents and Settings\\Сергей\\Мои документы\\Visual Studio 2005\\Projects\\Моделирование_лаба1\\
Моделирование_лаба1\\Bitmap3.bmp");
        Graphics k;

        public Form1()
        {
            InitializeComponent();
        }

       
        private void button1_Click(object sender, EventArgs e)
        {
            k.DrawLine(new Pen(Color.Red), 100, 300, 400, 150);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
           
           
            k = this.CreateGraphics();
            k.DrawImage(My_Image, 10, 10);
           
           
        }

     
    }
}
278
12 марта 2011 года
Alexander92
1.1K / / 04.08.2008
Любые операции, связанные с отрисовкой формы, должны происходить внутри OnPaint-обработчика. У вас происходит вот что: линия отрисовывается только один раз, при нажатии кнопки, а картинка - при любом обновлении окна. Соответственно, при первом же обновлении картинка перекрывает линию. Поэтому вам нужно сделать следующее:

Код:
public partial class Form1 : Form
    {
        Image My_Image = Image.FromFile("C:\\Documents and Settings\\Сергей\\Мои документы\\Visual Studio 2005\\Projects\\Моделирование_лаба1\\
Моделирование_лаба1\\Bitmap3.bmp");

        Graphics k;
        bool bDrawLine;

        public Form1()
        {
            InitializeComponent();
            this.k = this.CreateGraphics();
            this.bDrawLine = false;
        }

       
        private void button1_Click(object sender, EventArgs e)
        {
            bDrawLine = true;
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
           
            k.DrawImage(My_Image, 10, 10);
            if (bDrawLine)
                k.DrawLine(new Pen(Color.Red), 100, 300, 400, 150);
           
        }

     
    }
297
12 марта 2011 года
koodeer
1.2K / / 02.05.2009
Alexander92 верно написал, однако дополню.
В событии Paint параметр типа PaintEventArgs содержит ссылку на Graphics, который нуждается в перерисовке. Его и следует использовать:
 
Код:
private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(My_Image, 10, 10);
    if (bDrawLine)
        e.Graphics.DrawLine(Pens.Red, 100, 300, 400, 150);
}



Ну и поворчу напоследок.
k - чрезвычайно неудачное имя переменной. Оно ни о чём не говорит.
bDrawLine - тоже не совсем удачно. Венгерская нотация в наше время? И это имя тоже мало говорит о назначении переменной.
278
12 марта 2011 года
Alexander92
1.1K / / 04.08.2008
koodeer, согласен на 100%, я просто постарался по максимуму сохранить код ТС, чтобы лучше выделить, в чем конкретно его ошибка. А так - разумеется, вы правы.
440
12 марта 2011 года
[FENIX]
83 / / 29.01.2007
Понял, спасибо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог