С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/22: Рейтинг темы: голосов - 22, средняя оценка - 4.68
 Аватар для Pirat-SR
67 / 67 / 10
Регистрация: 20.02.2012
Сообщений: 234

Кнопка из Image

21.06.2012, 15:57. Показов 4578. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Создал кнопку из Image но столкнулся с такой трудность, когда на Image наведена мышь и нажимаеш на Image картинка не меняется. Подскажите пожалуйста как правильно сделать кнопку из Image, в трёх видах. (C++ Builder 6)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2012, 15:57
Ответы с готовыми решениями:

Кнопка, замена Image при наведении
Скажем 3 картинки :клавиша в статичном состоянии(Image1),на клавишу навели курсор(Image 2),на клавишу нажали(Image3). Поделитесь...

Image кнопка
Здравствуйте! Как сделать чтобы получилась кнопка. Например: я хочу чтоб было 1 изображение если я на нее навиду курсор то 1 изображение...

Надо что бы при нажатии на какой либо Image с картинкой, картинка перекидывалась в пусто Image, а Image на который нажали исчезал.
Имеется 4 Image в 3 из них находятся картинки, а 4 пустой. Надо что бы при нажатии на какой либо Image с картинкой, картинка перекидывалась...

15
 Аватар для Vovik_0_1
40 / 40 / 6
Регистрация: 28.07.2011
Сообщений: 431
21.06.2012, 16:16
Вот держи.
Вложения
Тип файла: rar Button.rar (411.2 Кб, 249 просмотров)
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.06.2012, 16:16
Например, использовать image->picture->bitmap->assign() для смены изображения. Много способов так-то.
1
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
21.06.2012, 16:21
Цитата Сообщение от BRcr Посмотреть сообщение
Например, использовать image->picture->bitmap->assign() для смены изображения. Много способов так-то.
Assign слишком медленно. Лучше рисовать на канве Image.
1
 Аватар для Pirat-SR
67 / 67 / 10
Регистрация: 20.02.2012
Сообщений: 234
21.06.2012, 16:24  [ТС]
Vovik_0_1, BRcr, T2skler Спасибо

Добавлено через 2 минуты
Я делаю вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ExitMouseDown(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
Exit->Picture->LoadFromFile("Картинки кнопок/Pressed/Exit (pressed).jpg");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ExitMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
Exit->Picture->LoadFromFile("Картинки кнопок/Move/Exit (move).jpg");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::ExitMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
Exit->Picture->LoadFromFile("Картинки кнопок/Normal/Exit (normal).jpg");
}
//---------------------------------------------------------------------------
Думаю проблема в Move.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.06.2012, 16:30
( Может потому, что MouseMove - по форме, а в тот момент, когда мыша бежит по картинке (она же, надеюсь, Enable) - обработчик должен быть ее. ) не считать (и не читать)
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2012, 16:35
Цитата Сообщение от T2skler Посмотреть сообщение
Assign слишком медленно. Лучше рисовать на канве Image.
Откуда такое заключение?
1
 Аватар для Pirat-SR
67 / 67 / 10
Регистрация: 20.02.2012
Сообщений: 234
21.06.2012, 16:43  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
( Может потому, что MouseMove - по форме, а в тот момент, когда мыша бежит по картинке (она же, надеюсь, Enable) - обработчик должен быть ее. ) не считать (и не читать)
Честно сказать я не понял что вы сказали.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.06.2012, 17:10
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
Graphics::TBitmap *norm, *move, *press;
norm = new Graphics::TBitmap();
move = new Graphics::TBitmap();
press = new Graphics::TBitmap();
move->LoadFromFile("Картинки кнопок/Move/Exit (move).jpg");
norm->LoadFromFile("Картинки кнопок/Normal/Exit (normal).jpg");
press->LoadFromFile("Картинки кнопок/Pressed/Exit (pressed).jpg");
enum {NORM, PRESS, MOVE};
int state = NORM;
bool state_is( int _state ){ return state == _state; }
 
void __fastcall TForm1::ExitMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) {
  if ( state_is(NORM) ) { 
    Exit->Picture->Bitmap->Assign(move);
    state = MOVE;
  }
}
void __fastcall TForm1::ExitMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
  Exit->Picture->Bitmap->Assign(press);
  state = PRESS;
}
void __fastcall TForm1::ExitMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
  Exit->Picture->Bitmap->Assign(norm);
  state = NORM;
}
void __fastcall TForm1::ExitMouseLeave(TObject *Sender) {
  Exit->Picture->Bitmap->Assign(norm);
  state = NORM;
}
//... где-то далее, когда кнопка уже не нужна:
delete norm;
delete move;
delete press;
Так несколько логичнее.
2
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
21.06.2012, 17:19
Цитата Сообщение от Avazart Посмотреть сообщение
Откуда такое заключение?
Потому что я наркоман AQtime показал, что скорость выполнения метода Assign и Draw у канвы почти одинакова. Извиняюсь за неправильную информацию.

Использовать каждый раз LoadFromFile тоже не стоит. Лучше загружать 3 картинки при старте программы, а потом как и сказал BRcr, использовать метод Assign.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseEnter(TObject *Sender) {
    Image1->Picture->LoadFromFile(L"D:\\Dynamic.bmp");
}
// ---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseLeave(TObject *Sender) {
    Image1->Picture->LoadFromFile(L"D:\\Static.bmp");
}
// ---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
    Image1->Picture->LoadFromFile(L"D:\\Pressed.bmp");
}
// ---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
    Image1->Picture->LoadFromFile(L"D:\\Static.bmp");
}
// ---------------------------------------------------------------------------
Неправильный (из-за постоянно загрузки из файла), но решающий вашу проблему вариант.
2
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2012, 17:37
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//----------------------------------
Graphics::TBitmap *LeaveBitmap;
Graphics::TBitmap *DownBitmap;
Graphics::TBitmap *MoveBitmap;
 
