关于使用GDI+绘制png透明图片的问题

yyfzy 2007-04-13 02:55:51
我要在窗体上绘制png图片,并要实现透明效果。我使用Image加载图片后直接在窗体上绘制。

OnPaint()
{
CPaintDC dc(this);
Graphics graphics(hdc);
graphics.DrawImage(m_pImage, m_rcImg.left, m_rcImg.top, m_rcImg.right-m_rcImg.left, m_rcImg.bottom-m_rcImg.top);
}

这样能得到透明效果,但是有一个问题:
就是当我在下一个时间、在同一区域内绘制另外一张png图片的时候,原来的图片根本没有清除,在窗体上能透过新的图片的透明部分看到原来的图片(如果新图片的透明部分比原来的图片大的话)。这样就出现了重叠的效果,请问如何解决?

如果我直接使用Graphics 画在窗体上的dc上,而是先画到Memory DC,然后再贴到窗体dc上去,就会在图片透明的部分呈现出黑色,没有透明效果。

请问该如何处理这个问题??

谢谢!
...全文
1789 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
wangk(倒之):
你的方法我刚才试了,取Parent Wnd的HDC是不行的,因为这个时候Parent Wnd的DC还保留着上个图片的信息。只能是直接取Parent Wnd背景图片的相应部分,但是这个时候如果这个时候主窗体的尺寸和BK的不一致(比如主窗体可以随意改变大小)就麻烦了,还要对图片区域进行对应的缩放才能刷。

请问有没有其他的方法?
谢谢!
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
wangk(倒之):
我明白你的意思了!

我试试看,谢谢提示。
wangk 2007-04-13
  • 打赏
  • 举报
回复
如果你主界面背景不是贴图的话,那么取其背景色刷一下即可,如果主界面背景是贴图的话就取出图的部分刷在MemDc里。
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
MemDc里先重绘背景,就是后面button的背景,然后在绘出图片。
---------------------------------------------------------
请问这里说说的背景是什么?如何绘制绘制?

Button透明的地方应该看到的是主界面上的内容,所以我理解为应该是用透明的刷子刷一次,然后再在Button的窗体上贴新的png图片。
wangk 2007-04-13
  • 打赏
  • 举报
回复
MemDc里先重绘背景,就是后面button的背景,然后在绘出图片。
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
你说的方法就是我前面说得那样:

如果我不直接使用Graphics 画在窗体上的dc上,而是先画到Memory DC,然后再贴到窗体dc上去,就会在图片透明的部分呈现出黑色,没有透明效果。

这样就没有透明的效果。
wangk 2007-04-13
  • 打赏
  • 举报
回复
重绘不一定要让其父窗体来进行,我们自己处理就可以了。
闪烁可以用双缓冲绘图的方式,即MemDc里先重绘背景,然后贴图,最后才复制到Button的Dc。
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
wangk(倒之)
你的方法在可以解决透明的问题,但是会出现闪烁的问题。
比如有个主窗体,贴了个背景图片,然后在上面有个Button,这个Button也是个窗体,而且这个Button上贴了一张透明的png图片,作为不规则按钮。按钮3个状态的图片内容有可能不一样,所以就出现了我说的那个问题。

如果按着wangk(倒之) 的说法,Button每次自己重绘的时候也通知其父窗体(也就是主窗体)重绘对应区域,的确可以解决重叠的问题,但是这个时候Button会出现闪烁的问题。

这也是不能接受的。
yyfzy 2007-04-13
  • 打赏
  • 举报
回复
就是说使用Graphics绘制Image之前,能否使用透明(背景色)的刷子把将要绘制的区域clear?

wangk 2007-04-13
  • 打赏
  • 举报
回复
重绘背景后,再绘png图。
mynamelj 2007-04-13
  • 打赏
  • 举报
回复
不是很明白你的意思

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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