Fórum Fazer que um form ocupe espaço tipo barra de tarefas #343235
08/07/2007
0
Pessoal eu estou tentando fazer com que um form no formato parecido com uma barra de tarefas do windows ocupe um espaço no rodapé do form (acima da barra de tarefas do windows) , e faça com que ao maximizar os outros programas o rodapé dos programas fique logo acima desse meu form ou seja limitando o tamanho do desktop fazendo com que esse form fique sempre a vista sem esconder os rodapés dos outros forms.
Agradeço desde já
Atenciosamente Vitor Araújo Alcântara
Agradeço desde já
Atenciosamente Vitor Araújo Alcântara
Vitor Alcantara
Curtir tópico
+ 0
Responder
Posts
10/07/2007
Vitor Alcantara
Pessoal eu consegui resolver o meu problema da seguinte forma:
Primeiro eu listei todos os formes abertos e joguei dentro de uma StringList com essa função:
Dai eu coloquei um timer no meu form com essa rotina:
Aonde iW é uma váriavel do tipo integer onde eu passo o tamanho horizontal da minha tela e Ls é uma váriavel do tipo TStringList onde eu passo as aplicações abertas do windows.
Desse modo eu consegui que as aplicações maximizadas fiquem sempre acima do meu form, fazendo como se o meu form oculpasse o espaço da barra de tarefas.
Lembrando que no meu caso o meu form é tem alinhamento do tipo ´alBottom´.
Ainda não consegui fazer com que os ícones dos atalhos do desktop se organizem somente acima do meu form. Se alguem ai souber ou tiver alguma sugestão de como fazer isso coloca aqui.
Primeiro eu listei todos os formes abertos e joguei dentro de uma StringList com essa função:
Function EnumWindowsProc (Wnd: HWND; lb: TStringList): BOOL; stdcall; var caption: Array [0..128] of Char; begin Result := True; if IsWindowVisible(Wnd) and ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) = GetDesktopWindow))and ((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0) then begin SendMessage( Wnd, WM_GETTEXT, Sizeof(caption),integer(@caption)); lb.Add ( caption); end; end;
Dai eu coloquei um timer no meu form com essa rotina:
procedure TFormMenu.Timer1Timer(Sender: TObject);
var
hnd : Thandle;
wndHandle : THandle;
wndClass : array[0..50] of Char;
r,r1:TRect;
x:integer;
begin
ls.Clear;
//Pega o handle e o rect da Barra de tarefas
StrPCopy(@wndClass[0],´Shell_TrayWnd´);
wndHandle := FindWindow(@wndClass[0], nil);
GetWindowRect(wndHandle,r1);
//Coloca as aplicações dentro da string list
EnumWindows( @EnumWindowsProc, integer( ls ));
for x := 0 to Ls.Count - 1 do
begin
//Pega o Handle e o rect do form do programa
hnd := FindWindow(nil,pchar(ls.Strings[x]));
GetWindowRect(hnd,r);
if Hnd > 0 then
//Verifica se está maximizado
if isZoomed(hnd) then
begin
{Form está maximizado}
if r.Bottom <> r1.Top - Height then
SetWindowPos(hnd,HWND_TOP,0,0,iW , r1.Top - Height,SWP_SHOWWINDOW);
end
{ Form1 está maximizado }
else
begin
end
end;
end;
Aonde iW é uma váriavel do tipo integer onde eu passo o tamanho horizontal da minha tela e Ls é uma váriavel do tipo TStringList onde eu passo as aplicações abertas do windows.
procedure TFormMenu.FormCreate(Sender: TObject); begin ls := TStringList.Create; iW := Screen.Width; iH := Screen.Height; end;
Desse modo eu consegui que as aplicações maximizadas fiquem sempre acima do meu form, fazendo como se o meu form oculpasse o espaço da barra de tarefas.
Lembrando que no meu caso o meu form é tem alinhamento do tipo ´alBottom´.
Ainda não consegui fazer com que os ícones dos atalhos do desktop se organizem somente acima do meu form. Se alguem ai souber ou tiver alguma sugestão de como fazer isso coloca aqui.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)