Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 1
Регистрация: 17.09.2013
Сообщений: 130

Прозрачность формы, при наведении мыши на кнопку реализовать изменение её положения относительно формы с невозможностью выхода за границы формы

22.01.2014, 22:29. Показов 3965. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
доброй ночи, уважаемые программисты, студенты,а также любители программировать.
помогите, пожалуйста, написать программу на языке С++ Builder XE4 в VCL Forms Application - Builder XE4(то есть в визуальном режиме).

вот задание:
с помощью компонента контейнера Panel поделите пространство формы на две части (главная и нижняя). на главной части разместить кнопку Button. на нижней правой части разместить компонент TrackBar. при изменении "ползунка" TrackBar реализовать возможность изменения прозрачности формы. при наведении мыши на кнопку Button реализовать возможность изменения её положения относительно формы с невозможностью выхода за границы формы.

я не знаю как сделать:
1)при изменении "ползунка" TrackBar реализовать возможность изменения прозрачности формы.
2)при наведении мыши на кнопку Button реализовать возможность изменения её положения относительно формы с невозможностью выхода за границы формы.

ЗАРАНЕЕ ОГРОМНОЕ СПАСИБО ВСЕМ ЗА ПОМОЩЬ!!!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2014, 22:29
Ответы с готовыми решениями:

Вывести поточные координаты курсора мыши относительно формы и экрана, при нажатии на кнопку-реверсное изменение кнопок мыши C++
доброй ночи, уважаемые программисты, умные школьники, преуспевающие студенты, а также все участники этого форума. помогите, пожалуйста,...

Запретить срабатывание MouseLeave формы при наведении мыши на кнопку
Нужна помощь с Event'ами мыши. Есть Форма "Main" 200x100 и на ней кнопка (В той части формы, которая не отображается). При наведении на...

Изменение размера компонентов без выхода за границы формы
Подскажите пожалуйста, как решить проблемку. Имеются компоненты, которые в ходе выполнения программы должны менять размеры. Компонент...

4
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
23.01.2014, 10:14
Общее для обоих:
C++
1
2
3
4
5
6
void __fastcall TForm1::FormCreate(TObject *Sender)
{
TrackBar1->Max = 255;
TrackBar1->Position = TrackBar1->Max;
Form1->AlphaBlend = true;
}
Изменение ползунка:
C++
1
2
3
4
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Form1->AlphaBlendValue = TrackBar1->Position;
}
Наведение мыши:
C++
1
2
3
4
5
void __fastcall TForm1::Button1MouseEnter(TObject *Sender)
{
Button1->Top  = rand() % (Form1->ClientHeight - Button1->Height);
Button1->Left = rand() % (Form1->ClientWidth - Button1->Width);
}
1
1 / 1 / 1
Регистрация: 17.09.2013
Сообщений: 130
23.01.2014, 19:40  [ТС]
мне нужно было кинуть кнопку Button на Panel.
когда я запускаю программу и навожу мышью на кнопку Button, то она исчезает.
код программы:
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
#include <vcl.h>
#pragma hdrstop
 
