2009-12-17 5 views
2

J'ai un assez difficile (au moins pour moi), que j'ai passé beaucoup de temps à essayer de comprendre. J'ai une application winform C#. Dans l'application, j'ai besoin de présenter plusieurs pages Web les unes sur les autres avec une couleur transparente me permettant d'empiler les pages Web les unes sur les autres. Je peux facilement faire cela en laissant la page web n'a pas de couleur arrière spécifiée et en plaçant le contrôle WebBrowser sur un WinForm séparé avec un TransparentcyKey et BackgroundColor mis à, par exemple. blanc. Lorsque j'ouvre plusieurs formulaires, ils se comportent de manière transparente et j'obtiens l'effet requis. Ayant des tas de formes comme ça ouvert est à mon avis assez salissant que ce que je veux juste est quelque chose de plus comme contrôle. Mon idée est donc soit de le mettre dans un UserControl et d'y ajouter la logique nécessaire, soit simplement d'hériter et de surcharger la fonctionnalité du Webbrowser. Le UserControl n'expose toutefois aucune clé de transparence comme le formulaire, donc c'est une impasse. Substituer le WndProc dans UserControl pour gérer la peinture moi-même semble n'avoir aucun effet. C'est comme si le WebBrowser n'était vraiment accessible à personne, ce qui, je suppose, a quelque chose à voir avec le fait qu'il ne s'agit que de l'ActiveX encapsulé.Navigateur Web transparent dans le contrôle de l'utilisateur dans .NET

Dans le cas où il n'est pas possible d'avoir un WeBrowser dérivé ou un UserControl avec un WebBrowser, quelqu'un a-t-il des suggestions sur comment manipuler les formulaires de façon à ce qu'ils agissent comme des contrôles utilisateur les sur une forme "mère"?

Meilleur Ragards Franz Thomsen

Répondre

4

Le contrôle WebBrowser efface son arrière-plan en utilisant la couleur d'arrière-plan spécifié dans Options Internet. Pour le mélanger avec l'image d'une autre fenêtre, vous devez utiliser des calques (SetLayeredWindowAttributes/UpdateLayeredWindow). Toutefois, les calques ne fonctionnent pas avec les fenêtres enfants (dans ce cas, le contrôle WebBrowser). Pour accéder à un autre calque, vous devez créer une fenêtre de premier niveau, positionnée exactement au même endroit que votre contrôle de zone dans votre fenêtre principale. Vous devrez continuer à le déplacer et éventuellement le redimensionner lorsque le contrôle de l'espace réservé sera déplacé/redimensionné. Avoir un propriétaire s'assurera qu'il est automatiquement minimisé et détruit avec la fenêtre principale de l'application. Et vous devez le faire ressembler à une fenêtre enfant, c'est-à-dire sans bordure et ShowInTaskbar = false. Pour une discussion, voir http://blogs.msdn.com/changov/archive/2009/01/19/webbrowser-control-on-transparent-wpf-window.aspx.

Si votre page Web contient des transitions ActiveX/DirectX accélérées par le matériel et des filtres qui écrivent directement sur l'écran au lieu du processus de dessin de fenêtre IE participant, vous risquez de ne pas avoir de chance.

+0

Bonjour Sheng Merci beaucoup pour la réponse à ma question. L'exemple dont vous parlez implémente autant que je peux voir la solution que je décris où vous avez un WinForm en haut qui suit la taille, l'emplacement et autres. Ce n'est pas une belle solution quand j'ai besoin de scollbars et autres et que je dois découper les formulaires. Ce que vous écrivez à propos de SetLayeredWindowAttributes et de UpdateLayeredWindow est assez intéressant, mais je ne suis pas sûr de savoir comment les utiliser. Connaissez-vous des exemples concernant mes problèmes? Merci beaucoup :-) Cordialement Franz Thomsen –

+0

Il n'y a pas une solution assez. Les exemples WPF et la transparence WinFOrm doivent être implémentés en appelant SetLayeredWindowAttributes/UpdateLayeredWindow, avant la composition du bureau de Vista que je ne connais pas autrement. –

Questions connexes