![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Hola escafandra.
Seguramente el comportamiento difiera por la diferente versión de S.O. ... En Vista, lo que me sucede es que al mostrar el form por primera vez y realizar foco sobre otra aplicación de fondo, no pierde su condición de estar al frente. Pero al repetir la acción, es decir, darle nuevamente el foco al form y luego hacer click sobre otra aplicación la pierde. Al agregar SWP_SHOWWINDOW como flag, se comporta como se espera. Y como detalle, del mismo modo lo hace si se agrega una lína con BringToFront(), todo esto habiendo sido mostrado como no modal. También había probado el condicional de tu último mensaje Código:
if(Visible && Message.Msg == WM_KILLFOCUS || Message.Msg == WM_SHOWWINDOW) Un saludo. ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#2
|
||||
|
||||
|
Cita:
Cita:
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);
Cita:
Quizás deba quedar así: Código:
void __fastcall TForm2::WndProc(Messages::TMessage& Message)
{
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);
TForm::WndProc(Message);
}
Saludos. ![]() |
|
#3
|
||||
|
||||
|
Cita:
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);
}
Saludos. ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
||||
|
||||
|
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. ![]() |
|
#5
|
||||
|
||||
|
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);
}
![]() Saludos. |
|
#6
|
||||
|
||||
|
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 .... |
|
#7
|
||||
|
||||
|
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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
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 |
|