Statique de Contrôle de la Couleur d'arrière-plan avec le C++
Je suis entrain de créer une base de GUI avec l'API de Windows et j'ai couru dans un problème. Il commence avec une fenêtre principale qui s'ouvre avec une couleur de fond personnalisée-je définir (RGB(230,230,230))
. Il affiche alors le texte dans le coin supérieur gauche avec le contrôle de l'électricité statique.
settingstext = CreateWindow("STATIC",
"SETTINGS",
SS_LEFT | WS_CHILD,
12,
20,
100,
20,
hwnd,
NULL,
proginstance,
NULL);
ShowWindow(settingstext, 1);
Cela fonctionne, mais lorsque le texte est affiché j'ai besoin d'un moyen de changer le fond de il pour correspondre à la fenêtre principale, ou autre, il semble comme il n'a pas fondre dans la masse.
Ma question est, comment puis-je faire cela? J'utilise actuellement la méthode ci-dessous et il fonctionne, mais je voulais savoir, est-il un moyen de régler durablement la couleur d'arrière-plan en quelque sorte, à droite après le CreateWindow
fonction pour le contrôle de l'électricité statique sans changer de système de couleurs, et il s'applique à un contrôle et pas quelque chose qui envoie le WM_CTLCOLORSTATIC
message. J'ai expérimenté autour avec l'aide de la GetDC
fonction et SetBkColor
fonction à l'extérieur de la boucle de message, mais rien ne fonctionne.
case WM_CTLCOLORSTATIC:
{
HDC hdcStatic = (HDC) wParam;
SetTextColor(hdcStatic, RGB(0,0,0));
SetBkColor(hdcStatic, RGB(230,230,230));
return (INT_PTR)CreateSolidBrush(RGB(230,230,230));
}
Je veux le faire parce que...
- Je ne veux pas remplir mon message en boucle avec les fonctions qui doivent être appelée à chaque fois que la fenêtre repeint.
- Ont les modifications s'appliquent uniquement à ce contrôle de l'électricité statique.
Je serais très reconnaissant pour toute aide qui pourrait être apportée, à moins de me pointer dans la bonne direction grâce.
WM_CTLCOLORSTATIC
code juste votre contrôle de l'électricité statique en vérifiant que (HWND)lParam == settingstext
. Il y a un problème avec votre exemple, que tous ces brosses vous créez ne sera jamais supprimé.OriginalL'auteur contrapsych | 2010-12-21
Vous devez vous connecter pour publier un commentaire.
Pour le texte statique contrôles il n'y a pas de façon permanente de définir la couleur du texte ou du fond. Même si vous souhaitez appliquer les modifications à un seul contrôle de l'électricité statique; vous auriez encore à gérer WM_CTLCOLORSTATIC message de notification dans le parent dlgproc juste au moment où le contrôle est sur le point d'être établi.
Cela est dû à la
DefWindowProc
d'écraser vos modifications pour le contexte de périphérique à chaque fois qu'il gèreWM_CTLCOLORSTATIC
comme indiqué dans le MSDN:Si vous êtes à la recherche pour rendre le contrôle de l'arrière-plan transparent sur un dialogue parent vous pouvez utiliser
SetBkMode(hdcStatic, TRANSPARENT)
.hBrush
pour l'arrière-plan si vous avez déjà appeléSetBkColor
? Et dans le cas de l'arrière-plan transparent avez-vous besoin également d'un transparent de brosse à dents?OriginalL'auteur cpx
Je pense qu'il y a une façon permanente à le faire.
Juste après la création de l'étiquette,utiliser GetDC() fonction permettant d'obtenir le Contexte de Périphérique.
Ensuite, utilisez:
Et elle doit le faire .
DefWindowProc
réinitialiser ces changements dans le contexte de périphérique à chaque fois qu'il gère leWM_CTLCOLORSTATIC
message pour le contrôle. MSDN: "Par défaut, la fonction DefWindowProc sélectionne par défaut le système de couleurs pour le contrôle de l'électricité statique."OriginalL'auteur NoMadCap
Avez-vous envisagé de sous-classement de la statique de la fenêtre et faire de dessin propriétaire?
Fondamentalement, cela signifie que vous avez les messages envoyés au contrôle de l'électricité statique à la place d'aller à votre code (n'oubliez pas de passer ceux que vous ne le manipulez pas le gestionnaire d'origine). Si vous manipulez le fond d'effacer et de messages de peinture, alors vous pouvez avoir l'affichage de la fenêtre tout ce que vous voulez.
Alors que ferait-il seulement d'arriver à cette commande unique, est-il aussi un moyen de réduire le nombre de fonctions dans la procédure personnalisée je voudrais faire pour que le contrôle. Fondamentalement, ce que je veux en venir, avec l'ensemble "pas très nombreuses fonctions dans la procédure", c'est qu'il semble que ce serait ralentir l'application vers le bas avoir à effectuer ces fonctions à chaque fois qu'il doit repeindre, ou est-il vraiment pas une grosse affaire?
Il ne serait pas plus lent parce que votre peinture routines remplacerait l'actuel (ça va être peint de toute façon). Aussi, vous n'avez pas à écrire de la peinture routines pour chaque contrôle de sous-classe. Vous pouvez sous-classe fenêtres multiples avec le même WndProc. Je le fais tout le temps. Encore, il est peut-être exagéré pour ce que vous avez besoin. Je ne suis pas complètement sûr.
OriginalL'auteur Jonathan Wood