Création d'une étiquette de texte avec un fond transparent à l'aide de WinAPI
Est-il possible de créer un label avec un fond transparent à l'intérieur d'une fenêtre à l'aide de seulement WinAPI commandes?
Je suis en train d'ajouter une image à une fenêtre de Dialogue qui sert d'arrière-plan de l'image puis afficher du texte sur l'image. Tout ce que j'ai essayé jusqu'à présent montre que le texte de l'étiquette sur le dessus de l'image de fond avec un rectangle gris dessiné autour d'elle.
Ceci est un exemple de mon code jusqu'à présent (du gestionnaire de messages de la boîte de dialogue):
INT_PTR CALLBACK OfferWindowProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hWndBackground;
HWND hWndLabel;
HBRUSH hLabelBackColour = NULL;
HFONT hfFont;
HWND hWndTitleLabel;
HDC hdcStatic = NULL;
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
//Load the background image
HANDLE hBitmap;
hBitmap = LoadImage(NULL, L"C:\\Users\\DavidHall\\Documents\\bg.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (hBitmap != NULL)
{
hWndBackground = CreateWindow(L"STATIC", L"image box", WS_CHILD | WS_VISIBLE | SS_BITMAP, 0, 0, 100, 100, hDlg, (HMENU) 2000, NULL, NULL);
SendMessage(hWndBackground, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hBitmap));
}
//Create the label using CreateWindowEx
hfFont = CreateFont(20, 0, 0, 0, fontWeight, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY,
DEFAULT_PITCH, L"Verdana");
hWndTitleLabel = CreateWindowEx( WS_EX_TRANSPARENT, L"STATIC", L"", WS_CHILD | WS_VISIBLE | SS_LEFT | WS_SYSMENU , xPos, yPos, width, height, hwnd, (HMENU) id, hInst, NULL);
SendMessage(hWndTitleLabel, WM_SETTEXT, NULL, (LPARAM) labelText.c_str());
SendMessage(hWndTitleLabel, WM_SETFONT, (WPARAM)hfFont, NULL);
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hDlg, LOWORD(wParam));
//Delete the brush - is that correct?
DeleteObject(hLabelBackColour);
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
default:
break;
}
return (INT_PTR)FALSE;
}
J'ai essayé différentes combinaisons de choses, y compris:
SetLayeredWindowAttributes
SetBkMode(hdc, TRANSPARENT)
- De la manipulation de la
WM_CTLCOLORSTATIC
message
Une remarque à propos de la question est que je suis en utilisant WinAPI, car ayant de très petite taille est un must pour le projet - toutes les suggestions de GUI cadres qui sont de taille comparable à WinAPI exécutables sont aussi les bienvenus!
OriginalL'auteur David Hall | 2011-08-30
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé quelque chose qui semble fonctionner, mais depuis que je suis très nouveau à la programmation dans le plus pur WinAPI ce qui pourrait bien être très mauvaise pratique et je n'ai aucune idée!
Je suis de la manipulation de la WM_CTLCOLORSTATIC message comme indiqué:
Ce qui donne l'effet que je suis après de mon étiquette apparaissant sur le dessus de mon image avec un fond transparent.
La rançon merci pour la confirmation, ce qui m'a pris plus d'une matinée à la figure pour que je tenais à la fois de confirmer que j'avais mis tout cela ensemble correctement et l'espoir de sauver quelqu'un d'autre le temps dans l'avenir!
Cela a été déjà répondu ici: stackoverflow.com/questions/4495509/...
OriginalL'auteur David Hall
Je ne peux pas commenter, mais je pense que vous devriez donner un coup d'oeil à cette réponse par Chris Becke: Win32 contrôles transparents sur toutes les versions de Windows, il a travaillé pour moi et je n'ai même pas besoin d'appeler InvalidateRect. J'espère que ce sera utile. Chris réponse aurez besoin d'un modèle de brosse, regardez dans cette réponse.
OriginalL'auteur lmiguelmh