2011-08-30 77 views
3

是否可以使用WinAPI命令在窗口內創建具有透明背景的標籤?使用WinAPI創建帶透明背景的文本標籤

我想添加一個圖像到一個對話窗口,將作爲背景圖像,然後在該圖像上顯示文本。到目前爲止,我嘗試過的所有內容都會在背景圖片的頂部顯示文字標籤,並在其周圍繪製一個灰色矩形。

這是我的代碼示例到目前爲止(顯示在對話框的整個郵件處理程序):

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; 
} 

我試過的東西的各種組合,包括:

  • SetLayeredWindowAttributes
  • SetBkMode(hdc, TRANSPARENT)
  • 處理WM_CTLCOLORSTATIC消息
+0

關於這個問題的一個注意事項是,我使用的是WinAPI,因爲文件大小非常小是該項目的必備條件 - 任何與WinAPI可執行文件大小相當的GUI框架建議都是值得歡迎的! –

回答

6

我發現了一些似乎在工作的東西,但由於我對純WinAPI編程非常陌生,所以這可能是非常糟糕的做法,我不知道!

我處理WM_CTLCOLORSTATIC消息,如下所示:

case WM_CTLCOLORSTATIC: 

    hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(0,0,0));  
    SetBkMode (hdcStatic, TRANSPARENT); 

    return (LRESULT)GetStockObject(NULL_BRUSH); 

這讓我在我的標籤出現在我的圖像的頂部有一個透明背景後,我的作用。

+3

你已經得到了它 - 這與WS_EX_TRANSPARENT風格相結合正是如何做到這一點。如果您的標籤文本發生變化,您需要在背景窗口中使用InvalidateRect。 –

+2

@Mark Ransom - 感謝您的確認,這讓我花了大部分時間才弄清楚,所以我非常希望能夠確認我將所有這些放在一起,並希望在將來爲別人節省時間! –

+1

這也已經在這裏解答:http://stackoverflow.com/questions/4495509/static-control-background-color-with-c/4495814#4495814 –