Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Курсор над формой 
V
    Опции темы
Superklug
Дата 23.2.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Доброго времени суток!
Окно моей программы должно быть полупрозрачным в случае если оно неактивно. Если сделать его активным или навести курсор мыши оно должно становиться непрозрачным...

Сначала пробовал обрабатывать сообщения CM_MOUSELEAVE и CM_MOUSEENTER, но они работают не корректно (если быстро перемещать курсор, то сообщения не возникают). Решил сделать проверку по таймеру.

Возник вопрос... Как определить находится ли курсор над моей формой?

Я сделал так: 
Код

if((Mouse->CursorPos.x>fmMain->Left)&&
   (Mouse->CursorPos.x<fmMain->Left+fmMain->Width)&&
   (Mouse->CursorPos.y>fmMain->Top)&&
   (Mouse->CursorPos.y<fmMain->Top+fmMain->Height))

Но у такого способа есть недостаток.... Если мое окно неактивно, его перекрывает другое окно, то моя форма становится непрозрачной даже если курсор не покидал границ активной формы...
PM MAIL   Вверх
THandle
Дата 23.2.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Superklug, хммм... возможно что-то недопонял, но стандартные события формы OnMouseEnter, OnMouseLeave, OnMouseMove не подходят?
PM   Вверх
Dem_max
Дата 23.2.2009, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Так
Код

int Height, Width;
int Transparency = 60;
long ExtStyle;
TPoint cPt;
bool flMouseEnter = false;
bool flMouseLeave = true;
bool flSmall = true;

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetCursorPos(&cPt);
if(flSmall)
{
   if(int(cPt.y)<(Form1->Top+60)&&int(cPt.y)>Form1->Top&&int(cPt.x)>Form1->Left&&int(cPt.x)<(Form1->Left+120)&&flMouseEnter == false)
   {
      ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
      SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
      SetLayeredWindowAttributes(Handle,0,(255*100)/100,LWA_ALPHA);
      Form1->ClientHeight = 60;
      flMouseEnter = true;
      flMouseLeave = false;
   }
   if(int(cPt.y)<Form1->Top||int(cPt.y)>(Form1->Top+60)||int(cPt.x)>(Form1->Left+120)||int(cPt.x)<Form1->Left&&flMouseLeave == false)
   {
      ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
      SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
      SetLayeredWindowAttributes(Handle,0,(255*Transparency)/100,LWA_ALPHA);
      Form1->ClientHeight = 18;
      flMouseEnter = false;
      flMouseLeave = true;
   }
}
}
//---------------------------------------------------------------------------


результат


Это сообщение отредактировал(а) Dem_max - 23.2.2009, 18:29

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ______.zip 280,01 Kb


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Superklug
Дата 23.2.2009, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



THandle, Я пишу на Builder 6. Там нет таких событий... Переходить сейчас на другие версии уже поздно...


Dem_max, Проблема не устранена. Попробуйте сделать свою форму не поверх всех окон, потом перекройте часть формы другим окном и наведите курсор на перекрытый участок. Форма станет непрозрачной.
PM MAIL   Вверх
Mpak
Дата 23.2.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



Попробуйте добавить к способу Dem_max проверку на то, какое окно активно в момент наведения курсора на перекрытый участок smile


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Dem_max
Дата 24.2.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Вот держи код
Код

int Height, Width;
int Transparency = 60;
long ExtStyle;
TPoint cPt;
bool flMouseEnter = false;
bool flMouseLeave = true;
bool flSmall = true;

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
GetCursorPos(&cPt);
if(flSmall)
{
   if(int(cPt.y)<(Form1->Top+60)&&int(cPt.y)>Form1->Top&&int(cPt.x)>Form1->Left&&int(cPt.x)<(Form1->Left+120)&&flMouseEnter == false&&Application->Active)
   {
      ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
      SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
      SetLayeredWindowAttributes(Handle,0,(255*100)/100,LWA_ALPHA);
      Form1->ClientHeight = 60;
      flMouseEnter = true;
      flMouseLeave = false;
   }
   if(int(cPt.y)<Form1->Top||int(cPt.y)>(Form1->Top+60)||int(cPt.x)>(Form1->Left+120)||int(cPt.x)<Form1->Left&&flMouseLeave == false)
   {
      ExtStyle = GetWindowLong(Handle, GWL_EXSTYLE);
      SetWindowLong(Handle, GWL_EXSTYLE, ExtStyle | WS_EX_LAYERED);
      SetLayeredWindowAttributes(Handle,0,(255*Transparency)/100,LWA_ALPHA);
      Form1->ClientHeight = 18;
      flMouseEnter = false;
      flMouseLeave = true;
   }
}
}
//---------------------------------------------------------------------------

найди 1 отличие


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Mpak
Дата 24.2.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 445
Регистрация: 12.11.2006

Репутация: 4
Всего: 7



 smile 
А приз будет тому кто найдет?  smile 


--------------------
В любой откомпилированной программе есть, по крайней мере, одна ошибка...
P.S. А у меня их минимум две...
PM MAIL ICQ   Вверх
Superklug
Дата 25.2.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Эх( Опять меня не поняли...
Моя форма совсем не обязательно должна быть активна.

Попробую переформулировать... Необходимо узнать видна ли в данный момент под курсором моя форма. Т.е. необходимо учитывать не просто координаты, но и непосредственную видимость.
PM MAIL   Вверх
Dem_max
Дата 25.2.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 14
Всего: 39



Superklug
непонятный ты какой то.
Лови WM_KILLFOCUS еще чтонибудь тогда


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Superklug
Дата 25.2.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 227
Регистрация: 16.6.2006

Репутация: нет
Всего: нет



Ну вроде работает) 
Код

if(WindowFromPoint(Mouse->CursorPos)==Form1->Handle)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0885 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.