Question

Je développe un contrôle ActiveX qui (ces jours-ci) est principalement utilisé dans les applications WinForms.

Le contrôle ActiveX a une boîte de dialogue « page de propriété », qui peut être illustré par programme la méthode ShowPropertyPages sur la classe AxHost. Ceci est l'interface utilisateur personnalisée qui peut être élevé dans Visual Studio pour modifier les propriétés d'un contrôle.

Cette boîte de dialogue de page de propriétés contient un contrôle ListBox qui utilise un ImageList pour afficher les icônes à côté de la liste des articles. Ces icônes sont des bitmaps alpha mélangés 32 bits. Pour que ces pour afficher correctement, la version 6.0 ou au-dessus de COMCTL32.DLL doit être utilisé.

Malheureusement, quand je lance mon application WinForms, il charge et utilise la version COMCTL32.DLL 5.xxx . Par conséquent, lorsque la boîte de dialogue de page de propriétés s'affiche les icônes mauvaise image (les zones semi-transparentes sont tirées en noir solide).

Ma question est: est-il possible que je peux vous assurer d'utiliser la version 6.0+ COMCTL32.dll à partir de l'interface utilisateur de page de propriétés de contrôle ActiveX, peu importe ce que le processus utilise? Ou puis-je forcer le processus d'accueil à utiliser la version 6.0? (Je ne pense pas, parce que je pense le processus hôte aurait déjà chargé COMCTL32.DLL en mémoire avant tout du code dans le contrôle ActiveX.

Cette page couvre certains scénarios d'utilisation comctl32 6.0 , mais pas la situation dans laquelle je suis.

Était-ce utile?

La solution

L'article MSDN d'origine me confusion parce qu'il a porté sur un certain nombre de scénarios spécifiques, dont aucun mien apparié. En fait, la technologie sous-jacente, il parle des œuvres plus généralement.

l'ajout d'un fichier xml 'manifeste' ressource au ActiveX DLL, je peux signaler au système côte à côte que je veux que DLL à utiliser COMCTL32.DLL 6.x. Cette version est alors chargée automatiquement. Pretty nice.

Ce manifeste doit être le type de ressource RT_MANIFEST , avec un identifiant de ressource 2 .

Voici la preuve du succès (deux versions de la même DLL chargées dans le même processus!): capture d'écran procexp montrant deux chargés dans le processus de comctl32

(également, les icônes affichent correctement dans la liste ;) )

Autres conseils

Si votre application appelle Application.EnableVisualStyles () (généralement avant d'appeler Application.Run () pour lancer une boucle de message), puis la version 6+ de la bibliothèque des contrôles communs doit être utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top