Здравствуйте, в данной статье хотел бы рассказать как я реализовал в одном своем проекте всплывающее окно. Да я знаю есть достаточно компонентов, которые позволяют сделать всплывающее окно, а также навести красоту в этом, но мне не надо было наводить красоту, обычное окно, которое будет информировать пользователей о чем-то. Может это метод, который делал я не совсем правильный, но я как-то так реализовал это. Использовал я в первую очередь TTimer, ну а остальное только на таймере я подвигал окно, конечно вместо таймера можно было использовать цикл, или что-то еще, но мне почему-то приглянулся он. На форме у меня

  • TTimer
  • TLabel

Ну и конечно надо настроить как-то более-менее красиво нашу форму, чтобы было похоже на красивое окно, можно конечно в дальнейшем свой дизайн придумать, нарисовать и украсить, но пока что сделаем ее чуть-чуть прозрачной и просто изменим стиль нашей формы, кроме этого, мы на нашем TLabel напишем что-нибудь, например, «Hello World» =).

Давайте поставим свойство формы AlphBlend в True, а AlphaValue в 180 установим. В свойстве Caption уберем надпись, а в свойстве BorderStyle установим в bsToolWindow, установим нужный размер нашей формы в нужный, а затем на событии OnShow необходимо нам написать первоначальное установление появление окна, по идее все всплывающие окна появляются рядом с треем. Но нам необходимо, чтобы наше окно первоначально появилось ниже панели задач, а из-за панели задач затем уже будет появляться наше окно — всплывать, итак на событии OnShow написан следующий код

procedure TForm1.FormShow(Sender: TObject);
begin
   Left:=Screen.Width-Width;
   Top:=Screen.Height-Height+90;
end;

Таким образом у нас окно появиться ниже панели задач и как раз в правой стороне экрана и таким образом будет появляться вверх. Теперь нам необходимо сделать якобы движение окна, то есть эффект его появления. Для этого в свойстве TTimer - Interval установим в 1 и на событие OnTimer напишем следующий код

procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Top:=Top-1;
   if Top=Screen.Height-Height-30 then
    Timer1.Enabled:=False;
end;

Тут если окно полностью появилось, то мы останавливаем наш таймер. Можно добиться и другого эффекта, просто уберем TTimer и на OnShow формы напишем следующий код

procedure TForm1.FormShow(Sender: TObject);
begin
   Left:=Screen.Width-Width;
   Top:=Screen.Height-Height-30;
   AnimateWindow(Handle,500,AW_CENTER or AW_SLIDE);
end;

Достаточно неплохо, так что можно делать и свои всплывающие окна, только их приукрасить

В настоящее время очень популярна аренда квартир, дач, участков и так далее. Это очень удобно, потому что снимается это все на определенное время. Квартиры в Одессе можно снять на неопределенный срок и за очень умеренные цены, а также очень комфортабельную квартиру.

Два вида окон с исходниками можно скачать тут

Автор статьи - Andrey53

Метки: , ,




К записи “Всплывающие окна” оставлено комментариев: 10.

  1. ter:

    немножко по сабжу:
    http://blog.karelia.ru/teran/?tag=popups

  2. imageman:

    AnimateWindow — хорошая функция

    http://www.delphisources.ru/pa.....indow.html

  3. Sergey:

    Посмотрите еще на такую реализацию
    http://narod.ru/disk/204193670.....ow.7z.html

  4. Andrey53:

    ter да там красивые всплывающие окна реализованы
    Sergey тоже неплохо, спасибо всем

  5. atari:

    Спасибо, то что надо :)

  6. SkySkif:

    Спасибо за статью,но я не как не могу понять поместил такое вспыхивающее окно на кнопку как Form14.Show(); ,а окно срабатывает
    только один раз,после закрытия формы Form14 и при нажатии на кнопку,выезжает только верхушка и всё.Подскажите пожалуйста что сделать.

    • Andrey53:

      можете скинуть Ваш полностью проект, можно для всплывающих окон воспользоваться готовыми компонентами

  7. DrGeo:

    Что у меня получилось:

    В Project1 пишем:

    program Project9;

    uses
    Forms,
    Unit9 in 'Unit9.pas' {Form9};

    {$R *.res}

    begin
    Application.Initialize;
    Application.MainFormOnTaskbar := False;//Скрываем окно из панели задач.
    Application.CreateForm(TForm9, Form9);
    Application.Run;
    end.

    В Unit1 пишем:

    implementation

    {$R *.dfm}

    procedure TForm1.FormActivate(Sender: TObject);
    begin
    ShowWindow(Application.Handle, SW_HIDE);
    SetWindowLong(Application.Handle, GWL_EXSTYLE, //Скрываем окно из панели задач.
    GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
    end;

    procedure TForm9.FormCreate(Sender: TObject);
    begin
    Form1.Hide;
    Trayicon1.Visible:= True; //Отображаем иконку в трее(компонент tray icon).
    end;

    procedure TForm1.FormShow(Sender: TObject);
    begin
    Left:=Screen.Width-Width;
    Top:=Screen.Height-Height+150;

    end;

    procedure TForm1.Timer1Timer(Sender: TObject);
    begin

    Top:=Top-1;
    SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //Не перемещать мышкой.
    if Top=Screen.Height-Height-30 then
    begin
    Timer1.Enabled:=False;
    end;
    end;

    procedure TForm1.TrayIcon1Click(Sender: TObject);
    begin
    Form1.Show;
    end;
    end.
    end.

    • DrGeo:

      Прошу прощения за коммент в строке:
      SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //Не перемещать мышкой.

      Правильный :
      SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); //Поверх всех окон.

      Чтобы окно не перемещалось необходимо установить свойство BorderStyle в bsNone или в bsSingle.

Оставить комментарий на SkySkif

Вы можете использовать следующие теги:

*