2010-10-07 71 views
1

我有一個基於標籤的windows應用程序,我正在開發自己的應用程序。Win32編程問題

我想添加一個微妙的漸變到我的選項卡控件的背景。我會如何去做這件事?什麼是我最好的方法來使用?

我認爲實現一個自定義控件佔用了選項卡控件的空間會起作用,但是如何使用GDI繪製漸變?

謝謝先進。

回答

4

要使用GDI,您需要使用GradientFill函數。您也可以使用GDI +獲取漸變。這裏有一個簡單的GDI例如:

TRIVERTEX  vert[2] ; 
GRADIENT_RECT gRect; 
vert [0] .x  = 0; 
vert [0] .y  = 0; 
vert [0] .Red = 0x0000; 
vert [0] .Green = 0x0000; 
vert [0] .Blue = 0x0000; 
vert [0] .Alpha = 0x0000; 

vert [1] .x  = 100; 
vert [1] .y  = 32; 
vert [1] .Red = 0x0000; 
vert [1] .Green = 0x0000; 
vert [1] .Blue = 0xff00; 
vert [1] .Alpha = 0x0000; 

gRect.UpperLeft = 0; 
gRect.LowerRight = 1; 
GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H); 

至於選項卡控件,您可以子類控制並覆蓋其非客戶端和客戶端繪製處理程序來呈現漸變。

子類的控制,首先創建控件,然後替換其WNDPROC功能:

OldWndProc = (WNDPROC)SetWindowLongPtr (hControl, GWLP_WNDPROC, (LONG_PTR)NewWndProc); 

那麼,在新的WNDPROC:

NewWndProc (usual args) 
{ 
    switch message 
    { 
    case paint: 
    draw gradient 
    return result 

    default: 
    return CallWindowProc (OldWndProc, ..args..); <- important! 
    } 
} 
+0

我想你應該把'CallWindowProc'調用返回到開關外部,否則編譯器可能會給出一個警告:「所有控制路徑不返回..」。 +1雖然,非常廣泛的答案。而我不知道子分類:) – Default 2010-10-07 11:28:47

+0

+1 Thankyou的詳細迴應。看起來很有希望。 – 2010-10-07 12:39:45

+0

您能否指出我要處理的正確信息? WM_PAINT? – 2010-10-07 12:46:24