最近在写一个图片控件,要能加载除了bmp以外的格式的图片,要求最好能加载png,能响应鼠标左键按下、弹起、滑过(鼠标经过)等等消息。
       我让控件继承CWnd,然后再在XTP的浮动面板中作为子窗口测试以下加载图片的效果。结果发现,不管我是否对图片做了透明通道的处理,背景色都是黑色,这个问题困扰我好几天,网上各种找资料也没有解决。终于今天找到了问题在哪里了:stdafx.h中各种关于版本的宏,定义的版本太低了,需要0x0500及以上才可以支持透明特性。改成0x0500及以上就可以了(虽然支持透明特性,但是还是要做预乘,否则会有白边)。
       其实这个知识点也有人提到,我看了看自己做实验的那个stdafx.h里面定义的版本没问题,以为自己出问题的那个工程的stdafx.h也没问题(因为这个工程不是我创建的,后来才知道是XTP向导生成的工程)。后来发现他们定义的版本居然不一样,都是向导生成的,不过一个是MFC自带的向导(VS05),一个是XTP工程的向导,后者定义的版本会比较低。
       呼呼,今日先传个预乘的代码,待接口全部整理好了再全部上传:

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;
            }
        }
    }
}