GDI+为按钮加载透明PNG图的疑问

blacksarethy 2012-10-19 11:13:26
我想用GDI+在MFC里做透明按钮,用的是这里的方法
http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr
用从网上下载的原始大小的PNG图可以正常显示。但我从网上下载的经常是128*128的大图标,我用PS把它缩小后使用时,它的鼠标悬浮状态,按下状态,原始状态会有相当幅度的改变图标的大小。
我不明白怎么会这样,直接打开图标看是没有问题的,是不是和它的算法有关?改变大小后的PNG图和原始下载或制作的PNG图有什么不同吗?
...全文
279 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
blacksarethy 2012-10-19
  • 打赏
  • 举报
回复
问题看起来解决了。
仔细看了一下他的代码,画按钮的函数在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这个函数上,在画原状态图的时候没有正确获取图片的大小。

感谢二楼和四楼的帮助,本来都准备放弃了,你们给了我希望让我找到解决的方法。。。分给你们了

后面再测试下,看看还有没有别的问题
傻X 2012-10-19
  • 打赏
  • 举报
回复
尝试用原图
依靠StretchBlt代码级缩小看看

傻X 2012-10-19
  • 打赏
  • 举报
回复
上次也有个人问这个问题。你PS技术不到家,呵呵。
blacksarethy 2012-10-19
  • 打赏
  • 举报
回复
请问楼上,有没有什么解决的办法?
allenjiao 2012-10-19
  • 打赏
  • 举报
回复
这是你做的PNG图的问题;
我也碰到过这类问题

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