CyberForum.ru - Форум программистов и сисадминов
Вернуться   Форум программистов и сисадминов CyberForum.ru > Форум программистов > Форум C++ > Форум C++ Builder

Ответ Создать новую тему
 
Старый 11.06.2010, 17:16   #1
NiTan
Покинул форум
 
Регистрация: 29.01.2010
Сообщений: 3,657
Репутация: 2988 (1172)
По умолчанию Создание событий MouseEnter и MouseLeave для TImage (решено)

Раз на форуме появилось огромное количество желающих, которым нужно событие OnMouseEnter и OnMouseLeave для TImage, то почему бы этого не сделать?!
Сие краткое руководство (да что там руководство, просто пример) поможет вам разобраться в этой проблеме (надеюсь).
За основу был взять пример из интернета , но слегка модифицирован и упрощен, а также прокомментирован по мере возможности и знаний автора (я скорее практик, чем теоретик, поэтому за скупое описание прошу не судить).

1. Для начала нужно создать нашу кнопку. Оба состояние кнопки будут в одном изображении (левая часть изображения до середины отвечает за исходное состояние, а правая часть после середины за измененное). Размер кнопки может быть любой, но для начала сделайте размер 150*40, а при склеивании должно получится 300*40.

2. Теперь переходим к созданию своего класса! Делать мы его будем на основе TImage, так как это, по моему скромному мнению, самый идеальный вариант. Можно было бы использовать TButton, но он не имеет свойство TCanvas, которое нам необходимо:

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class TFunnyButton: public TImage  //Собственно наш класс
     {
     Graphics::TBitmap *Source_Bitmap;  /*Создаем TBitmap, который будет хранить целое изображение кнопки,
         Так как в Picture у нас будет только выводится готовое "обрезанное" изображение*/
        public: 
            //Теперь обьявляем новые функции для нашего класса
        virtual void __fastcall  OnMouseEnter(TMessage &msg)   //Курсор на кнопке
        {
        Canvas->CopyRect(Rect(0,0,Width,Height),Source_Bitmap->Canvas,Rect(Width,0,Width*2,Height));  /*Так как изображение у нас состоит из 2 частей, где первая левая часть - это исходное изображение,
            а правая отрисовывается при попадании курсора на кнопку, то мы копируем соответственно правую часть исходного изображения (от Width до Width*2) */
        }
 
        virtual void __fastcall  OnMouseLeave(TMessage &msg)  //Курсор покидает кнопку
        {
 
        Canvas->CopyRect(Rect(0,0,Width,Height),Source_Bitmap->Canvas,Rect(0,0,Width,Height));
        //Делаем тоже самое что и при попадании крсора на кнопку, только в этот раз копируем левую часть
 
        }
 
        _fastcall TFunnyButton::TFunnyButton(AnsiString BitmapName):TImage(Owner){   //Конструктор обьекта, в качестве аргумента принимается только путь к файлу
 
 
            Width=150;  //Устанавливаем ширину кнопки по умолчанию
            Height=40;  //Устанавливаем высоту кнопки по умолчанию
           Source_Bitmap=new Graphics::TBitmap;
           Source_Bitmap->Width=Width*2;
           Source_Bitmap->Height=Height;
 
           Source_Bitmap->LoadFromFile(BitmapName);  //Загружаем само изображение из файла, указанного в BitmapName
           Canvas->CopyRect(Rect(0,0,Width,Height),Source_Bitmap->Canvas,Rect(0,0,Width,Height));  //Теперь отрисовываем левую часть изображения (исходную)
           Transparent=true;  //Включаем "прозрачность" кнопки, чтобы она приобрела округленный вид
        }
 
        private:
        #pragma warn -8027  //Своего рода игнорирование предупреждения - использовать по желанию
        BEGIN_MESSAGE_MAP  //Это таблица сообщений, она служит для отлавливания сообщений от Windows. Если честно, то мне самому не очень понятно что происходит далее, точнее смысл понятен, а обьяснить не могу...
         VCL_MESSAGE_HANDLER(CM_MOUSEENTER,TMessage,OnMouseEnter);  
         VCL_MESSAGE_HANDLER(CM_MOUSELEAVE,TMessage,OnMouseLeave);
         END_MESSAGE_MAP(TImage)
         #pragma warn -8027 
     };
Теперь пример использования класса:
Код C++
1
2
     TFunnyButton  *b=new TFunnyButton("F:\\button.bmp"); //Загружаем изображение из F:\button.bmp
       b->Parent=Form1; //Обязательно нужно указать родителя
Вот и все. Теперь ждем пожеланий и улучшений от форумчан!!!
(Изображение кнопки, использованной в примере)
Миниатюры
Нажмите на изображение для увеличения
Название: button.jpg
Просмотров: 89
Размер:	6.5 Кб
ID:	33415  
NiTan вне форума
Другие темы раздела
Просьба Borland C++ Builder
Помогите сделать функции графики Пеано. Пожайлуста!!!. Просьба Borland C++ Builder
Вывод массива C++ Builder
Есть вопрос. У меня есть массив int a = {0,1,0,1,0,1,0,1,0,2} ; как можно его полностью вывести на экран. Я пробую через Edit, но у меня выводит только последний символ, а как вывести все, я не знаю. Подскажите пожалуйста!. Вывод массива
Старый 12.06.2010, 13:44   #2
Tree
Александр Иванович SD
 
