Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
¿Has probado así en Vista:?
Código:
  if(Visible && Message.Msg == WM_KILLFOCUS || Message.Msg == WM_SHOWWINDOW)
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW);
Hola escafandra.

Si, pero al incluir en el condicional "...|| Message.Msg == WM_SHOWWINDOW)" hace que deje de tener el comportamiento, al igual que al agregar "| SWP_NOACTIVATE" como flag.

Hasta ahora el único modo con que he podido lograr el comportamiento es con:
Código:
void  __fastcall TForm2::WndProc(Messages::TMessage& Message)
{
  if( Visible && Message.Msg == WM_KILLFOCUS ) {
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
      SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW );
  TForm::WndProc(Message);
}
Realmente no sé el motivo, por que evaluar WM_KILLFOCUS y WM_SHOWWINDOW en el condicional pareciera totalmente razonable...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #2  
Antiguo 17-10-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Es curioso el comportamiento de Vista...

El WM_SHOWWINDOW se puede eliminar del condicional si colocamos el Form como FormStyle = fsStayOnTop en el constructor o en fase de diseño. Quizás esto cambie el comportamiento. Lo digo e insisto porque el hecho de cambiar SWP_NOACTIVATE por SWP_SHOWWINDOW si altera en Win XP haciendo que al perder el foco continue siendo ventana activa confundiendo al usuario.


Saludos.
Responder Con Cita
  #3  
Antiguo 17-10-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Me he dado cuenta de que no sirve WM_KILLFOCUS, si en el formulario tenemos un TEdit, al menos en WinXP (eso pasa por probar en condiciones de laboratorio y no reales ...)

Por lo tanto he probado esto otro que funciona muy bien en WinXP y que includo coloca nuestra ventana sobre cualquiera aún siendo otra también HWND_TOPMOST (por ejemplo el TaskMgr)

Código:
void  __fastcall TForm3::WndProc(Messages::TMessage& Message)
{
  if(Visible && Message.Msg == WM_WINDOWPOSCHANGING)
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

  TForm::WndProc(Message);
}
ecfisa, pruébalo en Vista y si puedes en Win7.


Saludos.
Responder Con Cita
  #4  
Antiguo 17-10-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Tuve estos resultados:

Vista: siempre mantiene la posición al frente. Pero el form principal tiene un comportamiento algo extraño luego de que el form secundario pierde el foco y lo recupera nuevamente.
Por ejemplo, puse en el form principal un botón para mostrar el secundario (siendo este mas pequeño que aquel) y al recuperar el foco el form secundario, pareciera que el form principal se transparenta visualizando sólo el botón.

Continuando las pruebas agregué un Edit y de este sólo queda visible el nombre (Edit1), en este caso da la impresión de que hiciera una transparencia dejando los colores clBtnFace y clWindow, visibles sobre la aplicación de fondo.

W7: Aquí funciona perfectamente sin comportamientos extraños.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 17-10-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pues entonces vamos a forzar la máquina un poco mas.

Creo que este código va a funcionar en XP, Vista y Seven. Espero no equivocarme pues sólo lo he probado en XP

Código:
void ReDrawWindow(HWND hWnd)
{
  TRect cr;
  ::GetClientRect(hWnd, &cr);
  InvalidateRect(hWnd, &cr, true);
  SendMessage(hWnd, WM_NCPAINT, 0, 0);
  RedrawWindow(hWnd, &cr, 0, RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN);
}

void  __fastcall TForm2::WndProc(Messages::TMessage& Message)
{
  if(Visible && Message.Msg == WM_WINDOWPOSCHANGING)
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

  if(Visible && Message.Msg == WM_ACTIVATE){
    SetWindowPos(Application->MainForm->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    ReDrawWindow(Application->MainForm->Handle);
  }
  
  TForm::WndProc(Message);
}

Saludos.

Última edición por escafandra fecha: 17-10-2012 a las 23:48:57.
Responder Con Cita
  #6  
Antiguo 18-10-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Mejorando el código para el caso de tener mas de dos formularios abiertos y sólo uno sea TopMost:
Código:
void ReDrawWindow(HWND hWnd)
{
  TRect cr;
  ::GetClientRect(hWnd, &cr);
  InvalidateRect(hWnd, &cr, true);
  SendMessage(hWnd, WM_NCPAINT, 0, 0);
  RedrawWindow(hWnd, &cr, 0, RDW_FRAME|RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN);
}

void  __fastcall TForm2::WndProc(Messages::TMessage& Message)
{
  if(Visible && Message.Msg == WM_WINDOWPOSCHANGING)
    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);

  if(Visible && Message.Msg == WM_ACTIVATE && Message.WParam != 0){
    SetWindowPos(Application->MainForm->Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
    for(int i = 0; i<Application->ComponentCount; i++){
      TForm *F = static_cast<TForm*>(Application->Components[i]);
      if (F) ReDrawWindow(F->Handle);
    }
  }

  TForm::WndProc(Message);
}

Saludos.
Responder Con Cita
  #7  
Antiguo 19-10-2012
chinchan chinchan is offline
Miembro
 
Registrado: abr 2006
Posts: 112
Poder: 21
chinchan Va por buen camino
Desde luego.... soys geniales. Es lo que andaba buscando. Muchas Gracias de nuevo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Abrir outlook en primer plano Jose Manuel Servers 3 24-02-2012 19:25:50
2 Form Siempre En Primer Plano FrianxD C++ Builder 16 15-01-2008 22:41:02
Como mostrar en primer plano Blackspike API de Windows 4 14-01-2008 09:13:20
Aplicación en primer plano jordillussa Varios 4 20-03-2007 19:58:43
Aplicación siempre en primer plano Novás Varios 2 08-03-2004 09:31:09


La franja horaria es GMT +2. Ahora son las 00:40:41.


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