[MFC] Dialog non modal [Résolu]

Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Dernière intervention
25 août 2005
- - Dernière réponse : Helau
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
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.
Afficher la suite 

Votre réponse

5 réponses

Meilleure réponse
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Dernière intervention
25 août 2005
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 97 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Helau
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Dernière intervention
3 juillet 2006
0
Merci
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
Commenter la réponse de ymca2003
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Dernière intervention
25 août 2005
0
Merci
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.
Commenter la réponse de Helau
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Dernière intervention
3 juillet 2006
0
Merci
Et juste en faisant le EnableWindow() sur le parent et les autres dialogues non modaux de l'appli
Commenter la réponse de ymca2003
Messages postés
38
Date d'inscription
vendredi 2 mai 2003
Dernière intervention
25 août 2005
0
Merci
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();
Commenter la réponse de Helau

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.