Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > использование переопределенных событий


Автор: 3she1on 11.11.2008, 22:02
Всем доброго времени суток! Недавно начал освоение СиШарп и столкнулся с такой проблемой: Есть класс, допустим звать его SampleClass, унаследованный от System.Windows.Control. В этом классе перегружается обработчик события OnClick: 
Код

protected override void OnClick(EventArgs e)
        {
            //TODO: ....
        }


В другом классе, допустим TargetClass, создаю обьект типа SampleClass:
Код

...
SampleClass sClass = new SampleClass();
...


В конструкторе TargetClass пишу следующее:
Код

sClassюClick += new EventHandler(sClass_Click);


далее:
Код

void imgIcon_Click(object sender, EventArgs e)
        {
            //TODO: ...
        }

Вот что-то вся эта конструкция не работает (((
заранее, благодарен за пом0щь!

Автор: diadiavova 11.11.2008, 22:21
OnClick - не обработчик события, а метод, в котором это событие инициируется в классе Control. Если ты переопределяешь этот метод - тебе надо вызвать метод базового класса, или инициировать в нём событие самому
Код

protected override void OnClick(EventArgs e)
        {
             base.OnClick(e);
            //TODO: ....
        }



Автор: 3she1on 11.11.2008, 23:08
спасибо за ответ. не могу осознать всю эту модель ((. курю маны

Автор: diadiavova 11.11.2008, 23:13
Да собсно... ничего сверхъестественного. Просто для инициализации события используется соответствующий метод. Если метод переопределён, то базовый класс будет вместо собственной реализации метода вызывать переопределённую его версию. Для того, чтобы действия описанные в первоначальной версии метода тоже выполнялись, при переопределении надо вызывать переопределяемый метод базового класса. Вот и всё smile 

Автор: 3she1on 11.11.2008, 23:32
Эм... Хорошо. не нужны мне действия первоначальной версии. в переопределённом методе пишу свои действия
(маленькое объяснение... Этот класс, по идее, должен представлять собой кликабельную иконку с прозрачным фоном для dotnetcf):
Код

public class ImageIcon : Control
    {
        private Image icon = null;
        private int iconPosX, iconPosY;

        public ImageIcon(Image img, int x, int y)
        {
            icon = img;
            iconPosX = x;
            iconPosY = y;
        }

        protected override void OnClick(EventArgs e)
        {
            MessageBox.Show("Clicked!");
        }

        public void drawIcon(Graphics g)
        {
            System.Drawing.Imaging.ImageAttributes imgAttr = new System.Drawing.Imaging.ImageAttributes();
            imgAttr.SetColorKey(Color.FromArgb(13, 13, 13), Color.FromArgb(13, 13, 13));

            g.DrawImage(icon, new Rectangle(x, y, icon.Width, icon.Height), 0, 0, icon.Width, icon.Height, GraphicsUnit.Pixel, imgAttr); 
        }     
    }


в другом классе создаю объект выше обозначенного класса. вызываю в опред. месте его метод "drawIcon". контрол норм рисуется, но не кликабелен

Автор: diadiavova 12.11.2008, 01:44
Зачем вообще переопределять метод, когда можно просто обработать событие
Код

public class ImageIcon : Control
    {
        private Image icon = null;
        private int iconPosX, iconPosY;
        public ImageIcon(Image img, int x, int y)
        {
            icon = img;
            iconPosX = x;
            iconPosY = y;
            this.Click += new EventHandler(ImageIcon_Click);
        }
        void ImageIcon_Click(Object sender, EventArgs e)
        {
            MessageBox.Show("Clicked!");
        }
        public void drawIcon(Graphics g)
        {
            System.Drawing.Imaging.ImageAttributes imgAttr = new System.Drawing.Imaging.ImageAttributes();
            imgAttr.SetColorKey(Color.FromArgb(13, 13, 13), Color.FromArgb(13, 13, 13));
            g.DrawImage(icon, new Rectangle(x, y, icon.Width, icon.Height), 0, 0, icon.Width, icon.Height, GraphicsUnit.Pixel, imgAttr); 
        }     
    }

Автор: 3she1on 12.11.2008, 02:58
у меня вот другая трабла образовалась... в Вин приложении создаю из шаблона UserControl собственную загогулину, нормально добавляю функционал, обработку событий. Контол автоматом добавляется в ТулБокс. Я его кидаю на форму и все как часики швейцарские. Пишу для компактФреймворк - ЮзерКонтрол не появляется в ТулБоксе.  smile 

Автор: 3she1on 12.11.2008, 04:24
Итоги. Покурил маны - отпустило ))). С событиями все в порядке - разобрался. С контролами - тоже. В принципе, вопрос закрыт. Создал контрол, который рисует нужную мне картинку с корректной прозрачностью и обрабатывает клик. Но осталась проблема с прозрачностью самого контрола, как контейнера для нарисованной картинки. Но это уже проблема в рамках Compact Framework. Спасибо за участие!

Автор: diadiavova 12.11.2008, 09:16
Цитата(3she1on @  12.11.2008,  04:24 Найти цитируемый пост)
Но осталась проблема с прозрачностью самого контрола, как контейнера для нарисованной картинки.

Там просто надо задать ему BackColor с прозрачностью, только делать это надо в коде, а не в дизайнере
Код

 public ImageIcon(Image img, int x, int y)
        {
            icon = img;
            iconPosX = x;
            iconPosY = y;
            this.Click += new EventHandler(ImageIcon_Click);
            this.BackColor = Color.FromARGB(128, 0, 255, 100);//не знаю, что за цвет, но полупрозрачный
        }


Имя функции FromARGB писал по памяти, так что если ошибся в регистре - сам исправь.

Автор: 3she1on 12.11.2008, 13:05
Ругается на 4 аргумента

Автор: diadiavova 12.11.2008, 15:10
Ну да - это чудеса компактфреймвока. Ничего не попишешь - здесь это просто не предусмотрено.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)