我想用GDI+在MFC里做透明按钮,用的是这里的方法
http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr
  用从网上下载的原始大小的PNG图可以正常显示。但我从网上下载的经常是128*128的大图标,我用PS把它缩小后使用时,它的鼠标悬浮状态,按下状态,原始状态会有相当幅度的改变图标的大小。
  我不明白怎么会这样,直接打开图标看是没有问题的,是不是和它的算法有关?改变大小后的PNG图和原始下载或制作的PNG图有什么不同吗?

解决方案 »

  1.   

    这是你做的PNG图的问题;
    我也碰到过这类问题
      

  2.   

    尝试用原图
    依靠StretchBlt代码级缩小看看
      

  3.   

    问题看起来解决了。
    仔细看了一下他的代码,画按钮的函数在GdipButton.cpp文件中 
    HBRUSH CGdipButton::CtlColor(CDC* pScreenDC, UINT nCtlColor) 
    这个函数响应画按钮的消息响应,里面核心画按钮只有一个函数graphics.DrawImage(...)
    graphics.DrawImage(*m_pStdImage, 0, 0)//画原图;
    graphics.DrawImage(*m_pStdImage, 1, 1)// 画按下的向右下偏移一个象素的图;
    graphics.DrawImage(*m_pStdImage, grect, 0, 0, width, height, UnitPixel, &ia);//画Hot和Gray状态按钮;
    从测试可以看到,hot状态和按下状态图标的显示是正确的,问题出在原图的绘制上,大小不对,于是我把画原图的函数改为:
    int width = (float)m_pStdImage->m_pBitmap->GetWidth();
    int height = (float)m_pStdImage->m_pBitmap->GetHeight();
    graphics.DrawImage(*m_pStdImage, 0, 0, width, height); //width,height是原图的大小
    这样显示就正常了。似乎问题出在DrawImage这个函数上,在画原状态图的时候没有正确获取图片的大小。感谢二楼和四楼的帮助,本来都准备放弃了,你们给了我希望让我找到解决的方法分给你们了后面再测试下,看看还有没有别的问题