GDI+的DrawString函数为什么写入的字还是透明的?

screen12 2014-01-30 08:27:20
我想用一幅png图片做背景,于是先用Image image(L"skin1.png",TRUE);把图片选入,再用
Graphics graph(hdcmem);
graph.DrawImage(&image,0,0,227,113);
把图片拷贝进hdcmem,然后再用DrawString写一些字进去,程序如下:
FontFamily fontFamily(L"新宋体");
Font font(&fontFamily, sys.fsize, FontStyleRegular, UnitPixel);
SolidBrush solidBrush(Color(255, 255, 0, 0));
WCHAR string[256];
wcscpy(string, L"欢迎!");
PointF pointF(80, 10);
graph.DrawString(string, 2, &font, pointF, &solidBrush);

最后用UpdateLayeredWindow把hdcmem的内容更新到窗口上:
m_Blend.BlendOp=0;
m_Blend.BlendFlags=0;
m_Blend.AlphaFormat=1;
m_Blend.SourceConstantAlpha=255;
UpdateLayeredWindow(hWndComp,hdcScreen,&ptWinPos,&sizeWindow,hdcmem,&ptSrc, 0, &m_Blend,ULW_ALPHA);

结果发现:在白背景上,图片显示为(字很淡,依稀能看到):


把窗口拖到灰色背景上,图片显示为:


可以发现:在白背景下,字体为白色,可我当时键的画刷是红色的SolidBrush solidBrush(Color(255, 255, 0, 0));而且alpha值为255,为什么显示的是白色的?

而移到灰背景下,字体倒确实是红色的了,不过是淡红色的,而且有一定程序的透明。

我希望字体完全不透明,完全覆盖背景,应该怎么办?
...全文
177 点赞 收藏 3
写回复
3 条回复
向立天 2014年03月01日
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
回复 点赞
screen12 2014年01月30日
另外还有一点不懂,图片左上方的“五”字(上半部分不知何故被截去了),是用TextOut()函数输出的。据说TextOut输出的字体,会覆盖alpha通道,也就是将alpha值置0,然后用UpdateLayeredWindow函数将hdcmem的内容更新到窗口的hdcScreen的时候,由于alpha为0,因此呈完全的透明状。 可是为什么在白背景下,确实完全透明,但移到灰色背景下,却可以显示一个淡红色的“五”字呢?并没有完全透明啊!这是怎么回事?
回复 点赞
screen12 2014年01月30日
刚才把SolidBrush solidBrush(Color(255, 255, 0, 0));里的第一个参数,alpha值,改为127,竟然就行了!如下: SolidBrush solidBrush(Color(127, 255, 0, 0)); 字体为鲜红色,而且完全不透明,正是我希望的! 只是不太懂,这是为什么呢?按理说,alpha值为255才是完全的不透明,可是为什么255的时候,会透明,而且在灰色背景下原来鲜红的字体变得暗红,而127却可以完全不透明?
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7977

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告