2013-07-23 46 views
0

我的問題是: 在選擇了一個阿爾法位圖到內存DC後,然後使用DrawText函數,但文本無法顯示。GDI,關於阿爾法位圖

代碼如下:

CDC memDC; 
memDC.CreateCompatibleDC(&dc); 
memBitmap.CreateCompatibleBitmap(&dc,64,100); 
CBitmap *oldmemBitmap=(CBitmap*)memDC.SelectObject(&memBitmap); 

CDC memDC1; 
memDC1.CreateCompatibleDC(&dc); 
//m_bitmap has alpha channel 64*64 
CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap); 
memDC.BitBlt(0, 0, 64, 64, &memDC1, 0, 0, SRCCOPY); 


CString str = _T("TEST"); 
memDC.DrawText(str,str.GetLength(),CRect(0,64,64,36),DT_CENTER|DT_WORDBREAK|DT_NOCLIP); 

memDC.SelectObject(oldmemBitmap); 

BITMAP bmpData; 
memBitmap.GetBitmap(&bmpData); 
CImageList imageList; 
imageList.Create(bmpData.bmWidth, bmpData.bmHeight, ILC_COLOR32|ILC_MASK, 0, 1); 
imageList.Add(&memBitmap, RGB(0, 0, 0)); 
POINT pt = {0, 0}; 
imageList.Draw(&dc, 0, pt, ILD_NORMAL); 

的m_bitmap可以正常顯示,但 「TEST」 字符串不能。當我評論memDC.BitBlt(...)時,可以顯示「TEST」字符串。爲什麼?

回答

0

我的第一個猜測:檢查設備字體,顏色和背景顏色選擇到您的上下文中。

「DrawText函數使用設備上下文的選定字體,文本顏色和背景顏色來繪製文本。」 請參閱:http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498%28v=vs.85%29.aspx

由於某種原因或類似原因,您的顏色可能與背景顏色相同。 我排除了你的位圖的alpha通道指定總透明度的可能性。在這種情況下,文本也不會出現。

0

問題中沒有足夠的信息來明確地回答發生了什麼,但我可以採取一些有教育意義的猜測。

除極少數情況外,GDI不處理,尊重或保留Alpha通道。當你這樣做:

CBitmap *oldmemBitmap1=(CBitmap*)memDC1.SelectObject(&m_bitmap); 

有一個轉換髮生,因爲你不能在兼容的DC有一個alpha通道位圖。 (「兼容DC」是一個糟糕的術語,它實際上是一個與設備相關的DC。)

BitBlt將現在不透明的位圖複製到另一個DC。所以現在你在memDC中有一個不透明的位圖 - 我猜測它大部分是黑色的。

然後您在上面繪製文本。我猜測文字也是黑色的,所以你現在在黑色背景上有黑色文字。

然後,您將位圖添加到圖像列表,告訴圖像列表屏蔽掉所有黑色像素,其中包括文字和背景。因此,您看不到文字。你也看不到背景,但是我懷疑你不希望看到背景,因爲alpha通道(實際上已經丟失)。

當您註釋掉BitBlt時,最終會出現未初始化的背景(可能不是黑色),並且會在其上繪製黑色文本。然後將其添加到圖像列表中,遮蓋黑色。文字看起來只是因爲它與不透明背景形成鮮明對比。

這樣回答「爲什麼?」。我現在假設你想知道該怎麼做。爲此,我們需要更多關於你想要發生的事情的信息。

+0

謝謝您的詳細回覆。我試圖通過SetTextColor函數來修改文本顏色,但仍然不起作用。而我使用其他CDC的成員函數,如memDC.FillSoildRect,它們也沒有效果。 – user2567671