#include "Unit66.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm66 *Form66;
//---------------------------------------------------------------------------
__fastcall TForm66::TForm66(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm66::Button1MouseEnter(TObject *Sender)
{
Button1->Top  = rand() % (Form66->ClientHeight - Button1->Height);
Button1->Left = rand() % (Form66->ClientWidth - Button1->Width);
}
//---------------------------------------------------------------------------
void __fastcall TForm66::TrackBar1Change(TObject *Sender)
{
Form66->AlphaBlendValue = TrackBar1->Position;
}
//---------------------------------------------------------------------------
void __fastcall TForm66::FormCreate(TObject *Sender)
{
TrackBar1->Max = 255;
TrackBar1->Position = TrackBar1->Max;
Form66->AlphaBlend = true;
}
//---------------------------------------------------------------------------
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
24.01.2014, 10:52
C++
1
2
3
4
5
void __fastcall TForm1::Button1MouseEnter(TObject *Sender)
{
Button1->Top  = rand() % (Panel1->ClientHeight - Button1->Height);
Button1->Left = rand() % (Panel1->ClientWidth - Button1->Width);
}

А лучше вот так, с проверкой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::Button1MouseEnter(TObject *Sender)
{
TPoint mousePos;
GetCursorPos( &mousePos );
 
int x_, y_;
do
  {
  x_ = rand() % (Panel1->ClientWidth - Button1->Width);
  y_ = rand() % (Panel1->ClientHeight - Button1->Height);
  }
  while( ( mousePos.x >= Form1->Left + Panel1->Left + x_                  &&
           mousePos.x <= Form1->Left + Panel1->Left + Button1->Width + x_ )
           ||
         ( mousePos.y >= Form1->Top + Panel1->Top + y_                    &&
           mousePos.y <= Form1->Top + Panel1->Top + Button1->Height + y_ )   );
 
Button1->Top  = y_;
Button1->Left = x_;
}
Добавлено через 48 минут
Вот так хоть на черта лысого кладите. Но только на одного (на панель, которая на другой панели не прокатит).
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::Button1MouseEnter(TObject *Sender)
{
TPoint mousePos;
GetCursorPos( &mousePos );
 
mousePos = ScreenToClient( mousePos );
 
int x_, y_;
do
  {
  x_ = rand() % ( ((TButton *)Sender)->Parent->ClientWidth - ((TButton *)Sender)->Width );
  y_ = rand() % ( ((TButton *)Sender)->Parent->ClientHeight - ((TButton *)Sender)->Height );
  }
  while( ( mousePos.x >= ((TButton *)Sender)->Parent->Left + x_                  &&
           mousePos.x <= ((TButton *)Sender)->Parent->Left + ((TButton *)Sender)->Width + x_ )
           ||
         ( mousePos.y >= ((TButton *)Sender)->Parent->Top + y_                    &&
           mousePos.y <= ((TButton *)Sender)->Parent->Top + ((TButton *)Sender)->Height + y_ )   );
 
Button1->Top  = y_;
Button1->Left = x_;
}
Добавлено через 2 минуты
Чтоб в глазах от скобок не рябило
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
void __fastcall TForm1::Button1MouseEnter(TObject *Sender)
{
#define oBut ((TButton *)Sender)
 
TPoint mousePos;
GetCursorPos( &mousePos );
 
mousePos = ScreenToClient( mousePos );
 
int x_, y_;
do
  {
  x_ = rand() % ( oBut->Parent->ClientWidth - oBut->Width );
  y_ = rand() % ( oBut->Parent->ClientHeight - oBut->Height );
  }
  while( ( mousePos.x >= oBut->Parent->Left + x_                  &&
           mousePos.x <= oBut->Parent->Left + oBut->Width + x_ )
           ||
         ( mousePos.y >= oBut->Parent->Top + y_                    &&
           mousePos.y <= oBut->Parent->Top +oBut->Height + y_ )   );
 
Button1->Top  = y_;
Button1->Left = x_;
}
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
24.01.2014, 15:27
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Универсальная функция. Позволяет двигать что угодно по чем угодно используя циклический восходящий поиск родителей. Можно класть панель на панель на панель на панель и так далее, и двигать любую из них. Достаточно прописать данную функцию в OnMouseEnter().
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
void __fastcall TForm1::ObjectMouseEnter( TObject *Sender )
{
#define objMove dynamic_cast<TControl*>(Sender)
 
TPoint mousePos;
GetCursorPos( &mousePos );
mousePos = ScreenToClient( mousePos );
 
 
int toFirftParentLeft = 0, toFirftParentTop = 0;
 
TControl *firstParentFind;
firstParentFind = dynamic_cast<TControl*>( Sender );
 
while(  !firstParentFind->Parent->InheritsFrom( this->ClassType() ) ) // Пока родитель не форма
  {
  toFirftParentLeft += firstParentFind->Parent->Left;
  toFirftParentTop  += firstParentFind->Parent->Top;
  firstParentFind = dynamic_cast<TControl*>( firstParentFind->Parent ); // Сам себе дедушка
  }
 
 
 
int x_, y_;
do
  {
  if( objMove->Parent->Width > 2*objMove->Width )
    x_ = rand() % ( objMove->Parent->ClientWidth - objMove->Width );
  else                                            // Если не влезает в родителя (не имеет смысла перемещать)
    {
    if( objMove->Parent->Height > 2*objMove->Height ) // Но хоть подергать чуток, если по другой оси влезет
      x_ = rand() % ( objMove->Parent->Width - objMove->Width );
    else
      x_ = objMove->Left;                         // Совсем-совсем не влезает
    break;
    }
 
  }
  while( ( mousePos.x >= toFirftParentLeft + x_                   &&    // Получилось увести из-под мышки?
           mousePos.x <= toFirftParentLeft + objMove->Width + x_ )  );  //
do
  {
  if( objMove->Parent->Height > 2*objMove->Height )
    y_ = rand() % ( objMove->Parent->ClientHeight - objMove->Height );
  else
    {
    if( objMove->Parent->Width > 2*objMove->Width )
      y_ = rand() % ( objMove->Parent->Height - objMove->Height );
    else
      y_ = objMove->Top;
    break;
    }
 
  }
  while(  ( mousePos.y >= toFirftParentTop + y_                    &&
           mousePos.y <= toFirftParentTop + objMove->Height + y_ )   );
 
objMove->Top  = y_;
objMove->Left = x_;
}
P.S. Оптимизацией можно заниматься до собачьей пасхи.

Добавлено через 56 минут
Upd1

Как правильно заметил славный UI пляски с поиском родителей это конечно все здорово, но подобная ситуация прекрасно решается и без этого (изменения в while):
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
void __fastcall TForm1::ObjectMouseEnter(TObject *Sender)
{
#define objMove dynamic_cast<TControl*>(Sender)
 
TPoint mousePos;
GetCursorPos( &mousePos );
mousePos = ScreenToClient( mousePos );
 
 
/*int toFirftParentLeft = 0, toFirftParentTop = 0;
 
TControl *firstParentFind;
firstParentFind = dynamic_cast<TControl*>( Sender );
 
while(  !firstParentFind->Parent->InheritsFrom( this->ClassType() ) ) // Пока родитель не форма
  {
  toFirftParentLeft += firstParentFind->Parent->Left;
  toFirftParentTop  += firstParentFind->Parent->Top;
  firstParentFind = dynamic_cast<TControl*>( firstParentFind->Parent ); // Сам себе дедушка
  }*/
 
 
 
int x_, y_;
do
  {
  if( objMove->Parent->Width > 2*objMove->Width )
    x_ = rand() % ( objMove->Parent->ClientWidth - objMove->Width );
  else                                            // Если не влезает в родителя (не имеет смысла перемещать)
    {
    if( objMove->Parent->Height > 2*objMove->Height ) // Но хоть подергать чуток, если по другой оси влезет
      x_ = rand() % ( objMove->Parent->Width - objMove->Width );
    else
      x_ = objMove->Left;                         // Совсем-совсем не влезает
    break;
    }
 
  }
  while( ( mousePos.x >= objMove->Parent->ScreenToClient(mousePos).x + x_                   &&    // Получилось увести из-под мышки?
           mousePos.x <= objMove->Parent->ScreenToClient(mousePos).x + objMove->Width + x_ )  );  //
do
  {
  if( objMove->Parent->Height > 2*objMove->Height )
    y_ = rand() % ( objMove->Parent->ClientHeight - objMove->Height );
  else
    {
    if( objMove->Parent->Width > 2*objMove->Width )
      y_ = rand() % ( objMove->Parent->Height - objMove->Height );
    else
      y_ = objMove->Top;
    break;
    }
 
  }
  while( ( mousePos.y >= objMove->Parent->ScreenToClient(mousePos).y + y_                    &&
           mousePos.y <= objMove->Parent->ScreenToClient(mousePos).y + objMove->Height + y_ )   );
 
objMove->Top  = y_;
objMove->Left = x_;
}


P.P.S. Все это корректно работает и на XE и на шестом билдере (но надо в OnMouseMove() естественно пихать).
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.01.2014, 15:27
Помогаю со студенческими работами здесь

Программное изменение ширины и положения кнопок относительно формы
При изменении размеров формы меняется ширина контрола Групбокс, внутри которого должны меняться ширина и X-координата расположения...

Изменение цвета формы в зависимости от положения формы по нажатию кнопки
Перерыл весь интернет, до самого не доходит, смысл задания разделить экран на четыре части равных, и если в первой части форма то цвет...

Создать следующую программу: при наведении указателя мыши на кнопку ее координаты изменяются произвольным образом в пределах формы (кнопка убегает
Создать следующую программу: при наведении указателя мыши на кнопку ее координаты изменяются произвольным образом в пределах формы (кнопка...

Увеличение формы при наведении мыши
Доброго времени! Пишу часы для себя и хочу добавить курс валют, но так чтобы они были видны когда я хочу, пример: в обычном режиме видно...

Изменение положения формы при нажатии кнопки
На форме есть кнопка jump. Как сделать так, чтобы при нажатии на неё один раз окно меняло место положение, а при нажатие второй раз...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru