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