最近在寫一個圖片控件,要能加載除了bmp之外的格式的圖片,要求最好能加載png,能響應鼠標左鍵按下、彈起、滑過(鼠標通過)等等消息。
我讓控件繼承CWnd,而後再在XTP的浮動面板中做爲子窗口測試如下加載圖片的效果。結果發現,無論我是否對圖片作了透明通道的處理,背景色都是黑色,這個問題困擾我好幾天,網上各類找資料也沒有解決。終於今天找到了問題在哪裏了:stdafx.h中各類關於版本的宏,定義的版本過低了,須要0x0500及以上才能夠支持透明特性。改爲0x0500及以上就能夠了(雖然支持透明特性,可是仍是要作預乘,不然會有白邊)。
其實這個知識點也有人提到,我看了看本身作實驗的那個stdafx.h裏面定義的版本沒問題,覺得本身出問題的那個工程的stdafx.h也沒問題(由於這個工程不是我建立的,後來才知道是XTP嚮導生成的工程)。後來發現他們定義的版本竟然不同,都是嚮導生成的,不過一個是MFC自帶的嚮導(VS05),一個是XTP工程的嚮導,後者定義的版本會比較低。
呼呼,今日先傳個預乘的代碼,待接口所有整理好了再所有上傳:ide
void CPicCtrl::DealAlphaChannel(CImage& p_w_picpath) { if (p_w_picpath.GetBPP() == 32) { for (int i=0; i<p_w_picpath.GetWidth(); i++) { for (int j=0; j<p_w_picpath.GetHeight(); j++) { unsigned char* pucColor = reinterpret_cast<unsigned char*>(p_w_picpath.GetPixelAddress(i , j)); pucColor[0] = pucColor[0] * pucColor[3] / 255; pucColor[1] = pucColor[1] * pucColor[3] / 255; pucColor[2] = pucColor[2] * pucColor[3] / 255; } } } }