[MFC] Dialog non modal [Résolu]

Helau 38 Messages postés vendredi 2 mai 2003Date d'inscription 25 août 2005 Dernière intervention - 2 déc. 2004 à 11:16 - Dernière réponse : Helau 38 Messages postés vendredi 2 mai 2003Date d'inscription 25 août 2005 Dernière intervention
- 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
Helau 38 Messages postés vendredi 2 mai 2003Date d'inscription 25 août 2005 Dernière intervention - 6 déc. 2004 à 12:01
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.

Merci Helau 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Helau
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 2 déc. 2004 à 12:15
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
Helau 38 Messages postés vendredi 2 mai 2003Date d'inscription 25 août 2005 Dernière intervention - 2 déc. 2004 à 14:25
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
ymca2003 2070 Messages postés mardi 22 avril 2003Date d'inscription 3 juillet 2006 Dernière intervention - 2 déc. 2004 à 14:58
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
Helau 38 Messages postés vendredi 2 mai 2003Date d'inscription 25 août 2005 Dernière intervention - 3 déc. 2004 à 09:29
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.