![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность формы
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