一个主对话框,响应一定的菜单消息,就弹出一个子对话框。。
    
    首先这个子对话框要是全透明,不能遮挡后面主对话框的图案。    其次这个子对话框上面也有一些简单的有颜色的几何图案线条,在子对话框非线条区域全透明的情况下,这些线条需要清晰可见不透明。    然后这个子对话框上全部范围内需要响应鼠标的各种操作,比如拖动,拉伸,左右键弹出菜单等。。    因为我用SetLayeredWindowAttributes实现全透明的话,有两种情况,一种是上面的线条也跟着全透明了,子对话框相当于全部消失。。
    还一种就是线条清晰可见,非线条区域实现了全透明但是全透明区域也就无法响应当前对子对话框的鼠标响应除非在狭窄的线条区域内,仍可以响应鼠标消息但操作起来就很不方便。。    所以请问各位好心大牛如何制作一个有简单背景线条,可全范围响应鼠标消息的全透明对话框呢???

解决方案 »

  1.   

    先做个透明的窗口,然后hook鼠标消息吧
      

  2.   

    一个窗体是肯定不行的这样看看是否可行:
    1、子对话框本身全透明
    2、带颜色的线条部分是属于子对话框的控件(类似button之类的子区域)、然后根据你的线条设定子区域的有效范围(setwindowrgn、参照绘制不规则区域的方法)ps:这种方法首先你的彩色线条是不能变化的太快的、不然随时setwindowrgn会让你的程序很慢...
      

  3.   

    上次貌似看到过有牛这么解决的USER32.DLL中的SetLayeredWindowWS_EX_LAYERED   =   0x80000;  
    LWA_ALPHA   =   0x2;  
    LWA_COLORKEY=0x1    
    其中dwFlags有LWA_ALPHA和LWA_COLORKEY  
    LWA_ALPHA被设置的话,通过bAlpha决定透明度.  
    LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.  
       
    ALPHA通道和COLORKEY共用,把不想要的部分全画上一种颜色(COLORKEY)貌似这个才是正解
      

  4.   


    我现在就是用的这个技术啊。。LWA_ALPHA与LWA_COLORKEY搭配取值我前面说了嘛,做成全透明效果,有两种情况,一种是线条也跟着透明了,就是什么都看不见还一种是线条清晰,但是全透明区域却无法响应鼠标消息了。
      

  5.   


    对啊,这样很简单啊。Hook所有的鼠标消息,然后判断鼠标位置,如果在透明对话框范围内的话,就转发给透明对话框,不在透明对话框范围内就放行。
      

  6.   


    请问楼主,使用LWA_COLORKEY时你使用的是哪种颜色使对话框背景透明的?