Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Прозрачность формы


OH ©   (2007-07-02 10:31:00) 

Такой вопрос - есть форма - полупрозрачная. Надо принаведении курсора мышки уменьшить прозрачность, а при "убирании - увеличить. Уменьшение прозрачности прописал в OnMouseMove, а увеличение где прописать?


{RASkov}   (2007-07-05 15:23:00) [1]

> [10] Инс ©   (05.07.07 14:20)
> > {RASkov} ©   (05.07.07 14:07) [9]
>
> Вот зачем таймер фигачить, там где он не нужен? Из-за лени заглянуть в MSDN?

Ага :) Там еще и разобраться нужно в английских словах....

> [11] Инс ©   (05.07.07 14:43)

Действительно... эта "штука" работает.... и работает лучше чем VCL'вские аналоги Leave и Enter...

> [12] homm_ro   (05.07.07 14:56)
> Здрасти, а что это в onMuseMove делает?

Посылает те самые сообщения(WM_MOUSEHOVER и WM_MOUSELEAVE), походу.... Т.е. WM_MOUSEHOVER всегда, пока мышь "елозит" по форме, а WM_MOUSELEAVE - когда ее(форму) покидает... Что замечательно, так - WM_MOUSELEAVE - всегда приходит. Потестил тут 5 мин....Все вроде ОК пока...:)


homm_ro   (2007-07-05 14:56:00) [2]

> tme.cbSize:=SizeOf(tagTRACKMOUSEEVENT);
> tme.dwFlags:=TME_LEAVE or TME_HOVER;
> tme.hwndTrack:=Handle;
> tme.dwHoverTime:=1;
> TrackMouseEvent(tme);

Здрасти, а что это в onMuseMove делает?


Инс   (2007-07-05 14:43:00) [3]

Для ленивых:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
 private
   { Private declarations }
   procedure WMMouseHover(var Message: TMessage); message WM_MOUSEHOVER;
   procedure WMMouseLeave(var Message: TMessage); message WM_MOUSELEAVE;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMMouseHover(var Message: TMessage);
begin
 Caption:='Ïðèøëà';
end;

procedure TForm1.WMMouseLeave(var Message: TMessage);
begin
 Caption:='Óøëà';
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
 tme: tagTRACKMOUSEEVENT;
begin
 tme.cbSize:=SizeOf(tagTRACKMOUSEEVENT);
 tme.dwFlags:=TME_LEAVE or TME_HOVER;
 tme.hwndTrack:=Handle;
 tme.dwHoverTime:=1;
 TrackMouseEvent(tme);
end;

end.


Инс   (2007-07-05 14:20:00) [4]


> {RASkov} ©   (05.07.07 14:07) [9]


Вот зачем таймер фигачить, там где он не нужен? Из-за лени заглянуть в MSDN?


{RASkov}   (2007-07-05 14:07:00) [5]

Зря вы так...
> OnMouseEnter и OnMouseLeave

Они не всегда срабатывают. Т.е. криво работают.... правда я не знаю про [8] - может оно и то что надо, но в данном случае сделал бы так:
......
   procedure Timer1Timer(Sender: TObject);
   procedure SetAlphaVal(const Value: Integer);
 private
   FAlphaVal: Integer;
   property AlphaVal: Integer read FAlphaVal write SetAlphaVal;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetAlphaVal(const Value: Integer);
var N: Integer;
begin
 if FAlphaVal = Value then Exit;
 if FAlphaVal>Value then
  for N := FAlphaVal downto Value do begin
   AlphaBlendValue:=N;
  end
 else
  for N := FAlphaVal to Value do begin
   AlphaBlendValue:=N;
  end;
 FAlphaVal := Value;
end;

procedure TForm1.Timer1Timer(Sender: TObject); //Interval=<250
begin
 if PtInRect(BoundsRect, Mouse.CursorPos) then AlphaVal:=255 else AlphaVal:=100;
end;

end.


Инс   (2007-07-05 13:34:00) [6]


> Можно еще написать сервис, который будет загружаться при
> старте системы и отслеживать положение мышки.


Ооо! Мсье понимает толк в извращениях!..


> OH   (02.07.07 10:31) [0]


Можно еще глянуть TrackMouseEvent + WM_MOUSEHOVER + WM_MOUSELEAVE в MSN


Inco   (2007-07-05 13:15:00) [7]


> DagOT-R ©   (05.07.07 04:21) [2]


Можно еще написать сервис, который будет загружаться при старте системы и отслеживать положение мышки.


ПЛОВ   (2007-07-05 12:40:00) [8]


> DagOT-R ©   (05.07.07 04:21) [2]

Лучше через ADO :)


homm_ro   (2007-07-05 11:18:00) [9]

> [3] iXT ©   (05.07.07 09:47)
> Сэр, не засоряйте автору мозги бредовыми идеями!

+1


exactly   (2007-07-05 09:54:00) [10]

OnMouseEnter и OnMouseLeave


iXT   (2007-07-05 09:47:00) [11]


> DagOT-R ©   (05.07.07 04:21) [2]
>
>

Сэр, не засоряйте автору мозги бредовыми идеями!


DagOT-R   (2007-07-05 04:21:00) [12]

Используй свойство Mouse.CursorPos чтобы определить, над формой курсор или нет. Также, если тебе так важна эта затея, создай Таймер, поставь свойство Interval где-то в районе 50 (самое то), свойство Enabled=true;
Потом пропиши на OnTimer:
ProcedureTimer1OnTimer(Sender: TObject);
begin
If(mouse.cursorpos.x>form1.left) and(mouse.cursorpos.x<form1.left+form1.width)
and(mouse.cursorpos.y>form1.top) and(mouse.cursorpos.y<form1.top+form1.height) and(form1.alphablendvalue=110)  then form1.alphablendvalue:=210 elseform1.alphablendvalue:=110;
end;

> Здесь число 110-коэф. прозр. при "уходе" курсора за пределы
> окна, 210-при наведении. Ещё один плюс: условие ...and(form1.
> alphablendvalue=110) ... позволит сэкономить на оперативке(а
> то на слабых машинах окно может "нездорово мерцать").


homm   (2007-07-02 10:41:00) [13]

http://www.softhelp.ru/delphi/osferum/n.php?x=add_event_onmouseleave


Наверх

Титульная страница Поиск, карта сайта Написать письмо