我有一個應用程序在客戶區顯示爲黑色的透明背景,因爲窗口沒有分層。在它的每個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。
我不知道,如果使用BitmapInfoHeader.biBitCount = 32或BitmapInfoHeader.biBitCount = 16位。認爲它是32.那麼biCompression呢?> BI_RGB或BI_BITFIELDS?
如何將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中?