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

Schreibe einen Kommentar