2010-02-01 17 views
9

Cuando la ventana es un espectáculo, quiero mostrar otra ninguna ventana emergente modal B, pero:¿Cómo mostrar una ventana que actúa como un menú emergente?

  1. no quiero ventana de A a convertirse en inactivo debido a la ventana B se convierte en la ventana del frente;
  2. Quiero que cuando se enfoca la ventana B, despliegue un control de cuadro combinado en la ventana A con un clic (generalmente debe hacer doble clic, uno para mover el foco a la ventana A y el segundo para tirar hacia abajo del cuadro combinado);

Como puede ver, la ventana B que quiero es algo así como una ventana emergente más útil como un menú emergente (que es menos un obstáculo que una ventana general no modal cuando quiere que se salga haciendo clic en cualquier otra parte de la ventana principal).

¿Tengo claro mi pregunta? Gracias.

Respuesta

0

puedo usar esto para no perder el foco:

SetWindowPos(Form2.Handle, HWND_TOP, 0, 0, 0, 0, 
    SWP_SHOWWINDOW or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOMOVE); 

La segunda parte no entendía muy bien.

2

Con el fin de evitar que una ventana de conseguir el enfoque, debe especificar el estilo de ventana extendido WS_EX_NOACTIVATE (Windows 2000 y arriba) o manejar WM_MOUSEACTIVATE y volver MA_NOACTIVATE.

+0

Gracias Koro, quiero que el segundo para obtener el foco, pero no hace que la barra de título del formulario de llamadas vuelven inactivos. –

0

SpTBXFormPopupMenu del spTBXLib hace el trabajo.

Ir a http://www.silverpointdevelopment.com/sptbxlib/index.htm y buscarse un "Formulario emergente"

La clave parece ser que el contenedor 'popuped' debe heredar TPopupMenu. Pero el manejo es muy complejo, puede verlo usted mismo en el código. Mi recomendación es usarlo tal como está en el paquete porque Robert Lee ha hecho un trabajo maravilloso.

+0

Ya sé esto, es similar a lo que quiero pero no cumple con los dos requisitos que describí en mi pregunta. –

7

La solución más fácil que encontré para "1" es enviar un WM_NCACTIVATE al formulario de llamada tan pronto como se activa el formulario emergente (en un controlador WM_ACTIVATE), para que el formulario de llamada dibuje su título con el colores activos. Deberá tener una referencia para el formulario de llamada en el formulario emergente para lograr esto.

Para "2", puede liberar el formulario emergente en el mismo controlador WM_ACTIVATE, esto no consumirá los clics que va al formulario de llamada.

Así que sth. así debería ir a la ventana emergente;

type 
    TForm2 = class(TForm) 
    [..] 
    private 
    FOwner: TForm; 
    procedure WmActivate(var Msg: TWMActivate); message WM_ACTIVATE; 
    public 
    constructor Create(AOwner: TComponent); override; 

[...] 
constructor TForm2.Create(AOwner: TComponent); 
begin 
    if not (AOwner is TForm) then 
    raise Exception.Create('Owner should be TForm'); 
    FOwner := TForm(AOwner); 
    inherited; 
end; 

procedure TForm2.WmActivate(var Msg: TWMActivate); 
begin 
    SendMessage(FOwner.Handle, WM_NCACTIVATE, Ord(Msg.Active <> WA_INACTIVE), 0); 
    inherited; 
    if Msg.Active = WA_INACTIVE then 
    Release; 
end; 

y proporciona el formulario de llamada como propietario de la ventana emergente;

procedure TForm1.Button1Click(Sender: TObject); 
var 
    PopForm: TForm2; 
begin 
    PopForm := TForm2.Create(Self); 
    [..] 


Fwiw, estoy de acuerdo tanto con loursonwinny y Ulrich. IMO una ventana emergente es más complicado de lo que parece. Aunque en el caso de SpTBXFormPopupMenu, tendría que instalar dos bibliotecas, TB2K y SpTBXLib. Al menos explorar las fuentes podría indicar qué podría involucrarse.

+0

+ 1, tus códigos funcionan mucho. – MajidTaheri

+0

En el Button1Click No creo el formulario solo muéstrelo (pero asigne la variable FOwner). ¿Por qué obtengo un error AV después del segundo clic? (Si elimino el procedimiento WmActivate de TForm2, el error AV desaparecerá) – SAMPro

+0

@SAM - Probablemente esté accediendo al formulario después de liberarlo. Aunque no puedo decirlo con seguridad ... –

-1

He encontrado uno que hace casi exactamente lo que quiero: TAdvStickyPopupMenu

+0

Creo que no responde del todo la pregunta. ¿Podría explicar un poco cómo logra el "1" y "2" en la pregunta? –

+0

@Sertac, tal vez me resulte difícil explicarlo, pero lo intentaré;) primero Puedo usar cualquier control, incluido un panel de control o un marco en el TAdvStickyPopupMenu, así puedo usarlo como el contenedor emergente de mi panel de control (simular un formulario), y al hacer clic en el panel no se oculta el menú, por lo que puedo simular un formulario emergente. ¿Cómo este enfoque logra el "1" y "2" en la pregunta? –

+0

Cuando abre el menú (con un formulario simulado), * sentirá que todavía está trabajando en el formulario principal *, lo que significa que * no es necesario cambiar * entre el formulario emergente y el formulario principal. Al cambiar me refiero al clic adicional del mouse que necesita para enfocar el formulario antes de poder operar los controles en el formulario. si lo compara con el menú desplegable y el menú desplegable de SpTbx mencionados anteriormente, encontrará la diferencia. Y si usa Gmail, pruebe con el formulario emergente desplegable de etiquetas, comprenderá lo que quiero decir. –

Cuestiones relacionadas