+ -
当前位置:首页 → 问答吧 → 如何实现对话框窗体仅仅背景透明而控件不透明

如何实现对话框窗体仅仅背景透明而控件不透明

时间:2008-10-16

来源:互联网

本人设计的一个MDI程序,弹出一对话框,用来叠加在视频母窗体上,对话框上面绘有线条,我希望对话框背景透明,
那样就可以实现线条叠加在视频窗体上可。
  用最新的SetLayeredWindowAttributes()函数可以实现背景透明,最理想的完全透明也可以实现,但这个函数的
缺点是对话框背景透明后,其上面的线条也透明了,就没有实现线条叠加在视频窗体上的效果了。

  请问有没有别的方法实现仅对话框背景透明,而其上的线条和按纽是非透明的,感觉SetLayeredWindowAttributes()
函数无法实现我所需要的效果,有没有别的解决办法啊,谢谢了。

作者: yiwan209   发布时间: 2008-10-16

有解决办法。不过如果你的线条要改变的话,效果就可能不太好。

方法是:不要使用 SetLayeredWindowAttributes 函数,而是使用 SetWindowRgn 函数。把你的线条集合作为一个异形窗口的形状,这样天然实现了你想要的最理想的全透明,而且还兼容 Windows 2000 之前的操作系统。

作者: dandycheung   发布时间: 2008-10-16

http://zhidao.baidu.com/question/12378638.html?fr=qrl

作者: zzz822163   发布时间: 2008-10-16

你的这条路是有问题的,如果你仅仅在视频上方叠加透明窗口的话,你的透明窗口将会产生较强烈的闪烁,视觉效果很差。
SetWindowRgn倒是不会闪烁,但是对于复杂形状会比较麻烦,比如文字窗体。文字窗体虽然可以通过文字的路径转换成窗口边界,但是你如果希望得到良好效果的话,需要对文字进行反锯齿处理。
最好的方法是在DX表面直接绘制你的窗体。

作者: alfwolf   发布时间: 2008-10-16

SetLayeredWindowAttributes可以设置某种颜色为透明啊,在这里你只要设置对话框的背景色为透明即可,但你要保留的线条不能是对话框的背景色。

作者: E_xplorer   发布时间: 2008-10-17

你说的那个函数我在使用,应该在SetLayeredWindowAttributes使窗体背景透明后 能使异形线条显示出来,
我也这么期待,虽然后期我那个线条是可移动的,但现在的问题是 SetWindowRgn 函数编译出错,说不是三个
参数,其实查询得到都是三个参数的,不知道你使用的时候有没有发现这个错误啊。

作者: yiwan209   发布时间: 2008-10-17

引用 5 楼 yiwan209 的回复:
你说的那个函数我在使用,应该在SetLayeredWindowAttributes使窗体背景透明后 能使异形线条显示出来,
我也这么期待,虽然后期我那个线条是可移动的,但现在的问题是 SetWindowRgn 函数编译出错,说不是三个
参数,其实查询得到都是三个参数的,不知道你使用的时候有没有发现这个错误啊。

知道了 这个函数在API下是两个参数 在MFC下封装的只有两个参数,我现在已经不在使用这个异形线条办法来实现
我的要求了 因为这个SetWindowRgn 里 HRGN类成员里没有直线函数,有椭圆和矩形的

我现在在使用E_xplorer 介绍的办法,SetLayeredWindowAttributes可以设置某种颜色为透明啊,在这里你只要设置对话框的背景色为透明即可。
实验下 现在出在得到背景颜色的点上了。
欢迎大家一起来讨论

作者: yiwan209   发布时间: 2008-10-17

要实现很简单也很复杂,用UpdateLayeredWindow代替SetLayeredWindowAttributes, 然后提供一幅32bit的图片作为透明度的mask, 窗体其他位置设置透明度,线所在的位置设为不透明。 如果线改变的话则重新生成或改变mask图然后再次调用UpdateLayeredWindow.

作者: Idle_   发布时间: 2008-10-17

搜索到这里有个大侠这么搞过
他的代码和解释如下:

一个对话框 
想把指定的颜色的窗口背景透明掉 

void CtestmfcDlg::OnBnClickedOk() 

HDC dc = ::GetDC(this-> m_hWnd); 
COLORREF cref = ::GetBkColor(dc); 

//SetBkMode(dc,TRANSPARENT) ;  
SetWindowLong(this-> m_hWnd , GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED); 

::SetLayeredWindowAttributes(this-> m_hWnd ,cref , 127 , LWA_COLORKEY); 


这样总是不成功 但改改可以把整个窗体给透明了 
请问 我想把窗口的背景色透明了该怎么做

后来他解决了 这么说的:已解决 取背景色出错

请问上面代码有什么错的地方么,我现在不要解决透明后线条的移动问题,
现在首先要解决的是先把背景透明了线条和按钮显示出来先的问题,
请大家帮着一起看看上面的代码 那是能实现的 就是取背景色出了点问题造成的。

作者: yiwan209   发布时间: 2008-10-17

楼主的问题我解决了,下面是效果图:

文章地址:
http://blog.csdn.net/Tinary3v0/archive/2008/10/19/3097884.aspx
下载实例地址:
http://download.csdn.net/source/700104

记住到文章中去看缺点和注意事项。

作者: Tinary3v0   发布时间: 2008-10-20

楼主给的程序应该是GetBkColor(dc)获得的并不是真正的背景色。
我觉得既然是自己的窗口,那么设定自己想的背景色就好了,一般设为RGB(255, 0, 255),这个颜色在任何图像中几乎不会用到.

作者: E_xplorer   发布时间: 2008-10-20

我想给分给 Tinary3v0 怎么给啊

作者: yiwan209   发布时间: 2008-11-11

楼主能不能把代码发给我一份啊,CSDN上资源分太多了,我的不够

[email protected]

作者: liaoxiuhua   发布时间: 2009-02-01

楼主也请直接给我一份可以么, 
[email protected]
谢谢!

作者: tzq861212   发布时间: 2009-05-24

真的很好

作者: jiwangzi   发布时间: 2009-08-27

这里有一例设置更为简便的方法
http://download.csdn.net/source/2375702

作者: china0451   发布时间: 2010-05-20

我没积分呼

作者: toyuk   发布时间: 2010-06-01

支持下,

作者: jic5566   发布时间: 2011-11-27