有解决办法。不过如果你的线条要改变的话,效果就可能不太好。方法是:不要使用 SetLayeredWindowAttributes 函数,而是使用 SetWindowRgn 函数。把你的线条集合作为一个异形窗口的形状,这样天然实现了你想要的最理想的全透明,而且还兼容 Windows 2000 之前的操作系统。

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

    知道了 这个函数在API下是两个参数 在MFC下封装的只有两个参数,我现在已经不在使用这个异形线条办法来实现
    我的要求了 因为这个SetWindowRgn 里 HRGN类成员里没有直线函数,有椭圆和矩形的我现在在使用E_xplorer 介绍的办法,SetLayeredWindowAttributes可以设置某种颜色为透明啊,在这里你只要设置对话框的背景色为透明即可。
    实验下 现在出在得到背景颜色的点上了。
    欢迎大家一起来讨论
      

  6.   

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

  7.   

    搜索到这里有个大侠这么搞过
    他的代码和解释如下:一个对话框 
    想把指定的颜色的窗口背景透明掉 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); 
    } 这样总是不成功     但改改可以把整个窗体给透明了 
    请问   我想把窗口的背景色透明了该怎么做后来他解决了 这么说的:已解决   取背景色出错请问上面代码有什么错的地方么,我现在不要解决透明后线条的移动问题,
    现在首先要解决的是先把背景透明了线条和按钮显示出来先的问题,
    请大家帮着一起看看上面的代码 那是能实现的 就是取背景色出了点问题造成的。
      

  8.   

    楼主的问题我解决了,下面是效果图:文章地址:
    http://blog.csdn.net/Tinary3v0/archive/2008/10/19/3097884.aspx
    下载实例地址:
    http://download.csdn.net/source/700104记住到文章中去看缺点和注意事项。
      

  9.   

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

  10.   

    我想给分给 Tinary3v0  怎么给啊 
      

  11.   

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

  12.   

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

  13.   

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

  14.   

    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的宽高,
      

  15.   

    Alphac.SourceConstantAlpha =0;修改他的赋值改变透明量
      

  16.   

    如果要实现线不透明需要另外建立一个CDC来画线..
    AlphaBlend函数想透明谁就透明谁;
    要先获得要透明窗体的CDC比如透明windows XP 的任务栏
    枚举 任务栏上CDC
    做透明即可