Bloquear o duplo clique mouse na barra de titulo dos forms

Delphi

26/04/2005

olá pessoal

tenho uma aplicação Mdi. Os forms MdiChild tem os botões Fechar e Maximizar na barra de titulo... se o usuário clicar com o mouse 2x na barra de titulo o form é maximizado, clicando novamente o form é restaurado.
Eu preciso impedir que o form seja maximizado ou restaurado com o duplo clique do mouse, como eu posso fazer isso sem alterar as propriedades do form utilizando alguma chamada de sistema? (se o usuário clicar 2x na barra de titulo ñ deve acontecer nada com o form)

obrigado

Diogo


Diogoalles

Diogoalles

Curtidas 0

Respostas

Diogoalles

Diogoalles

26/04/2005

e ai galera..
ainda ñ consegui resolver isso.. será que alguem teria uma dica?

valeu
Diogo


GOSTEI 0
Sanses

Sanses

26/04/2005

Olá

Olha, não testei com aplicações MDI, mas se vc colocar no onresize do form as medidas e posição dele, ninguem poderá alterar:

form1.Top := 50;
form1.Left := 50;
form1.width := 500;
form1.Height := 500;

quanto ao duplo clique na barra de título, acredito que seja possível barrar somente com hoks de sistema, pois isso é o windows que implemtenta

[]´s
Sanses


GOSTEI 0
Diogoalles

Diogoalles

26/04/2005

olá galera..
Sanches ..obrigado pela dica mas isso não funciona para o que estou precisando.
Sem alterar as propriedades do form preciso encontrar algum evento ou função que capture o duplo clique do mouse na barra de titulo do form e não aconteca nada com ele. Não pode sair do lugar e nem ser redimensionado.


agradecido mais uma vez e aguardo qq dica se alguem a tiver

abraço
Diogo


GOSTEI 0
Beppe

Beppe

26/04/2005

Tem a mensagem WM_WINDOWPOSCHANGING.


GOSTEI 0
Kapak

Kapak

26/04/2005

Só o Form MDI ou os Childs tb ?


GOSTEI 0
Diogoalles

Diogoalles

26/04/2005

só os forms MDIChild...
poderia me dar um exemplo d como executar o WM_WINDOWPOSCHANGING ?... pesquisei no help e ñ consegui :cry:


valeu


GOSTEI 0
Kapak

Kapak

26/04/2005

Olá colega, acho que WM_WindowPosChanging não servirá p/ o seu caso pq vc só quer o duplo clique na barra de título não é ?
WM_WindowPosChanging é enviado p/ qualquer situação do Form em que houver reposicionamento. Daí tanto faz se for dado duplo clique ou mover o Form ou minimizar ou restaurar ou fechar, essa msg é sempre enviada.
Como o duplo clique é na barra de título, então acho que vc precisará da msg do tipo WM_SysCommand; defina-a e quando ocorrer o evento, cheque o duplo clique e não dê [b:2d58509a4d]inherited[/b:2d58509a4d] p/ evitar seu processamento.


GOSTEI 0
Beppe

Beppe

26/04/2005

A mensagem WM_WindowPosChanging pode ser usada porque ao maximizar a janela ela muda de coordenadas. A mensagem que cuida do duplo-clique no caption é WM_NCLButtonDblClk. Mas tem o botão e o comando no menu de sistema que não são lidados.

A mensagem WM_SysCommand quando Message.CmdType = SC_MAXIMIZE faz o resto.

// ocorre no duplo-clique no caption
procedure WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk); message WM_NCLButtonDblClk;
// ocorre ao comando do menu de sistema e botões no caption
procedure WMSysCommand(var Message: TWMSysCommand); message WM_SysCommand;
...
procedure TForm1.WMSysCommand(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_MAXIMIZE then
    Message.Result := 0
  else
    inherited;
end;

procedure TForm1.WMNCLButtonDblClk(var Message: TWMNCLButtonDblClk);
begin
  Message.Result := 0;
end;



GOSTEI 0
Kapak

Kapak

26/04/2005

A mensagem WM_WindowPosChanging pode ser usada porque ao maximizar a janela ela muda de coordenadas.
Pq vc não a usou ?
procedure TForm1.WMSysCommand(var Message: TWMSysCommand); begin if Message.CmdType = SC_MAXIMIZE then Message.Result := 0 else inherited; end;
Deste jeito ele só evita o clique no botão de maximizar e não o duplo clique.


GOSTEI 0
Beppe

Beppe

26/04/2005

[quote:cf1ee6e205=´Beppe´]A mensagem WM_WindowPosChanging pode ser usada porque ao maximizar a janela ela muda de coordenadas.
Pq vc não a usou ?[/quote:cf1ee6e205]
Esqueci de dizer. Ela gera a animação da maximização, e uma lógica extra precisa ser usada pra movimentação normal do form.

[quote:cf1ee6e205]procedure TForm1.WMSysCommand(var Message: TWMSysCommand); begin if Message.CmdType = SC_MAXIMIZE then Message.Result := 0 else inherited; end;
Deste jeito ele só evita o clique no botão de maximizar e não o duplo clique.[/quote:cf1ee6e205]
No tópico anterior eu postei dois handlers. O segundo(WMNCLButtonDblClk) faz isso.


GOSTEI 0
Kapak

Kapak

26/04/2005

Realmente WM_NCLButtonDblClk evita o duplo clique no estado normal e minimizado; sugerí WM_SysCommand por se tratar de msgs Window Menu.


GOSTEI 0
POSTAR