Código
{
Neste artigo vou mostar como usar algumas APIs do Windows para mover a caixa de Diálogo chamada pela função SelectDirectory.
A caixa de diálogo em questão, quando chamada, se abre alinhada ao canto direito inferior do Windows, próximo ao relógio. Com algumas técnicas, vamos poder movê-la em tempo de execução para uma nova posição. Para isso vamos usar as seguintes APIS:
FindWindow : Usada para localizar a janela.
GetWindowRect : Usada para recuperar a posição em que a janela foi aberta.
MoveWindow : Para mover a caixa de diálogo para a posição desejada, no nosso caso, centro do desktop.
A primeira coisa que devemos fazer é desenhar o form de exemplo.
Abra o Delphi e em um novo projeto insira os seguintes componentes:
ü 1 TButton. Mude sua propriedade Name para btnSelecionar e Caption para Selecionar Diretório.
ü 1 TEdit com o Name de edCaminho. Limpe a propriedade Text.
ü 1 TTimer da paleta System com o nome de tmAjustar.
ü Configure o form como no exemplo da figura 1.
ü Mude a propriedade Enabled do TTimer para False e Interval coloque 100.
Feito isso, declare na cláusula "uses" do form a unit FileCtrl.
Para o evento onClick do btnSelecionar digite o algoritimo da Listagem 1;
}
procedure TForm1.btnSelecionar1Click(Sender: TObject);
var
Dir : String;
begin
tmAjustar.Enabled := True;
if SelectDirectory('Selecione um diretório.','',Dir) then
edCaminho.Text := Dir;
end;
{No evento onTimer do objeto TTimer digite o código da Listagem 2;
}
procedure TForm1.tmAjustarTimer(Sender: TObject);
var
tmHandle : THandle;
tmRect : TRect;
tmAltura, tmLargura, tmNovoLeft, tmNovoTop : Integer;
begin
{Declare a unit FileCtrl no uses do Form}
tmHandle := FindWindow(Nil,'Procurar Pasta');
if tmHandle > 0 then
begin
{Aqui eu pego os valores do Rect da Janela localizada, desta forma eu posso
obter Left, Top, Bottom, Rigth e Etc}
GetWindowRect(tmHandle,tmRect);
{Aqui eu pego a altura e largura da Janela localizada}
tmAltura := tmRect.Right-tmRect.Left;
tmLargura := tmRect.Bottom-tmRect.Top;
{Aqui eu defino o novo left e top, que serão no meio da tela do "WINDOWS"}
tmNovoLeft := (Screen.Width div 2) - (tmLargura div 2);
tmNovoTop := (Screen.Height div 2) - (tmAltura div 2);
{Aqui eu envio uma mensagem para a janela indicando qual o novo destino}
MoveWindow(tmHandle,tmNovoLeft,tmNovoTop,tmRect.Right-tmRect.Left,
tmRect.Bottom-tmRect.Top,True);
tmAjustar.Enabled := False;
end;
Screen.Cursor := crDefault;
end;
{Vamos as explicações:
Primeiro nós precisamos de um manipulador do tipo THandle, obtido através da api FindWindow:
}
tmHandle := FindWindow(Nil,'Procurar Pasta');
{A variável tmHandle recebe o “handle” da janela cujo o Caption é:
Procurar Pasta. O primeiro parâmetro de FindWindow é a classe da janela procurada. Como não sabemos passamos Nil.
Depois disso verificamos se o tmHandle é maior que zero, ou seja, se a janela foi encontrada. Em caso positivo, usamos a API GetWindowRect. Essa api armazena em uma variável do tipo TRect a informações suficientes para mais tarde movermos a janela.
GetWindowRect(tmHandle,tmRect);
O primeiro parâmetro, como podemos ver, é o manipulador Handle obtido mais acima. O segundo é a própria variável TRect.
Isso foi feito porque para mover a janela com MoveWindow, que veremos logo adiante, são necessários os novos Tamanhos e Posições. Para sabermos essas informações efetuamos alguns cálculos, veja:
Aqui eu pego a altura e largura da Janela localizada}
tmAltura := tmRect.Right-tmRect.Left;
tmLargura := tmRect.Bottom-tmRect.Top;
{Aqui eu defino o novo left e top, que serão no meio da tela do "WINDOWS"}
tmNovoLeft := (Screen.Width div 2) - (tmLargura div 2);
tmNovoTop := (Screen.Height div 2) - (tmAltura div 2);
{Com base nas informações recebidas em tmRect, calculamos a largura e altura da janela. Depois calculamos o novo left e top, usando o tamanho do Screen. Neste caso estamos enviando a janela para o centro do Desktop.
Agora só nos resta fazer a chamada a API MoveWindow, veja:
Aqui eu envio uma mensagem para a janela indicando qual o novo destino}
MoveWindow(tmHandle,tmNovoLeft,tmNovoTop,tmRect.Right-tmRect.Left,
tmRect.Bottom-tmRect.Top,True);
{Explicando: o primeiro parâmetro é o manipulador Handle, ou seja, a própria janela. Os parâmetros seguintes são, respectivamente, Left, Top, Largura, Altura e se a janela deve ser “repintada”.
Por fim, desativamos o Timer, usado somente no instante em que a janela é chamada.
}
Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009