2011-01-21 2 views
4

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

+0

+1 pour la question clairement formulée. Cependant, "c'est le seul moyen" n'est souvent pas vrai. ;) Bienvenue à SO – dss539

+0

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

Répondre

0

Essayez ces choses:

  1. 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.

+0

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

0

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.

+0

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

Questions connexes