J'ai une application héritée écrite en C qui se compose d'une fenêtre principale et de plusieurs enfants mdi ouverts à partir des options du menu. Pour permettre aux nouveaux enfants mdi d'être écrits en C#, j'ai créé une couche d'interopérabilité COM C++ appelée par le code C et qui à son tour appelle le code C#. J'utilise ensuite l'API SetParent pour définir la fenêtre principale C en tant que nouveau parent de toute fenêtre C# ouverte. Cela semble fonctionner - la fenêtre C# se comporte comme un enfant MDI de la fenêtre principale. MAIS, la fenêtre enfant ne peint pas correctement et ne fait qu'empirer si vous déplacez d'autres fenêtres par dessus ou si vous la déplacez vers les bords de la fenêtre principale - elle est peinte avec des parties des autres fenêtres ou laisse des morceaux . En outre, l'écran ne répond pas très bien, par exemple vous ne pouvez pas tabuler d'un textbox à l'autre. S'il vous plaît ne remettez pas en question l'architecture de ma solution (croyez-moi, c'est le seul moyen), mais si vous avez déjà vu un problème comme celui-ci avec un enfant créé par SetParent j'aimerais entendre si vous réussi à le réparer.Repeindre un problème avec un enfant MDI créé par l'API SetParent
Répondre
Essayez ces choses:
Ajouter Application.DoEvents dans une boucle de traitement qui est normalement en cours d'exécution quand les choses vont mal. Essayez d'actualiser les formulaires MDI à partir de l'événement de peinture du formulaire principal.
1 - pas de joie, j'ai peur. 2 - pas une option, hélas. Le code de formulaire principal est généré par un 4GL (je sais, je sais), et cela limite ce qui est possible dans le code. Mais j'apprécie la réponse. – AlfieAmalfi
Je ne comprends pas totalement comment SetParent() fonctionne; Cela étant dit, voici quelques autres choses à considérer:
Dans le contenu de la communauté MSDN de the SetParent documentation, Chango V. de Microsoft a ajouté que vous: « besoin d'appeler SetWindowPos(SWP_FRAMECHANGED)
lors du changement entre nul et parent non nul. "
Etes-vous sûr que vous exécutez réellement la boucle de message .NET Form? Avez-vous appelé Application.Run(yourManagedForm)
, ou exécutez-vous votre propre boucle de message dans le code C? Si vous exécutez votre propre boucle de message, vous devrez peut-être transférer les messages à la méthode WndProc
sur votre formulaire géré après l'avoir filtré via PreProcessMessage
. Vous auriez besoin d'exposer une interface à ceux-ci comme ils sont protégés. Cependant, je ne sais pas si cela est valable.
SWP_FRAMECHANGED regardé prometteur, mais n'a pas résolu mon problème, malheureusement. Hmmm, la boucle du message - un collègue a suggéré que cela pourrait être au cœur du problème. Je ne suis pas sûr de vouloir entrer dans ça ... mais merci quand même. – AlfieAmalfi
- 1. Formulaire enfant MDI Agrandir problème sur Vista
- 2. MDI problème de peinture forme enfant
- 3. Parent MDI dans un autre formulaire parent MDI
- 4. Comment ouvrir un formulaire enfant mdi d'un autre avec vb?
- 5. Comment ouvrir un formulaire enfant MDI à l'aide d'un MenuList sur le formulaire parent MDI principal
- 6. Suppression du menu MDI par défaut d'un formulaire MDI Container lorsqu'un enfant MDI est agrandi
- 7. Exemple de code VB.NET pour appeler l'autre exe à agir comme un enfant MDI? c'est possible?
- 8. Vous voulez ouvrir MDI enfant dans un thread différent
- 9. Essayer d'extraire une fenêtre enfant MDI en dehors de son parent MDI
- 10. Problème de position de début de formulaire enfant MDI
- 11. Merge tooltrip MDI enfant - parent
- 12. Centrer panneau et MDI enfant
- 13. TransientPropertyValueException après avoir enregistré le parent avec un enfant créé
- 14. problème avec la forme MDI C#
- 15. WinForm Enfant d'un autre formulaire, mais dans un conteneur MDI
- 16. Comment définir un enfant MDI comme propriétaire d'un autre formulaire?
- 17. MDI Application minimiser/restaurer problème
- 18. Comment faire tous les formulaires dans un projet en tant que enfant mdi de forme mdi.
- 19. Comment ouvrir un formulaire de formulaire à partir d'un formulaire enfant MDI (application MDI)
- 20. Nouvel enfant MDI redimensionne d'autres formulaires maximisés
- 21. Mise à l'échelle de l'icône utilisée par un enfant MDI agrandi dans MenuStrip du formulaire parent
- 22. MDI Le formulaire enfant n'est pas minimisé
- 23. Repeindre un JPanel dans un cadre
- 24. J'ai un problème avec un formulaire Web que j'ai créé
- 25. ToolstripButton reste focalisé dans un formulaire MDI
- 26. mdi enfant format maximized windowstate - BorderStyle
- 27. Problème avec les contrôles dans le formulaire MDI
- 28. Delphi - Création de formulaire enfant caché MDI
- 29. Intégration de HWND dans un processus externe en utilisant SetParent
- 30. Fermez toutes les fenêtres MDI enfant LINQ
+1 pour la question clairement formulée. Cependant, "c'est le seul moyen" n'est souvent pas vrai. ;) Bienvenue à SO – dss539
Fair point! J'essayais juste de rester concentré sur ce problème car j'ai déjà essayé et exclu un certain nombre de «d'autres façons». – AlfieAmalfi