2009-12-04 17 views
5

Necesito abrir dos veces un cuadro de diálogo instanciado de la misma clase. Cuando intento estoReabra el cuadro de diálogo modal en MFC

CdelmeDlg dlg; 
dlg.DoModal(); 
dlg.DoModal(); 

La segunda llamada abre el cuadro de diálogo solo por una fracción de segundo, luego se cierra. Mi apuesta era que hay un mensaje sobrante en la cola de mensajes, por lo que añadió esta en medio de las llamadas

MSG msgCur; 
while (::PeekMessage(&msgCur, NULL, NULL, NULL, PM_REMOVE)) 
    ; 

Esto resuelve el problema, pero se siente como un tipo equivocado de que hay que hacer. ¿Hay alguna manera de procesar el mensaje sobrante correctamente?

+0

Esto se ve muy extraño ¿qué estás tratando de lograr exactamente? –

+0

Necesito mantener mi aplicación ejecutándose sin UI y abrir este cuadro de diálogo cada vez que se agote el tiempo. – MMx

+0

¿Cómo estás cerrando el diálogo? –

Respuesta

1

No llame a EndDialog (IDOK);

Para manejar los botones Aceptar o Cancelar que se presionan simplemente heredan OnOk o OnCancel ... De lo contrario, se llamará EndDialog dos veces y obtendrá el problema que está recibiendo.

0

Si desea que su aplicación se ejecute en segundo plano sin UI, ¿por qué no juz temporary hide it? una función simple this-> ShowWindow (SW_HIDE) hará el trabajo por usted.

Creo que debería revisar su decisión de diseño, ya que parece ilógico que una aplicación se comporte como usted quería.

1

De hecho, creo que YeenFei tiene un buen punto aquí.

Ha pasado un tiempo desde que jugué con MFC (gracias a Dios), pero desde la memoria, un temporizador, puede o no ser llamado desde el hilo de UI, dependiendo de cuál use. Si el temporizador se está levantando en el subproceso principal de la interfaz de usuario, entonces un diálogo modal probablemente detendrá el hilo principal hasta que se descarte, después de lo cual sería llamado por el siguiente temporizador. Si el temporizador se levanta en una secuencia separada, entonces su diálogo no está bloqueando el hilo principal de la interfaz de usuario ya que se muestra en una secuencia separada.

Parece más concebible ya que YeenFei ha señalado que desea volver a mostrar su cuadro de diálogo cada vez que se sube el temporizador, ocultándolo cuando el usuario hace clic en el botón para cerrarlo. De esta forma, si vuelve a aumentar la hora, todo lo que hace es volver a mostrar el diálogo, ya sea que esté abierto o no.

Hay una gran publicación here (www.eggheadcafe.com) acerca de los temporizadores y la concurrencia que puede encontrar interesante, y puede hacer las cosas más claras de lo que logré lograr.

1

Por qué no puedes codificar así:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
0

He resuelto el problema al ocultar el cuadro de diálogo en lugar de cerrarlo y el lanzamiento de otro hilo que primero acomoda y luego unhides el diálogo.

0

puede ser su línea de código tiene:

m_pMainWnd = &dlg; 

Si es así, que la aplicación después de la primera llamada de DoModal() se haya terminado, todas las demás llamadas de DoModal() devolverá -1. De MSDN:

La biblioteca de clases de Microsoft Foundation terminará automáticamente el hilo cuando se cierre la ventana a la que hace referencia m_pMainWnd. Si este hilo es el hilo principal de una aplicación, la aplicación también se dará por terminada.

Cuestiones relacionadas