各位大虾,小弟请教一个透明控件的问题:
    我想在窗体上怎样实现的控件透空,怎么实现?
  
    我的窗口上有图片,自己写的控件上也有图片,当把控件加载到窗体上的时候  可以透明的看到下面的图片,而不是完全遮盖住下面窗体上的图片!    不知道怎么做,各位大虾能否提供点建议,或者有源码,小弟将感激不尽!

解决方案 »

  1.   

    但是我不会.net啊有人知道怎么做吗?
      

  2.   

    这个不要用控件,用AlphaBlend函数可以做到
      

  3.   

    谢谢您!我找到了相关的函数,
    在窗体上是很好用的
    至于在控件中,我还没有试呢
    我想应该可以的!
    另外,我这里可以把相关的东西,写给所有能看到这个帖子的人!
    AlphaBlend 函数功能:该函数用来显示透明或半透明像素的位图。 函数原型:AlphaBlend(HDC hdcDest, int nXOriginDest, int YoriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BLENDFUNCTION blendFunction); 参数: 
    hdcDest:指向目标设备环境的句柄。 
    nXOriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。 
    nYOriginDest:指定目标矩形区域克上角的Y轴会标,按逻辑单位。 
    nWidthDest:指定目标矩形区域的宽度,按逻辑单位。 
    hHeightDest:指向目标矩形区高度的句柄,按逻辑单位。 
    hdcSrc:指向源设备环境的句柄。 
    nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。 
    nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。 
    nWidthSrc:指定源矩形区的宽度,按逻辑单位。 
    nHeightSrc:指定源矩形区域 的高度,按逻辑单位。 
    blendFunction:每时定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。 返回值:如果函数执行成功,那么返回值为TRUE,如果函数执行失败,那么回值为FALSE。Windows NT:若想获取更多错误信息,请调用GetLastError函数。 备注:如果源矩形区域目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标将使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位的色彩格式不相同,那么AlphaBlend将源位图转换以匹配目标位图。 
    AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。 速查:Windows NT:5.0级以上版本;Windows:98级以上版本;Windows CE:不支持;头文件:wingdi.h;库文件:作为一个资源包含在msimg32.dll中。
      

  4.   

    另外在此我转载一个高手之做!
    为了版权之鉴,我把原作和出处都附带!利用api函数实现图像淡入淡出效果
    TechnoFantasy    原作
        一般传统的实现两个picturebox之间图像的淡入淡出效果都需要使用大量的api函数并进行复杂的调色板以及
    绘图设备(device context)的操作。但是在win98、win2000中,微软提供了支持透明图像拷贝的alphablend函数。
    这篇文章就介绍如何通过api函数alphablend实现picturebox之间图像的淡入淡出效果。alphablend函数的定义在
    msimg32.dll中,一般win98、win2000都带了这个库,在编程之前你可以先察看一下该文件是否存在。
        打开vb建立一个新工程。选择菜单 project | add module 添加一个模块到工程中,在其中输入以下代码:
    public type rblendprops
        tblendop as byte
        tblendoptions as byte
        tblendamount as byte
        talphatype as byte
    end type
    public declare function alphablend lib "msimg32" (byval hdestdc as long, _
            byval x as long, byval y as long, byval nwidth as long, _
            byval nheight as long, byval hsrcdc as long, _
            byval xsrc as long, byval ysrc as long, byval widthsrc as long, _
            byval heightsrc as long, byval blendfunct as long) as boolean
    public declare sub copymemory lib "kernel32" alias "rtlmovememory" _
            (destination as any, source as any, byval length as long)
        大家可以看到,alphablend函数的定义同普通的复制函数bitblt很相似,只是最后的参数blendfunct定义为一个
    rblendprops结构。那么为什么在函数定义中blendfunct 定义为long类型呢?因为rblendprops结构长度是4个字节。
    而long类型变量的长度也是4个字节,那么我们就可以程序中通过api函数copymemory将一个rblendprops结构拷贝到
    blendfunct 中。
        在form1中添加两个picturebox控件,其中picture2为源,picture1为拷贝目标,将两者的scalemode都设置为3-pixel
    将两者的autoredraw属性都设置为true,然后分别添加图像。在加入一个timer控件以及一个commandbutton控件,然后
    在form1的代码窗口中添加如下代码:
    dim ltime as byte
    sub showtransparency(csrc as picturebox, cdest as picturebox, _
        byval nlevel as byte)
        dim lrprops as rblendprops
        dim lnblendptr as long
        
        cdest.cls
        lrprops.tblendamount = nlevel
        copymemory lnblendptr, lrprops, 4
        with csrc
            alphablend cdest.hdc, 0, 0, .scalewidth, .scaleheight, _
                .hdc, 0, 0, .scalewidth, .scaleheight, lnblendptr
        end with
        cdest.refresh
    end sub
    private sub command1_click()   
        ltime = 0
        timer1.interval = 100
        timer1.enabled = true
    end sub
    private sub timer1_timer()
        ltime = ltime + 1
        showtransparency picture2, picture1, ltime
        if ltime >= 255 then
            timer1.enabled = false
        end if
        me.caption = str(int(ltime / 2.55)) + "%"
    end sub
        运行程序,点击command1,就可以看到picture2图像拷贝到picture1上的淡入淡出效果了。
        在结构rblendprops中,最重要的参数就是tblendamount,该值决定了源与目标之间的透明程序。如果为0的话,源完全
    透明,如果为255的话,源完全覆盖目标。
        另外alphablend 函数不只用于两个picturebox之间的拷贝,而且可以在两个device context之间的透明拷贝,也就是
    说,象窗口等控件之间也可以实现透明效果。不过在编程过程中发现一个问题,不知是否是alphablend的bug,就是在我写完
    程序后,并没有出现透明复制的效果。搞的我以为该函数不起作用,但是当我再打开vb运行上面的程序后,一切有正常了。
    我在msdn上也没有找到相关的bug列表。
    www.applevb.com
      

  5.   

    在用的时候以上程序有点问题,我重新修改了部分内容,加了一些东西,
    实现两个图片可以互相替换!
    渐变过程!模块中:Public Type rblendprops
        tblendop As Byte
        tblendoptions As Byte
        tblendamount As Byte
        talphatype As Byte
    End Type
    'Public Declare Function alphablend Lib "msimg32" (ByVal hdestdc As Long, _
            ByVal x As Long, ByVal y As Long, ByVal nwidth As Long, _
            ByVal nheight As Long, ByVal hsrcdc As Long, _
            ByVal xsrc As Long, ByVal ysrc As Long, ByVal widthsrc As Long, _
            ByVal heightsrc As Long, ByVal blendfunct As Long) As Boolean
            
    Public Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _
            ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
            ByVal nHeight As Long, ByVal hSrcDC As Long, _
            ByVal xSrc As Long, ByVal ySrc As Long, ByVal widthSrc As Long, _
            ByVal heightSrc As Long, ByVal blendFunct As Long) As BooleanPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
            (Destination As Any, Source As Any, ByVal Length As Long)窗体:
    Dim ltime As Byte
    Dim num As Integer
    Dim Sign As Boolean
    Sub showtransparency(csrc As PictureBox, cdest As PictureBox, _
        ByVal nlevel As Byte)
        Dim lrprops As rblendprops
        Dim lnblendptr As Long
        
        cdest.Cls
        lrprops.tblendamount = nlevel
        CopyMemory lnblendptr, lrprops, 4
        With csrc
            AlphaBlend cdest.hDC, 0, 0, .ScaleWidth, .ScaleHeight, _
                .hDC, 0, 0, .ScaleWidth, .ScaleHeight, lnblendptr
        End With
        cdest.Refresh
    End Sub
    Private Sub command1_click()
        ltime = 0
        num = 1
        Sign = False
        Timer1.Interval = 50
        Timer1.Enabled = True
        
    End SubPrivate Sub Command2_Click()
        End
    End SubPrivate Sub Form_Load()
    Picture1.Picture = LoadPicture(App.Path & "\4.jpg")
    Picture2.Picture = LoadPicture(App.Path & "\3.jpg")
    End SubPrivate Sub timer1_timer()    ltime = ltime + num
        If Sign = False Then
            showtransparency Picture1, Picture2, ltime
        ElseIf Sign = Not False Then
            showtransparency Picture2, Picture1, ltime
        End If
            If Sign = False Then
                Picture1.Visible = False
                Picture2.Visible = True
            Else
                Picture1.Visible = True
                Picture2.Visible = False
            End If
        If ltime >= 255 Or ltime <= 0 Then
            Sign = Not Sign
            num = -num
            If Sign = False Then
                Picture1.Visible = False
                Picture2.Visible = True
                Picture1.Picture = LoadPicture(App.Path & "\4.jpg")
                Picture2.Picture = LoadPicture(App.Path & "\3.jpg")
            Else
                Picture1.Picture = LoadPicture(App.Path & "\3.jpg")
                Picture2.Picture = LoadPicture(App.Path & "\4.jpg")
            End If
        End If
        Me.Caption = "透明度:" & Str(Int(ltime / 2.55)) + "%"
    End Sub
      

  6.   

    把自己控件上的 MaskColor=“图片背景色”
    ,并且 BackStyle=0
      

  7.   

    用 BitBlt API 函数,把窗体 DC 相应的部分绘制到控件DC 上。
    Declare Function BitBlt Lib "gdi32" ( _ ByVal hDestDC As Long, _ ByVal x As Long, _ ByVal y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As RasterOps _ ) As Long  Public Enum RasterOps
     ' Copies the source bitmap to destination bitmap
     SRCCOPY = &HCC0020 '
     ' Combines pixels of the destination with source bitmap using the Boolean AND operator.
     SRCAND = &H8800C6 '
     ' Combines pixels of the destination with source bitmap using the Boolean XOR operator. 
     SRCINVERT = &H660046 '
     ' Combines pixels of the destination with source bitmap using the Boolean OR operator.
     SRCPAINT = &HEE0086 '
     ' Inverts the destination bitmap and then combines the results with the source bitmap
     ' using the Boolean AND operator.
     SRCERASE = &H4400328 '
     ' Turns all output white.
     WHITENESS = &HFF0062 '
     ' Turn output black.
     BLACKNESS = &H42 
    End Enum   
    透明使用 SRCCOPY 参数,半透明使用 SRCINVERT。