2012-12-06 44 views
4

我想實現一個靜態控件,它刷新(更改文本)以響應某個事件,每秒發生一次。由於我不想每秒都繪製整個客戶區,因此我決定使用靜態控件,現在問題是父窗口被蒙上了陰影,這意味着它將自定義位圖作爲其背景,並且靜態控件不會適應,所以我正在尋找方法來使靜態控件的背景透明。是否有可能使Static控件透明?

這是我現在有:

 hHandle = CreateWindowEx(WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 60, 212, 477, 20, hwnd, 0, hInstance, 0) ; 


    case WM_CTLCOLORSTATIC: 
      { 
       HDC hdC = (HDC)wParam; 

       SetTextColor(hdC, RGB(31,122,179)); 

       SetBkMode(hdC, TRANSPARENT); 


       return 0;//(HRESULT)GetStockObject(NULL_BRUSH); 
      } 
      break; 

我試圖返回NULL畫筆繪製背景,希望這會使它的背景透明的,但它並沒有什麼更多的它迫使靜態控件不重繪正確地說,我的意思是,文本被繪製在舊文本的頂部,所以它都很混亂。

子類是唯一的選擇嗎?

回答

0

您沒有提到靜態控件上的窗口樣式,具體來說,擴展樣式WS_EX_TRANSPARENT似乎意在解決您在重繪時描述的問題。還據我的理解,WS_EX_COMPOSITED可能在你的上下文中很有用。

您也可以考慮背景窗口是否應設置WS_CLIPCHILDREN,因爲這可能會影響重繪。

+0

它似乎只適用於新文本下的靜態控件的背景部分,如果新文本的長度小於前一個文本的前一個繪畫的其餘文本不在新文字留在那裏,它不會消失(對不起英文:P) – StudentX

3

我發現可靠地做到這一點的唯一方法是對靜態控件進行子類化並手動繪製背景。

WS_EX_TRANSPARENT不會使控件對底層像素真正透明(儘管可能會出現這種情況),並且WS_EX_COMPOSITED不能用於子窗口。

取而代之的是,靜態子類,並捕獲WM_ERASEBKGND消息。然後,您可以繪製底層位圖的適當部分。

+0

好吧,非常感謝 – StudentX

2

根據我的理解,獲取WC_STATIC控件只顯示您選擇的顏色(通過圖像或其他表面)的文本的方式就是返回。這是從我的link

case WM_CTLCOLORSTATIC: 
    SetTextColor((HDC)wParam, RGB(255, 0, 0)); 
    SetBkMode((HDC)wParam, TRANSPARENT); 

    // the correct return needs HOLLOW_BRUSH 
    return (LRESULT)GetStockObject(HOLLOW_BRUSH); 
break; 
+0

[WM_CTLCOLORSTATIC消息](https://msdn.microsoft.com/en-us/library/bb787524.aspx ) - 支持的最低客戶端Windows Vista – tibx