2011-02-24 5 views
7

Je suis en train d'écrire une DLL de plug-in Win32 pour une application MFC tierce. La DLL doit afficher un dialogue modal. Lorsque je le fais en utilisant DialogBox() ou une autre API Win32 (par exemple j'ai essayé d'écrire ma propre boucle modale), la fenêtre de l'application principale ne redessine pas tous les éléments: elle redessine les éléments standard, mais pas la zone client. Les boîtes de dialogue Modeless s'affichent très bien.Application MFC et boîte de dialogue modale non-MFC

Screenshot

je soupçonne que cela se produit parce que MFC n'a pas vraiment des boîtes de dialogue modales dans le sens Win32. Il peut seulement avoir une boucle de message et une boucle séparée dans DialogBox() perturbe sa machine délicate. Voici a CodeProject article qui explique cela. Mais cet article de CodeProject a 9 ans, alors peut-être que les choses ont changé depuis. Quelqu'un pourrait-il nous éclairer là-dessus? L'application utilise MFC 8 (c'est-à-dire mfc80.dll).

Mise à jour. Voici un lien vers le original question; il peut contenir des informations supplémentaires.

Mise à jour 2. Merci tout le monde; J'apprécie vraiment tous les conseils, cela m'aide certainement à avoir une vue d'ensemble de la façon dont les choses vont ensemble. Le premier chemin que je vais explorer est d'utiliser des boîtes de dialogue 'modales' MFC natives. (Puisque je fais tout cela à partir de Python, j'utiliserai des liaisons Python pour MFC, pywin32). Cela prendra un certain temps; quand il sera prêt, je mettrai à jour le post avec les résultats.

+0

+1 bonne question, je serai intéressé de voir la réponse! –

+0

Voir aussi http://stackoverflow.com/questions/5058929 dont cette question est une suite (plus ou moins). – 0xC0000022L

+0

pourriez-vous s'il vous plaît utiliser Spy ++ (livré avec Visual Studio) ou une autre application similaire (que je connais peut être trouvé à http://www.catch22.net/software/winspy) pour savoir si la zone client de la "console" "La fenêtre est plus qu'une fenêtre enfant unique?! – 0xC0000022L

Répondre

4

Chaque thread peut avoir une boucle de message. Placez votre boîte de dialogue modale dans un thread séparé et émulez le comportement standard de Windows en désactivant la fenêtre parente.

Modifier: après une discussion (voir ci-dessous), il semble que le code parent se comporte de manière incorrecte.

Cependant, je pense qu'il existe des solutions possibles. Il peut s'agir d'une fenêtre parente (dans la boîte de dialogue modale, mais enfant par celle qui se comporte actuellement incorrectement) qui recouvre le contenu de la fenêtre erronée, mais la redessine d'un contrôleur de domaine en mémoire pour imiter un comportement correct. Bien sûr, la fenêtre parent doit encore être désactivée. Une autre solution peut être de sous-classer la fenêtre parent, pour corriger le comportement. Puisque le plugin fonctionnerait dans le même processus, l'implémentation devrait être simple.

+0

Cela ne fonctionnera probablement pas car ce plugin est appelé par l'application hôte de manière synchrone. –

+0

@David Heffernan: Droit, basé sur quelle partie de la question originale? En outre, cela n'a pas d'importance si l'application hôte l'appelle de manière synchrone, car le plugin pourrait être écrit pour bloquer son appel (comme l'application hôte le souhaite) jusqu'à ce que le thread contenant la boucle de messages (et tout le travail de dialogue) se termine. – 0xC0000022L

+0

@STATUS sur la base du fait qu'il doit être bloqué dans la boucle principale pour que l'application principale échoue à redessiner. –

Questions connexes