Аватар для Tree
 
Регистрация: 31.05.2009
Адрес: Космос://Земля.планета/Украина/Киев/
Сообщений: 254
Репутация: 73 (72)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Так можно сделать уже и компонент с вкладкой "киберфорум"...)))
Tree вне форума
Старый 25.06.2010, 23:02   #3
Vladant
Форумчанин
 
Регистрация: 26.03.2010
Сообщений: 168
Репутация: 8 (8)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Классно придумал! Спасибо!
Vladant вне форума
Старый 29.03.2011, 22:41   #4
Storm255
Новичок
 
Аватар для Storm255
 
Регистрация: 17.10.2009
Адрес: Минск
Сообщений: 46
Репутация: 0 (0)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

А как вместо тяжелого Bitmap сделать так, чтоб читал JPEG?
Storm255 вне форума
Старый 29.03.2011, 22:44   #5
LK
Модератор
 
Аватар для LK
 
Регистрация: 09.04.2010
Сообщений: 9,548
Репутация: 6295 (3791)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Цитата Сообщение от Storm255 Посмотреть сообщение
чтоб читал JPEG?
инклюдить заголовочный файл jpeg
LK вне форума
Старый 30.03.2011, 00:04   #6
Storm255
Новичок
 
Аватар для Storm255
 
Регистрация: 17.10.2009
Адрес: Минск
Сообщений: 46
Репутация: 0 (0)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Цитата Сообщение от LK Посмотреть сообщение
инклюдить заголовочный файл jpeg
не совсем понятна данная фраза. в смысле библиотеку прописать, #include? или что вы имели в ввиду?

А строчку Source_Bitmap, нельзя заменить на что либо подобное для чтения JPEG?
Storm255 вне форума
Старый 30.03.2011, 02:37   #7
LK
Модератор
 
Аватар для LK
 
Регистрация: 09.04.2010
Сообщений: 9,548
Репутация: 6295 (3791)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

1.
Код C++
1
#include <jpeg.hpp>
2. нет:
//*Создаем TBitmap, который будет хранить целое изображение кнопки,
с таким же успехом вы можете указать "MyBitmap", "this_bitmam", "bitmap" и т.д.
LK вне форума
Старый 30.03.2011, 16:14  [ТС]   #8
NiTan
Покинул форум
 
Регистрация: 29.01.2010
Сообщений: 3,657
Репутация: 2988 (1172)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Storm255, jpeg читать-то будет, только вот все равно придется попутно программно конвертировать в BMP.
NiTan вне форума
Старый 30.03.2011, 21:22   #9
Storm255
Новичок
 
Аватар для Storm255
 
Регистрация: 17.10.2009
Адрес: Минск
Сообщений: 46
Репутация: 0 (0)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

Понятно, спасибо.
Storm255 вне форума
После регистрации реклама в сообщениях будет скрыта
Старый 10.01.2012, 17:41   #10
Maratwp
Форумчанин
 
Регистрация: 22.03.2010
Адрес: Беларусь
Сообщений: 117
Репутация: 2 (2)
По умолчанию Re: Создание событий MouseEnter и MouseLeave для TImage (решено)

А картинка получается не активной в итоге? т.е. её нельзя использовать как кнопку???
Maratwp вне форума
Ответ Создать новую тему

Похожие темы
Тема Автор
C# для начинающих События на MouseEnter и MouseLeave используя Graphics
Помогите пожалуйста, вот нарисовал методом: private Graphics graphicsRectangleTwo(){ Graphics graphicsRectangle = this.CreateGraphics(); Rectangle rectangle = new Rectangle(455, 10, 40, 40); graphicsRectangle.FillRectangle(Brushes.Silver,...
irineyxxx
Delphi для начинающих Обработка событий OnClick для массива TImage
Добрый день. Я совсем новичек в программировании, поэтому возник вопрос. Я динамически создаю несколько TImage из Imagelist. Как самым простым и надежным способом создать один обработчик типа OnClick для этого массива кнопок. В примере рисунков два, но на самом деле их 30, думаю будет глупо для...
yachsmit48
.NET Windows Forms создание событий
вот такое дело перехожу на си шарн с языка дельфай, и вот интересует динамическое создание обьектов и обработка событий в них. Обьясните: вот например я создал кнопку програмно: private void Form1_Load(object sender, EventArgs e) { Button button1 = new...
n971030
.NET Windows Forms События MouseEnter и MouseLeave
У меня на форме не большой Splitter, ширика 3-4 пикселя, на его события MouseEnter и MouseLeave повешены обработчики, но если очень быстро двигать мышкой, события не отрабатывают, не подскажите как можно побороть это?
Johnny_D
Delphi для начинающих Timage, создание TLabel
1. Загрузка PNG в TImage сохранением прозрачности.. до сих пор, у кого не спрашивал, никто ничего хорошего не подсказал. Может тут найдутся такие люди =) 2. Размещение части изображения в TImage.. Тоесть например изображение 1024*1024, а надо разместить начиная с координат 10,10 и заканчивая...
Lifebinder
Опции темы

Текущее время: 00:25. Часовой пояс GMT +4.

Компьютерный форум программистов и сисадминов
Powered by vBulletin® Version 3.8.7 PL2
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Рейтинг@Mail.ru Яндекс.Метрика