Ensemble statique de la couleur du texte Win32
Je fais une dll qui contrôle une boîte de dialogue. Je voudrais obtenir une certaine zone pour avoir le texte en rouge. Ce code ne compile, mais l'effet n'est pas visible. Ici est l'endroit où les dialogProc est fait:
LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
CheckDlgButton(hDlg, IDC_CHECK, FALSE);
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_CHECK:
if (IsDlgButtonChecked(hDlg, IDC_CHECK))
{
EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
EnableWindow(GetDlgItem(hDlg, IDCANCEL), FALSE);
}
else
{
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
EnableWindow(GetDlgItem(hDlg, IDCANCEL), TRUE);
}
break;
case IDOK:
{
EndDialog(hDlg, TRUE);
return FALSE;
}
case IDCANCEL:
{
EndDialog(hDlg, FALSE);
return FALSE;
}
case WM_CTLCOLORSTATIC:
//Set the colour of the text for our URL
if ((HWND)lParam == GetDlgItem(hDlg,IDC_WARNING))
{
//we're about to draw the static
//set the text colour in (HDC)lParam
SetBkMode((HDC)wParam,TRANSPARENT);
SetTextColor((HDC)wParam, RGB(255,0,0));
return (BOOL)CreateSolidBrush (GetSysColor(COLOR_MENU));
}
return TRUE;
}
}
return FALSE;
}
êtes-vous sûr que votre bloc de code est exécuté?
L'instruction du cas, mais je pense que c'est plus basé sur l'interaction de l'utilisateur, tels que les boutons de clic. Je ne suis pas trop sûr de la façon de définir une couleur de façon statique sur l'API Win32. Je suis plus habitué à C++ où il y avait un attribut de couleur sur l'objet.
Eh bien, le bleu est maintenant de travail, j'ai maintenant un fond blanc partout!
Tous les décors sont d'accord, sauf pour l'icône de contrôle. Il est transparent. Pas trop sûr, pourquoi ce contrôle a maintenant un fond blanc!
Ouais, j'ai réalisé que plus tard, c'est la façon dont je l'ai eu à travailler, je l'ai déplacé hors de ce bloc, je viens de le mettre dans le mauvais endroit par hasard! Mais, je ne peux pas obtenir mon icône pour avoir un fond transparent maintenant. J'ai déplacé la partie transparente à l'extérieur de la si, donc, tout est transparent, puisque, avant le texte en noir avait un fond blanc, mais je ne pouvais pas l'icône pour avoir un fond transparent. L'IUt a été avant ce travail.
L'instruction du cas, mais je pense que c'est plus basé sur l'interaction de l'utilisateur, tels que les boutons de clic. Je ne suis pas trop sûr de la façon de définir une couleur de façon statique sur l'API Win32. Je suis plus habitué à C++ où il y avait un attribut de couleur sur l'objet.
Eh bien, le bleu est maintenant de travail, j'ai maintenant un fond blanc partout!
Tous les décors sont d'accord, sauf pour l'icône de contrôle. Il est transparent. Pas trop sûr, pourquoi ce contrôle a maintenant un fond blanc!
Ouais, j'ai réalisé que plus tard, c'est la façon dont je l'ai eu à travailler, je l'ai déplacé hors de ce bloc, je viens de le mettre dans le mauvais endroit par hasard! Mais, je ne peux pas obtenir mon icône pour avoir un fond transparent maintenant. J'ai déplacé la partie transparente à l'extérieur de la si, donc, tout est transparent, puisque, avant le texte en noir avait un fond blanc, mais je ne pouvais pas l'icône pour avoir un fond transparent. L'IUt a été avant ce travail.
OriginalL'auteur Jon Weinraub | 2009-10-06
Vous devez vous connecter pour publier un commentaire.
WM_CTLCOLORSTATIC est un message séparé de WM_COMMAND. Votre choix de la manipulation du message semble être correct sauf que la case pour que le message est à l'intérieur de votre chèque de WM_COMMAND à des éléments spécifiques. Essayez une réorganisation de votre extérieur de l'instruction switch. Peut-être quelque chose comme ce qui suit:
Notez également qu'il serait un peu bizarre de filtre WM_COMMAND wParam argument lors de wParam est censé fournir de la HDC pour WM_CTLCOLORSTATIC.
WM_CTLCOLORSTATIC Notification sur le site MSDN
La solution ci-dessus fuites d'au moins un objet GDI. Il n'y a pas de code pour appeler DeleteObject pour l'appel à la CreateSolidBrush. Je ne suis pas sûr si WM_CTLCOLORSTATIC est transmis chaque opération de peinture ou si c'est seulement sur la boîte de dialogue d'initialisation. Mais il y a une fuite, une fuite. Le code ci-dessus devrait créer le pinceau dans WM_INITDIALOG et ensuite appeler DeleteObject dans WM_DESTROY. Sinon, GetSysColorBrush peut être une meilleure solution pour le code ci-dessus au lieu de l'appeler CreateSolidBrush.
fixe. je vous remercie.
OriginalL'auteur meklarian