Visitantes que leram esse artigo, também visitaram:
  • Adobe e Facebook Impulsionam Futura Geração de Aplicativos Sociais
  • Coloque senhas em arquivos e pastas confidenciais
  • Aumente a sua produtividade no Vista
  • Como ligar o Windows Vista e o Mac OS X em rede
  • A HP oferece aos clientes atualização gratuita para o Microsoft Windows 7


  • Usando as APIs para “Procurar” e “Mover” janelas do Windows

    Postado por Plinio Cruz em 8 de fevereiro de 2004 na categoria Delphi, Programação, Soluções | Seja o primeiro a comentar

    1 Estrela2 Estrela3 Estrela4 Estrela5 Estrela (Sem votos, vote agora!)
    Loading ... Loading ...

    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.

    Adriano Santos

    Vdeo no pode ser exibido.

    Deixe seu comentário