我想用GDI+在MFC里做透明按钮,用的是这里的方法
http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr
用从网上下载的原始大小的PNG图可以正常显示。但我从网上下载的经常是128*128的大图标,我用PS把它缩小后使用时,它的鼠标悬浮状态,按下状态,原始状态会有相当幅度的改变图标的大小。
我不明白怎么会这样,直接打开图标看是没有问题的,是不是和它的算法有关?改变大小后的PNG图和原始下载或制作的PNG图有什么不同吗?
http://www.codeproject.com/Articles/26887/A-user-draw-button-that-supports-PNG-files-with-tr
用从网上下载的原始大小的PNG图可以正常显示。但我从网上下载的经常是128*128的大图标,我用PS把它缩小后使用时,它的鼠标悬浮状态,按下状态,原始状态会有相当幅度的改变图标的大小。
我不明白怎么会这样,直接打开图标看是没有问题的,是不是和它的算法有关?改变大小后的PNG图和原始下载或制作的PNG图有什么不同吗?
解决方案 »
- VS08中第一次启动调试,提示关闭程序,关闭后,第二次启动调试运行正常?
- 关于windows消息的迷惑
- XP下关闭计算机的问题
- SQL数据库连接问题
- 简单问题,全部的分,sendto 返回值10,环境错误,怎么回事?
- 怎么样在游戏(DirectX, OpenGL)中得到或画点?
- 如何关闭线程
- 请问VC6的IDE中如何设置编译/链接选项支持Unicode
- 请问:如何将一幅24位彩色位图转化成灰度图?(我指的是用编程方法)
- 如何使列表框(clistctrl)只能选择一项,不能选择多项,还有就是如何得到选择的是那一项?
- 请教下关于ReadProcessMemory这个函数中ERROR_PARTIAL_COPY 299
- 菜鸟求解
我也碰到过这类问题
依靠StretchBlt代码级缩小看看
仔细看了一下他的代码,画按钮的函数在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这个函数上,在画原状态图的时候没有正确获取图片的大小。感谢二楼和四楼的帮助,本来都准备放弃了,你们给了我希望让我找到解决的方法分给你们了后面再测试下,看看还有没有别的问题