[MFC] Dialog non modal

Résolu
Helau Messages postés 38 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 25 août 2005 - 2 déc. 2004 à 11:16
Helau Messages postés 38 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 25 août 2005 - 6 déc. 2004 à 12:01
Bonjour,

Mon application utilise des boites de dialogues non modales, car je suis obligée de faire un create et un show window, par forcément en même tps.

Ceci dit, je souhaiterais qu'un fois ma boite affichée, elle ait le comportement d'une boite modale, càd que je ne puisse pas cliquer ailleurs tant que la boite n'est pas fermée (close, ok, cancel ou autre bouton)

J'ai fait plusieurs essais non concluants (runmodalloop, beginmodalstate, le style "system modal dans mon dialog", soit ça ne fait rien, soit ça "freeze" mon appli qd je clique ailleurs que sur la boite.)

Est ce que quelqu'un aurait une idée.
Merci.
Helau.

5 réponses

Helau Messages postés 38 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 25 août 2005
6 déc. 2004 à 12:01
Merci ymca2003, tu m'as bien aiguillée.
Voici finalement ce que j'ai fait, et qui a l'air de marcher :

CWnd *pWnd = ::AfxGetMainWnd();
// GetWindow(GW_OWNER);
hWndParent = pWnd->GetSafeHwnd();
//AfxUnhookWindowCreate();
bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}

EnableWindow();
ShowWindow(nCmdShow);

En fait, quand on désactive le parent, on désactive implicitement les enfants. Il suffit donc de dire que l'enfant ne doit pas rester déactivé.

A bientôt.
3
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 déc. 2004 à 12:15
Désactiver le parent à l'affichage du dialogue et réactiver à la fermeture.

// ouverture :
HWND hWndParent = PreModal();
BOOL bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}

// fermeture :
if (bEnableParent)
::EnableWindow(hWndParent, TRUE);if (hWndParent !NULL && ::GetActiveWindow() m_hWnd)
::SetActiveWindow(hWndParent);
PostModal();

Tiré du code de la fonction DoModal de CDialog
0
Helau Messages postés 38 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 25 août 2005
2 déc. 2004 à 14:25
Je suis désolée, ça ne marche pas !

Il n'est pas possible d'utiliser PreModal avec une boite modeless dejà créée !

HWND CDialog::PreModal()
{
// cannot call DoModal on a dialog already constructed as modeless
ASSERT(m_hWnd == NULL);

....
}

Je ne sais pas trop comment faire. J'ai testé plusieurs idées, en essayant de me baser sur ce qui est fait dans DoModal, mais toujours sans succès.

Help, please !

Merci.
Helau.
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
2 déc. 2004 à 14:58
Et juste en faisant le EnableWindow() sur le parent et les autres dialogues non modaux de l'appli
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Helau Messages postés 38 Date d'inscription vendredi 2 mai 2003 Statut Membre Dernière intervention 25 août 2005
3 déc. 2004 à 09:29
Voici ce que j'ai testé :

m_bAfficheBoite = true;

CWnd *pWnd = ::AfxGetMainWnd();
// GetWindow(GW_OWNER);
hWndParent = pWnd->GetSafeHwnd();
//AfxUnhookWindowCreate();
bEnableParent = FALSE;
if (hWndParent != NULL && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}

Si je fais ShowWindow(SW_SHOW) ensuite, ça affiche ma boite, mais mon appli est "gelée"

Si je fais ShowWindow(SW_SHOW) avant, ça affiche ma boite, mon edit qui a le focus est active (je peux écrire dedans) mais je ne peux pas acceder aux autres contrôles de mon dialog. (par souris ni par clavier).

La touche entrée est active et ferme ma boite (j'ai mis le code de "fermeture" sur le OnOK).

J'ai peut être oublié qqch qqpart...

Voici mon code de fermeture si besoin

if (m_bAfficheBoite)
{
if (bEnableParent)
::EnableWindow(hWndParent, TRUE); if (hWndParent !NULL && ::GetActiveWindow() m_hWnd)
::SetActiveWindow(hWndParent);

// destroy modal window

// PostModal();
}

m_bAfficheBoite = false;

CDialog::OnOK();
0
Rejoignez-nous