Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2005
Jan_polero Jan_polero is offline
Miembro
 
Registrado: may 2004
Posts: 62
Poder: 20
Jan_polero Va por buen camino
Desplegar por código el menú de sistema de una ventana

Hola a todos. En una aplicación utilizo paneles como barras de título de las ventanas, poniéndole yo los botones y toda la pesca. Mi problema es que no sé cómo hacer que se despliege el menú de sistema de la ventana (ese que aparece cuando pulsas sobre el icono de una ventana de Windows) al pulsar uno de los botones. Espero podais ayudarme. Gracias por adelantado y un saludo.
Responder Con Cita
  #2  
Antiguo 05-05-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Programar en cualquier componente de pantalla que se desee que responda al click el siguiente código en el
evento MouseDown.

Código Delphi [-]
  procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
                                  Shift: TShiftState; X, Y: Integer);
 var
    h: HMENU;
   p:TPoint;
 begin
Código Delphi [-]
// El componente que llama deriva de TControl?
   if (Sender is TControl) then begin
      // POsicion del click
     p.X := x;
     p.Y := y;
     // Calculamos las coordenadas relativas
     P := Self.ScreenToClient(TControl(Sender).ClientToScreen(P));
 
     // Mostrar el menú
     h := GetSystemMenu(handle, false);
     TrackPopupMenu(h, TPM_LEFTALIGN or TPM_LEFTBUTTON,
       ClientOrigin.X + p.X ,
       ClientOrigin.Y + p.y, 0, handle, nil);
 end;
 end;
  

__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 05-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
El siguiente código te desplegará el menú en la esquina superior izquierda de un botón:

Código Delphi [-]
var
  Pt: TPoint;

begin
  Pt := Point(Button1.Left, Button1.Top);
  Pt := ClientToScreen(Pt);

  SendMessage(Handle, $0313, 0, LParam(PointToSmallPoint(Pt)));
end;

// Saludos
Responder Con Cita
  #4  
Antiguo 05-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La solución de Neftalí fue la primera que pensé pero, al menos en mi caso, aunque sí muestra el menú, no responde a los comandos.

// Saludos
Responder Con Cita
  #5  
Antiguo 05-05-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por roman
al menos en mi caso, aunque sí muestra el menú, no responde a los comandos.
Cierto en mi caso tampoco... ?¿?¿? Curioso, no me había dado cuenta.
Revisando la API TrackPopupMenu dice lo siguiente:

hWnd
Identifies the window that owns the shortcut menu. This window receives all messages from the menu. The window does not receive a WM_COMMAND message from the menu until the function returns.

y ésto:
Remarks

Accelerator keystrokes that select items from the window menu are translated into WM_SYSCOMMAND messages.


Por lo tanto si el Handle que se le pasa como parámetro recibe el mensaje, se supone que se puede capturar ese mensaje y enviarlo a la cola de mensajes para que se procese.

Define en la parte privada el método:

Código Delphi [-]
  procedure WMCommand(var msg: TWMCommand); message WM_COMMAND;
  ...
  
  // Y su implementacion...
  
  procedure TForm1.WMCommand(var msg: TWMCommand);
  begin
    PostMessage(handle, WM_SYSCOMMAND, TMessage(msg).WParam, TMessage(msg).LParam);
    inherited;
  end;

Funciona, pero la cosa se va complicando... La solución de Román como mínimo es más corta y funciona igual de bien.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 05-05-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali
Funciona, pero la cosa se va complicando
Je, je. Ya había llegado a esa conclusión. La otra solución no es mía sino que la acabo de ver buscando en los foros de Borland. Lo que sí es que parece ser que el mensaje $0313 no está documentado en el SDK de Windows.

// Saludos
Responder Con Cita
  #7  
Antiguo 06-05-2005
Jan_polero Jan_polero is offline
Miembro
 
Registrado: may 2004
Posts: 62
Poder: 20
Jan_polero Va por buen camino
Gracias, funciona perfectamente. Por cierto, una última cosa: cómo puedo minimizar mi aplicación en la barra de tareas? (actualmente se minimiza en la parte inferior izquierda de la pantalla, usando el WindowState del form). Un saludo.
Responder Con Cita
  #8  
Antiguo 06-05-2005
S.M.S. S.M.S. is offline
Miembro
 
Registrado: jun 2003
Ubicación: España
Posts: 56
Poder: 21
S.M.S. Va por buen camino
Prueba con:
Application.Minimize;

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 15:52:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi