Wysuwające sie okienko w prawym dolnym rogu

milyges

Oto procedura, która pokazuje wysuwające się okienko w prawym dolnym rogu ekranu. Reszta w komentarzach:

procedure ShowTrayForm(F: TForm);
var
   i : Integer;
   y, x : Word;
   h : HWND;
   tmp : PWindowPlacement;
begin
     h := FindWindow('Shell_TrayWnd', nil); //Uchwyt paska zadań
     GetMem(tmp, sizeOf(TWindowPlacement)); //Pamiec na info o oknie
     GetWindowPlacement(h, tmp); //Pobieramy info o oknie
     //Sprawdzamy gdzie leży pasek
     if (tmp.rcNormalPosition.Bottom <> Screen.Height) then //Czy jest na gorze
     begin
          y := 0;
          x := 0;
     end
     else if (tmp.rcNormalPosition.Top <> 0) then //Czy na dole
     begin
          x := 0;
          y := tmp.rcNormalPosition.Bottom - tmp.rcNormalPosition.Top;
     end
     else if (tmp.rcNormalPosition.Top = 0) and //Czy z lewej
             (tmp.rcNormalPosition.Left = 0) then
     begin
          x := 0;
          y := 0;
     end
     else //Zostaje prawa
     begin
          x := tmp.rcNormalPosition.Right - tmp.rcNormalPosition.Left;
          y := 0;          
     end;
     
     FreeMem(tmp); //Zwolnienie pamieci
     //Inicjujemy wlasnosci okna
     i := 50;
     F.Top := Screen.Height - i;
     F.Left := Screen.Width - F.Width - x;
     F.Show; //Pokazujemy okno
     //wysuwamy w petli
     repeat
           i := i + 10;
           Sleep(20);
           F.Top := Screen.Height - i;
           Application.ProcessMessages;
     until i >= F.Height + y;

     f.Top := Screen.Height - F.Height - y; //Tak dla pewnosci ze dobrze bedzie na koncu
end;

8 komentarzy

Poprostu trzeba dodac w OnCreate Form1 taka linijke:
ShowTrayForm(Form1, true);

Taki bajer dający możliwość zamykania. Działa tylko w winXP (chyba) ale super wygląda

procedure ShowTrayForm(F: TForm; CzyOtworzyc: Boolean = True);
var
   i : Integer;
   y, x : Word;
   h : HWND;
   tmp : PWindowPlacement;
  procedure HideTrayForm;
  begin
    repeat
       F.AlphaBlendValue := F.AlphaBlendValue - 20;
       Sleep(30);
    until F.AlphaBlendValue <= 50;
    F.Close;
  end;
begin
   if CzyOtworzyc then
   begin
     F.AlphaBlend:=true;
     F.AlphaBlendValue := 255;

     h := FindWindow('Shell_TrayWnd', nil); //Uchwyt paska zadań
     GetMem(tmp, sizeOf(TWindowPlacement)); //Pamiec na info o oknie
     GetWindowPlacement(h, tmp); //Pobieramy info o oknie
     //Sprawdzamy gdzie leży pasek
     if (tmp.rcNormalPosition.Bottom <> Screen.Height) then //Czy jest na gorze
     begin
          y := 0;
          x := 0;
     end
     else if (tmp.rcNormalPosition.Top <> 0) then //Czy na dole
     begin
          x := 0;
          y := tmp.rcNormalPosition.Bottom - tmp.rcNormalPosition.Top;
     end
     else if (tmp.rcNormalPosition.Top = 0) and //Czy z lewej
             (tmp.rcNormalPosition.Left = 0) then
     begin
          x := 0;
          y := 0;
     end
     else //Zostaje prawa
     begin
          x := tmp.rcNormalPosition.Right - tmp.rcNormalPosition.Left;
          y := 0;
     end;

     FreeMem(tmp); //Zwolnienie pamieci
     //Inicjujemy wlasnosci okna
     i := 50;
     F.Top := Screen.Height - i;
     F.Left := Screen.Width - F.Width - x;
     F.Show; //Pokazujemy okno

     //wysuwamy w petli
        repeat
           i := i + 10;
           Sleep(20);
           F.Top := Screen.Height - i;
           Application.ProcessMessages;
        until i >= F.Height + y;

     f.Top := Screen.Height - F.Height - y; //Tak dla pewnosci ze dobrze bedzie na koncu
   end else HideTrayForm;
end;

i kiedy sie pokazuje te okno??

Tego szukałem ;)

i kiedy się pokazuje to okno??

Hmm. Maz racje. Już poprawiłem

Jedna sprawa. W tym kodzie nie uwzgledniles tego, ze pasek zadan mozna sobie przesunac na boki i gore ekranu. Nie kazdy ma pasek zadan na dole. :)