2010-07-23 53 views
2

我有一個應用程序在客戶區顯示爲黑色的透明背景,因爲窗口沒有分層。在它的每個WM_PAINT消息中,我正在對內存DC執行BitBlt,之後,我將內存DC與UpdateLayeredWindow一起用於分層畫布窗口。在16位桌面顏色深度的BitBlt + UpdateLayeredWindow和CreateDIBSection

設置的內存DC:

HDC hdcMemory = CreateCompatibleDC(NULL); 
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader, 
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0); 
SelectObject(hdcMemory, bmpMemory); 

在WM_PAINT我用BitBlt函數到DC的信息複製應用程序的客戶端區域內存DC。之後,我正在做一個UpdateLayeredWindow與內存DC到分層的畫布窗口DC(其CWnd)。所以它是實時的,結果是:除了具有不規則形狀和每像素透明度之外,我還有正常的應用程序窗口和分層窗口。

一切正常工作在32位桌面顏色深度!如果我切換到16位,分層畫布窗口會變得混亂。繪圖看起來很糟糕,整個窗口是可點擊的。

它認爲這是因爲缺乏alpha通道信息。

所以我搜索了很多的解決方案。我發現在這種情況下我必須創建內存-DC與

HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL); 

而不是CreateCompatibleDC(NULL)。因爲兼容的DC會給我一個16位的DC。

使用CreateDC繪圖效果更好。但是整個窗口仍然是可點擊的,並且透明度在分層窗口中被繪製爲黑色。

所以我認爲問題是與BitBlt或CreateDIBSection的BitmapInfoHeader。

  1. 我不知道,如果使用BitmapInfoHeader.biBitCount = 32或BitmapInfoHeader.biBitCount = 16位。認爲它是32.那麼biCompression呢?> BI_RGB或BI_BITFIELDS?

  2. 如何將BitBlt(...,SRCCOPY)的16位DC添加到內存DC到內存DC,以便它可以與UpdateLayeredWindow一起使用? (也許:預先乘以alpha通道的rgb通道?)不知道該怎麼做。


我有一點點接近16位桌面顏色深度的問題。

HDC hdcMemory = CreateCompatibleDC(NULL); 

以上似乎工作。但是我的UpdateLayeredWindow函數產生的結果看起來很亂。

所以,這是因爲黑色缺失!每個全黑的像素都變得透明。你可以看透,然後點擊。所有其他像素都會失去黑色部分,只能點擊。

我做了一個測試:我打開了Windows Paint.exe,製作了一個窗口寬度和高度的表面,黑色作爲填充顏色。

然後我把它放在我的分層窗口(缺失黑色)下,再次將分層窗口作爲窗口窗口,ta-da,我的分層窗口看起來正常,並且通過Paint.exe黑色像素。

所以我用BitBlt和它的光柵操作參數再次驗證。但沒有運氣。

如何在使用UpdateLayeredWindow繪圖之前將黑色與BitBlt混合到DC中?

回答