![]() |
![]() |
| 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
|
||||
|
||||
|
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 .... |
|
#2
|
||||
|
||||
|
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. ![]() |
|
#3
|
||||
|
||||
|
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. |
|
#4
|
||||
|
||||
|
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 .... |
|
#5
|
||||
|
||||
|
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. |
|
#6
|
||||
|
||||
|
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. |
|
#7
|
|||
|
|||
|
Desde luego.... soys geniales. Es lo que andaba buscando. Muchas Gracias de nuevo.
|
![]() |
| 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 |
|