2012-12-26 27 views
2

我註冊窗口類是這樣的:窗口透明的客戶區

WNDCLASSEX wctt; 
wctt.cbSize  = sizeof(WNDCLASSEX); 
wctt.style   = CS_DBLCLKS; 
wctt.lpfnWndProc = WndProcTooltip; 
wctt.cbClsExtra = 0; 
wctt.cbWndExtra = 0; 
wctt.hInstance  = m_hAppInstance; 
wctt.hIcon   = NULL; 
wctt.hCursor  = LoadCursor(NULL, IDC_SIZE); 
wctt.hbrBackground = NULL; 
wctt.lpszMenuName = NULL; 
wctt.lpszClassName = _T("myWindow"); 
wctt.hIconSm  = NULL; 
RegisterClassEx(&wctt) 

正如你可以看到我使用wctt.hbrBackground = NULL;所以它將沒有背景。

窗口創建這樣的:

::CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, 
_T("myWindow"), 
NULL, 
WS_VISIBLE | WS_POPUP, 
50, 
50, 
150, 
100, 
NULL, 
NULL, 
m_hAppInstance, 
NULL); 

在油漆部分,我畫圖標的窗口:

PAINTSTRUCT  ps; 
HDC    hdc; 
BITMAP   bitmap; 
ICONINFO  iconinfo; 
hdc = ::BeginPaint(hWnd, &ps); 
::SetBkMode(hdc,TRANSPARENT); 
::GetIconInfo(localIcon, &iconinfo); 
::GetObject(iconinfo.hbmColor, sizeof(bitmap), &bitmap); 
::DeleteObject(iconinfo.hbmColor); 
::DeleteObject(iconinfo.hbmMask); 
::DrawIconEx(hdc, 0,0, localIcon, bitmap.bmWidth, bitmap.bmHeight, 0, NULL, DI_NORMAL); 

的圖標大小比窗口大小小,我上背景彈出窗口下面的窗口中的當前視圖。

但現在當我移動窗口(或最小化彈出窗口下方的窗口)時,背景不會改變。

我試圖讓一個計時器,每次做流動:再次打印功能運行

RECT rcClient; 
GetClientRect(hWnd, &rcClient); 
InvalidateRect(hWnd,&rcClient,TRUE); 

這使得但是圖標的背景沒有改變。

我應該怎麼做WM_ERASEBKGND
任何人有任何想法如何使其工作?

感謝, 傢伙

+2

請注意,如果你調用'InvalidateRect'用'NULL'爲矩形,它無效整個客戶端RECT –

+0

是的,我知道,我想所有的客戶區無效......這不就是這樣去做吧? –

+1

這個:'InvalidateRect(hWnd,NULL,TRUE)'相當於這個:'RECT rcClient; GetClientRect(hWnd,&rcClient); InvalidateRect(HWND,&RC客戶機,TRUE);'。沒有錯,兩者都是一樣的... –

回答

0

如果你想創建一個非矩形窗口,這是不夠的。設置「無背景」僅僅意味着不會繪製背景,並且您會看到該位置在內存中發生的任何事情。

要創建非矩形窗口,請查看SetWindowRgn函數。

+0

什麼時候該調用這個函數? –

+0

只需創建一次窗口。 – Thomas

+0

我想做一個「Skype通知」像窗口... –

2

僅僅讓背景保持未塗漆是不夠的;您還需要在以下的窗口必要時重新繪製自己。

如果窗口是由同一個線程創建的同一層次結構的一部分,那麼爲您的窗口指定WS_EX_TRANSPARENT擴展樣式就足夠了。這會導致下面的窗口首先繪製自己,所以背景始終是最新的。

否則,您需要使用SetWindowRgn,以便您的窗口實際上不存在於您希望繪製的邊界之外。

+0

謝謝...我會嘗試一下,並會更新你的... –

+0

它看起來不錯...我會再努力一點。謝謝:) –

1

看看Layered Window。該功能允許創建不同形狀的半透明窗口。

在您的窗口類中添加WS_EX_LAYERED擴展屬性。

您可以控制窗口的透明度與這兩個功能:

  1. SetLayeredWindowAttributes

    1. bAlpha控制整個窗口的不透明度,如果你在dwFlags通過LWA_ALPHA

      當bAlpha爲0時,窗口是完全透明的。當bAlpha是255時,窗口是不透明的。

    2. crKey設置透明的顏色。

      以這種顏色在窗口上繪製的所有像素都是透明的。

  2. UpdateLayeredWindow讓你在窗口透明度的精確控制,可以給窗口不同程度的透明度的不同部分。

+0

我一直忘記分層窗口。而且我從來沒有意識到它們是在Windows 2000中一直引入的。 –

+0

當我使用WS_EX_LAYERED窗口與crKey圖像的邊界和透明區域不清楚,我們有一些剩餘的透明顏色。 –

+0

@guymininberg你可以發佈一個截圖嗎?當你使用'crKey'時,只有以這種精確顏色繪製的區域纔會呈現透明。如果你的圖標有半透明區域,並且你想保留它們,那麼你必須使用'UpdateLayeredWindow'。 –