Erstellen Sie eine Beschriftung mit einem transparenten hintergrund mit WinAPI
Ist es möglich, ein Etikett zu erstellen mit einem transparenten hintergrund in einem Fenster mit nur WinAPI Befehle?
Ich versuche ein Bild hinzufügen, um einen Dialog-Fenster, das dient als hintergrund Bild und dann text anzeigen, die auf diesem Bild. Alles, was ich bisher ausprobiert haben, zeigt die Beschriftung auf der Oberseite des hintergrund-Bildes mit einem grauen Rechteck gezeichnet, um ihn herum.
Dies ist ein Beispiel von meinem code bisher (für die gesamte message-Prozedur für das Dialogfeld):
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;
}
Ich habe versucht, verschiedene Kombinationen von Dingen, einschließlich:
SetLayeredWindowAttributes
SetBkMode(hdc, TRANSPARENT)
- Umgang mit der
WM_CTLCOLORSTATIC
Nachricht
Eine Anmerkung zu der Frage ist, dass ich mit WinAPI, da sehr kleine Datei-Größe ist ein muss für die Projekt - Vorschläge von GUI-frameworks, die sind in der Größe vergleichbar zu WinAPI-Programme sind auch willkommen!
InformationsquelleAutor David Hall | 2011-08-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich etwas gefunden, das scheint zu funktionieren, aber da bin ich sehr neu in der Programmierung in reinem WinAPI kann dies sehr schlechte Praxis, und ich hätte keine Ahnung!
Ich bin Umgang mit der WM_CTLCOLORSTATIC message wie folgt:
Dieser gibt den Effekt, dass ich nach meiner Bezeichnung, die auf meinem Bild mit einem transparenten hintergrund.
Lösegeld - danke für die Bestätigung, das hat mich am meisten der morgen, um herauszufinden, so ich wollte auch bestätigen, ich würde es alle zusammen richtig und hoffentlich speichern Sie jemand anderes die Zeit in die Zukunft!
Dieser wurde auch schon beantwortet hier: stackoverflow.com/questions/4495509/...
InformationsquelleAutor David Hall
Kann ich nicht kommentieren, aber ich denke, sollten Sie einen Blick auf diese Antwort von Chris Becke: Win32 transparente Kontrollen auf allen Windows-Versionen, es funktionierte für mich und ich brauchte nicht einmal zu nennen InvalidateRect. Ich hoffe, dass dies nützlich sein wird. Chris ' Antwort benötigen einen Muster, Pinsel, schauen Sie in diese Antwort.
InformationsquelleAutor lmiguelmh