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

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

请问有没有别的方法实现仅对话框背景透明,而其上的线条和按纽是非透明的,感觉SetLayeredWindowAttributes()
函数无法实现我所需要的效果,有没有别的解决办法啊,谢谢了。
...全文
2356 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnmxk 2011-12-14
  • 打赏
  • 举报
回复
看看。。。。。。。。。。。。。
po147159123 2011-11-30
  • 打赏
  • 举报
回复
如果要实现线不透明需要另外建立一个CDC来画线..
AlphaBlend函数想透明谁就透明谁;
要先获得要透明窗体的CDC

比如透明windows XP 的任务栏
枚举 任务栏上CDC
做透明即可
po147159123 2011-11-30
  • 打赏
  • 举报
回复
Alphac.SourceConstantAlpha =0;修改他的赋值改变透明量
po147159123 2011-11-30
  • 打赏
  • 举报
回复
BLENDFUNCTION Alphac;
Alphac.BlendOp = AC_SRC_OVER;
Alphac.BlendFlags = 0;
Alphac.SourceConstantAlpha = 0;
Alphac.AlphaFormat = 0;
CClientDC dc(GetParent());
AlphaBlend(pDC->m_hDC,0,0,btnRect.right,btnRect.bottom,
dc.m_hDC,0,0,btnRect.right,btnRect.bottom,
Alphac);

用AlphaBlend函数吧可以控制明度在0-255范围内。值越大越透明
*pDC是要透明的CDC
dc是背景的CDC

透明单个CDC能实现部分组件透明;

如果透明正个窗体就用
CDC
CClientDC dc=创建一个谦容DC函数(pDC);//串的值是当前
范围是当前CDC的宽高,
jic5566 2011-11-27
  • 打赏
  • 举报
回复
支持下,
toyuk 2010-06-01
  • 打赏
  • 举报
回复
我没积分呼
china0451 2010-05-20
  • 打赏
  • 举报
回复
这里有一例设置更为简便的方法
http://download.csdn.net/source/2375702
jiwangzi 2009-08-27
  • 打赏
  • 举报
回复
真的很好
tzq861212 2009-05-24
  • 打赏
  • 举报
回复
楼主也请直接给我一份可以么,
darryl.tzq@gmail.com
谢谢!
liaoxiuhua 2009-02-01
  • 打赏
  • 举报
回复
楼主能不能把代码发给我一份啊,CSDN上资源分太多了,我的不够

huahuayalin@sohu.com
yiwan209 2008-11-11
  • 打赏
  • 举报
回复
我想给分给 Tinary3v0 怎么给啊
E_xplorer 2008-10-20
  • 打赏
  • 举报
回复
楼主给的程序应该是GetBkColor(dc)获得的并不是真正的背景色。
我觉得既然是自己的窗口,那么设定自己想的背景色就好了,一般设为RGB(255, 0, 255),这个颜色在任何图像中几乎不会用到.
Tinary3v0 2008-10-20
  • 打赏
  • 举报
回复
楼主的问题我解决了,下面是效果图:

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

记住到文章中去看缺点和注意事项。
E_xplorer 2008-10-17
  • 打赏
  • 举报
回复
SetLayeredWindowAttributes可以设置某种颜色为透明啊,在这里你只要设置对话框的背景色为透明即可,但你要保留的线条不能是对话框的背景色。
yiwan209 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);
}

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

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

请问上面代码有什么错的地方么,我现在不要解决透明后线条的移动问题,
现在首先要解决的是先把背景透明了线条和按钮显示出来先的问题,
请大家帮着一起看看上面的代码 那是能实现的 就是取背景色出了点问题造成的。
阿呆_ 2008-10-17
  • 打赏
  • 举报
回复
要实现很简单也很复杂,用UpdateLayeredWindow代替SetLayeredWindowAttributes, 然后提供一幅32bit的图片作为透明度的mask, 窗体其他位置设置透明度,线所在的位置设为不透明。 如果线改变的话则重新生成或改变mask图然后再次调用UpdateLayeredWindow.
yiwan209 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yiwan209 的回复:]
你说的那个函数我在使用,应该在SetLayeredWindowAttributes使窗体背景透明后 能使异形线条显示出来,
我也这么期待,虽然后期我那个线条是可移动的,但现在的问题是 SetWindowRgn 函数编译出错,说不是三个
参数,其实查询得到都是三个参数的,不知道你使用的时候有没有发现这个错误啊。
[/Quote]
知道了 这个函数在API下是两个参数 在MFC下封装的只有两个参数,我现在已经不在使用这个异形线条办法来实现
我的要求了 因为这个SetWindowRgn 里 HRGN类成员里没有直线函数,有椭圆和矩形的

我现在在使用E_xplorer 介绍的办法,SetLayeredWindowAttributes可以设置某种颜色为透明啊,在这里你只要设置对话框的背景色为透明即可。
实验下 现在出在得到背景颜色的点上了。
欢迎大家一起来讨论
yiwan209 2008-10-17
  • 打赏
  • 举报
回复
你说的那个函数我在使用,应该在SetLayeredWindowAttributes使窗体背景透明后 能使异形线条显示出来,
我也这么期待,虽然后期我那个线条是可移动的,但现在的问题是 SetWindowRgn 函数编译出错,说不是三个
参数,其实查询得到都是三个参数的,不知道你使用的时候有没有发现这个错误啊。
alfwolf 2008-10-16
  • 打赏
  • 举报
回复
你的这条路是有问题的,如果你仅仅在视频上方叠加透明窗口的话,你的透明窗口将会产生较强烈的闪烁,视觉效果很差。
SetWindowRgn倒是不会闪烁,但是对于复杂形状会比较麻烦,比如文字窗体。文字窗体虽然可以通过文字的路径转换成窗口边界,但是你如果希望得到良好效果的话,需要对文字进行反锯齿处理。
最好的方法是在DX表面直接绘制你的窗体。
zzz822163 2008-10-16
  • 打赏
  • 举报
回复
http://zhidao.baidu.com/question/12378638.html?fr=qrl
加载更多回复(1)

19,468

社区成员

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

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