bool pressed=false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
LeaveBitmap  = new Graphics::TBitmap;
DownBitmap   = new Graphics::TBitmap;
MoveBitmap   = new Graphics::TBitmap;
 
try
{
 LeaveBitmap->LoadFromFile("1.bmp");
 DownBitmap->LoadFromFile("2.bmp");
 MoveBitmap->LoadFromFile("3.bmp");
}
catch(...)
 {
 ShowMessage("Неудается загрузить картинки");
 Application->Terminate();
 }
 
Image1->Picture->Bitmap = LeaveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
Image1->Picture->Bitmap = DownBitmap;
pressed= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
if(!pressed) Image1->Picture->Bitmap = MoveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{
Image1->Picture->Bitmap = LeaveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
Image1->Picture->Bitmap = MoveBitmap;
pressed= false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
delete  MoveBitmap,LeaveBitmap,DownBitmap;
}
//---------------------------------------------------------------------------
Вложения
Тип файла: rar 45.rar (283.4 Кб, 34 просмотров)
1
 Аватар для Pirat-SR
67 / 67 / 10
Регистрация: 20.02.2012
Сообщений: 234
21.06.2012, 17:40  [ТС]
Всем спасибо, буду пробовать.
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
21.06.2012, 19:11
Создание событий MouseEnter и MouseLeave для TImage (решено)
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.06.2012, 19:19
Avazart, все верно, только вот зачем же присваивать что-то указателю Image1->Picture->Bitmap? А если TPicture уже до этого сам создал объект TBitmap? Указатель затрется и получайте утечку памяти и возможные конфликты при разрушении объектов.
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.06.2012, 19:35
Да не порядок...
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Graphics::TBitmap *DefaultBitmap; // !!!
 
Graphics::TBitmap *LeaveBitmap;
Graphics::TBitmap *DownBitmap;
Graphics::TBitmap *MoveBitmap;
 
bool pressed=false;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
LeaveBitmap  = new Graphics::TBitmap;
DownBitmap   = new Graphics::TBitmap;
MoveBitmap   = new Graphics::TBitmap;
 
try
{
 LeaveBitmap->LoadFromFile("1.bmp");
 DownBitmap->LoadFromFile("2.bmp");
 MoveBitmap->LoadFromFile("3.bmp");
}
catch(...)
 {
 ShowMessage("Неудается загрузить картинки");
 Application->Terminate();
 }
 
DefaultBitmap = Image1->Picture->Bitmap; // !!!
Image1->Picture->Bitmap = LeaveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
Image1->Picture->Bitmap = DownBitmap;
pressed= true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{
if(!pressed) Image1->Picture->Bitmap = MoveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseLeave(TObject *Sender)
{
Image1->Picture->Bitmap = LeaveBitmap;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
Image1->Picture->Bitmap = MoveBitmap;
pressed= false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Image1->Picture->Bitmap= DefaultBitmap; // !!!
delete  MoveBitmap,LeaveBitmap,DownBitmap;
}
//---------------------------------------------------------------------------
1
 Аватар для Pirat-SR
67 / 67 / 10
Регистрация: 20.02.2012
Сообщений: 234
17.11.2012, 23:53  [ТС]
Рабочий код. Может кому пригодится.
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
43
44
45
46
47
48
49
50
51
52
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(Label1->Caption == "На кнопке")
{}
else
{
Image1->Picture->LoadFromFile("2.jpg");
}
Label1->Caption = "На кнопке";
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
Image1->Picture->LoadFromFile("3.jpg");        
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Image1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
if(Label1->Caption == "Не на кнопке")
{
Image1->Picture->LoadFromFile("1.jpg");
}
else
{}
if(Label1->Caption == "На кнопке")
{
Image1->Picture->LoadFromFile("2.jpg");
}
else
{}
}
//---------------------------------------------------------------------------
    
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
if(Label1->Caption == "Не на кнопке")
{}
else
{
Image1->Picture->LoadFromFile("1.jpg");
}
Label1->Caption = "Не на кнопке";
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2012, 23:53
Помогаю со студенческими работами здесь

Image 1 под Image 2 и Image 3 как заставить его работать как кнопку?
Имеется несколько Image, все они расположены друг на друге, Image используемый как кнопка перестаёт работать когда поверх него расположен...

Image 1 под Image 2 и Image 3 как заставить его работать как кнопку?
Имеется несколько Image, все они расположены друг на друге, Image используемый как кнопка перестаёт работать когда поверх него расположен...

Python v2.7. PyGame. Разница в пикселях между image.load и image.fill
Здравствуйте. Учусь пайтону, пишу небольшой шутер. Возникла проблема в, очевидно, этой части кода. Если просто заполнить цветом...

Drag and Drop с Image. Растягивает окно при перемещении Image
Растягивает окно формы при перемещении Image. Как избавится от такого недуга )

Как конвертировать java.io.File к javafx.scene.image.Image?
Пробую вот такой способ и не выходит. InputStream is = null; try {is = new FileInputStream(myFile);} catch...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru