Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2011, 23:55   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию [Винды]Прозрачно/Не прозрачно при наведении/убирании курсора с окна

Всем добнрого времени суток!

Вопрос таков:
Как реализовать прозрачность в программе?

интересует:
Плавное появление и скрытие окна.
Показ окна(влавно) при наведению мыши и скрытие окна(плавно) при убирании курсора с окна.


Про AlphaBlend известно, как реализовать интересуещее..
Человек_Борща вне форума Ответить с цитированием
Старый 13.03.2011, 00:15   #2
BuT@JL
Форумчанин
 
Регистрация: 27.11.2008
Сообщений: 137
По умолчанию

Код:
procedure TForm1.FormDeactivate(Sender: TObject);
begin
ReleaseCapture;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if GetCapture = 0 then
    SetCapture(Form1.Handle);
  if PtInRect(Rect(Form1.Left,Form1.Top, Form1.Left + Form1.Width, Form1.Top + Form1.Height), ClientToScreen(Point(x, y))) then
    begin
    timer1.Enabled:=true;
    timer2.Enabled:=false;
    end
  else
    begin
    timer1.Enabled:=false;
    timer2.Enabled:=true;
    end
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if alphablendvalue<255 then alphablendvalue:=alphablendvalue+1;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
if alphablendvalue>1 then alphablendvalue:=alphablendvalue-1;
end;

end.

Последний раз редактировалось Stilet; 13.03.2011 в 12:27.
BuT@JL вне форума Ответить с цитированием
Старый 13.03.2011, 00:45   #3
asmodey1
Подтвердите свой е-майл
 
Регистрация: 19.12.2010
Сообщений: 808
По умолчанию

То BuT@JL - что-то вы намудрили, да и вообще не то предложили...
Делаем так:
Код:
type
TForm1 = class(TForm)
private
procedure CMMOUSEENTER(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMOUSELEAVE(var Message: TMessage); message CM_MOUSELEAVE;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CMMOUSEENTER;
begin
while AlphaBlendValue<255 do
begin
AlphaBlendValue:=AlphaBlendValue+1;
Application.ProcessMessages;
end;
end;

procedure TForm1.CMMOUSELEAVE;
begin
while AlphaBlendValue>1 do
begin
AlphaBlendValue:=AlphaBlendValue-1;
Application.ProcessMessages;
end;
end;
asmodey1 вне форума Ответить с цитированием
Старый 13.03.2011, 03:30   #4
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

на половину поддерживаю asmodey1
Код:
procedure TForm1.CMMOUSEENTER;
begin
while AlphaBlendValue<255 do
begin
AlphaBlendValue:=AlphaBlendValue+1;
Application.ProcessMessages;
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (Mouse.CursorPos.X < Left + 10) or (Mouse.CursorPos.X > Left + Width - 10) or
    (Mouse.CursorPos.Y < Top + 10) or (Mouse.CursorPos.Y > Top + Height - 10) then
    while AlphaBlendValue>2 do
    begin
      AlphaBlendValue:=AlphaBlendValue-1;
      Application.ProcessMessages;
    end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 10:40   #5
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Код:
uses Math;

const
  a_min=80;
  a_max=240;
  a_step=4;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  AlphaBlend:=true;
  AlphaBlendValue:=a_min;
  Timer1.Interval:=1;
  Timer1.Enabled:=false;
end;

procedure TForm1.FormMouseEnter(Sender: TObject);
begin
  with Timer1 do begin
    Tag:=1;
    Enabled:=true;
  end;
end;

procedure TForm1.FormMouseLeave(Sender: TObject);
begin
  with Timer1 do begin
    Tag:=-1;
    Enabled:=true;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  AlphaBlendValue:=EnsureRange(AlphaBlendValue+(Timer1.Tag*a_step), a_min, a_max);
  if (AlphaBlendValue=a_min) or (AlphaBlendValue=a_max) then Timer1.Enabled:=false;
end;
x128 вне форума Ответить с цитированием
Старый 13.03.2011, 10:55   #6
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

x128
Код:
procedure TForm1.FormMouseLeave(Sender: TObject);
а что надо зделать что б выполнилась ета процедура?
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 11:06   #7
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

В событиях формы даблкликнуть по OnMouseLeave, если старая делфи, тогда сделать свой обработчик как писал asmodey1.

для делфи 7
Код:
type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Image1: TImage;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

const
  a_min=80;
  a_max=240;
  a_step=4;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AlphaBlend:=true;
  AlphaBlendValue:=a_min;
  Timer1.Interval:=1;
  Timer1.Enabled:=false;
end;

procedure TForm1.MouseEnter(var Message: TMessage);
begin
  with Timer1 do begin
    Tag:=1;
    Enabled:=true;
  end;
end;

procedure TForm1.MouseLeave(var Message: TMessage);
begin
  with Timer1 do begin
    Tag:=-1;
    Enabled:=true;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  AlphaBlendValue:=EnsureRange(AlphaBlendValue+(Timer1.Tag*a_step), a_min, a_max);
  if (AlphaBlendValue=a_min) or (AlphaBlendValue=a_max) then Timer1.Enabled:=false;
end;

Последний раз редактировалось x128; 13.03.2011 в 11:13.
x128 вне форума Ответить с цитированием
Старый 13.03.2011, 11:17   #8
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

а в какои ето версии, я просто первое что подумал ето такои вариант, но у меня нет етого
а разве ето событие происходит если убрать с формы мышь, но окно при етом будет активно
VirusN13
ArtGrek вне форума Ответить с цитированием
Старый 13.03.2011, 11:28   #9
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

Событие MouseEnter приходит когда курсор попадает на клиентскую область окна (даже если окно не активно), MouseLeave соответственно, когда курсор уходит. В старых версиях делфи <=7 в менеджере событий их нет, во всех более новых есть.
x128 вне форума Ответить с цитированием
Старый 13.03.2011, 11:48   #10
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

а зачем тогда таимер, вот то что сказал asmodey1 ток в ети события, на Д2009,
на Д7 у меня не работает Leave, даже вариант asmodey1
Код:
procedure TForm1.FormMouseEnter(Sender: TObject);
begin
  while AlphaBlendValue<255 do
  begin
    AlphaBlendValue:=AlphaBlendValue+1;
    Application.ProcessMessages;
  end;
end;

procedure TForm1.FormMouseLeave(Sender: TObject);
begin
  while AlphaBlendValue>2 do
  begin
    AlphaBlendValue:=AlphaBlendValue-1;
    Application.ProcessMessages;
  end;
end;
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
событие при наведении курсора на кнопку Droid JavaScript, Ajax 2 15.01.2011 22:02
Подсказка при наведении курсора мыши Syltan JavaScript, Ajax 2 23.04.2010 15:31
Смена картинки при наведении курсора Шсу HTML и CSS 1 26.10.2009 19:50
Выделение картинки при наведении курсора blazer-05 HTML и CSS 1 03.07.2009 10:43
увеличение излбражения при наведении курсора SKS HTML и CSS 4 08.03.2009 13:39