2009-08-18 8 views
2

Je crée une fenêtre contextuelle non intrusive pour informer l'utilisateur lors du traitement d'une opération qui prend du temps. En ce moment je suis mise en appelant sa transparence SetLayeredWindowAttributes qui me donne un résultat raisonnable:Fenêtre transparente contenant du texte et des boutons opaques

alt text http://img6.imageshack.us/img6/3144/transparentn.jpg

Cependant Je voudrais que le texte et le bouton de fermeture apparaître opaque (il ne semble pas tout à fait à droite avec du texte blanc) tout en gardant l'arrière-plan transparent - y a-t-il un moyen de le faire?

+1

Désolé, il n'y a pas de fonctionnalité PM sur stackoverflow - donc je dois faire un commentaire ici - partageriez-vous le code pour la solution finale - similaire à ce que Koro a indiqué? Merci – Steve

Répondre

10

Afin de faire du "bon" alpha dans une fenêtre en couches, vous devez fournir au gestionnaire de fenêtres un bitmap PARGB par un appel à UpdateLayeredWindow.

La propre façon d'atteindre ce que je connaisse est le suivant:

  1. Créer un objet GDI + Bitmap avec le format de pixel PixelFormat32bppPARGB. Créez un objet Graphics pour dessiner dans cet objet Bitmap.
  2. Faites tout votre dessin dans cet objet en utilisant GDI +.
  3. détruire l'objet Graphics créé à l'étape 2.
  4. Appelez la méthode GetHBITMAP sur l'objet Bitmap pour obtenir Windows HBITMAP.
  5. Détruisez l'objet Bitmap.
  6. Créez une mémoire CC à l'aide de CreateCompatibleDC et sélectionnez HBITMAP à partir de l'étape 5 dans celle-ci.
  7. Appelez UpdateLayeredWindow en utilisant la mémoire CC comme source.
  8. Sélectionnez le bitmap précédent et supprimez la mémoire DC.
  9. Détruire l'HBITMAP créé à l'étape 5.

Cette méthode devrait vous permettre de contrôler le canal alpha de tout ce qui est dessiné: transparent pour l'arrière-plan, opaque pour le texte et le bouton.

De plus, puisque vous allez être texte en sortie, je recommande que vous appelez SystemParametersInfo pour obtenir le réglage par défaut anticrénelage (SPI_GETFONTSMOOTHING), puis la SetTextRenderingHint sur l'objet graphique pour définir le type d'anticrénelage au même type qui est configuré par l'utilisateur, pour un look plus agréable.

0

Je ne peux pas dire avec certitude, vous aurez besoin de l'essayer, mais comme tout est une fenêtre, vous pouvez essayer de définir les attributs en couches pour votre bouton pour le rendre opaque.

En ce qui concerne le texte, vous pourrez peut-être le mettre dans son propre cadre avec un fond de jeu et de couleur de premier plan, et modifier ses attributs en couches pour rendre la couleur d'arrière-plan transparent ...

Mais puisque ceux-ci sont fenêtres enfant et pas la fenêtre de haut niveau, je ne sais vraiment pas que ça va marcher.

3

Je suppose que vous aurez besoin de deux fenêtres de haut niveau plutôt qu'une - celle qui a le mélange alpha et une seconde qui est affichée au-dessus de la première avec le texte opaque et le bouton mais avec un fond transparent. Pour ce faire avec une seule fenêtre, vous devrez utiliser l'appel API UpdateLayeredWindow, mais en utilisant cela, vos boutons ne seront pas redessinés quand ils interagiront (survol, pointeur, etc.)

Il est possible que si cette application est pour Vista seulement il y a un nouvel appel d'API que vous pouvez utiliser, mais je ne crois pas qu'il est disponible dans XP ou plus tôt.