2010-01-23 19 views
7

Tengo el cuadro de diálogo que se muestra con ShowWindow (hWnd, SW_SHOWNOACTIVATE); Pero no funciona, el nuevo diálogo sigue robando el foco, ¿por qué?Cómo mostrar un cuadro de diálogo MFC sin robar el foco en la otra ventana

Aquí está el algunos fragmentos de código de mi programa, QueryWindow es la clase de diálogo MFC vinculados con el diálogo:

QueryWindow window; 
//window.DoModal(); 
window.Create(QueryWindow::IDD); 
window.ShowWindow(SW_SHOWNOACTIVATE); 
+0

¿El tener QueryWindow un método OnInitDialog? Si es así, intente devolver FALSE en lugar de TRUE al final del método. –

+0

No, funciona. Gracias. – jay

+0

Creo que necesitaremos más código para descubrir el problema. ¿Podría publicar el código fuente QueryWindow? ¿qué tipo de diálogo es? –

Respuesta

5

Hay pocas maneras para saltar de diálogo de conseguir centrado:

  • Te hace OnInitDialog() para devolver el valor cero. Ejemplo:

    BOOL QueryWindow::OnInitDialog() 
    { 
        CDialog::OnInitDialog(); 
    
        return FALSE; // return 0 to tell MFC not to activate dialog window 
    } 
    

    Esta es la mejor y más correcta solución.

  • Agregue el estilo WS_EX_NOACTIVATE a su ventana de diálogo. Puede editar las propiedades de recursos de diálogo o cambiarla en tiempo de ejecución:

    BOOL QueryWindow::PreCreateWindow(CREATESTRUCT& cs) 
    { 
        cs.dwExStyle |= WS_EX_NOACTIVATE; 
    
        return CDialog::PreCreateWindow(cs); 
    } 
    

    Efecto secundario: se puede usar controles de la ventana, pero se verá como no se activó.

  • Manera pasada es salvar ventana en primer plano antes de crear el diálogo y establecer ventana en primer plano al final:

    BOOL QueryWindow::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd) 
    { 
        CWnd* pForeground = GetForegroundWindow(); 
    
        const BOOL bRes = CAlertDialog::Create(lpszTemplateName, pParentWnd); 
    
        if(pForeground) 
         pForeground->SetForegroundWindow(); 
        return bRes; 
    } 
    

    Ésta es la solución pena porque potencialmente puede obtener el parpadeo.

Importante!

No se olvide de controlar siguientes llamadas a la API:

  • ShowWindow - se puede utilizar SW_SHOWNOACTIVATE, pero no se puede utilizar SW_SHOW
  • SetWindowPos - añadir SWP_NOACTIVATE bandera
+0

Muchas gracias @Sergey, me salvaste el día. Esta respuesta merece más votos. – Ram

Cuestiones relacionadas