Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd _
    As Long, lpRECT As RECT) As Long
Private Declare Function GetClientRect Lib "user32" (ByVal hWnd _
    As Long, lpRECT As RECT) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _
    As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, _
    ByVal nCombineMode As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As _
    Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) _
    As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd _
    As Long, lpPoint As POINTAPI) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As _
    Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As LongConst RGN_XOR = 3Private Type POINTAPI
    x As Long
    Y As Long
End TypePrivate Type RECT
    Left As Long
    Top As Long
    Right As Long
    Bottom As Long
End TypePrivate rctClient As RECT, rctFrame As RECT
Private hClient As Long, hFrame As LongPublic Sub MakeTransparent(frm As Form)
    GetFrameClientRgn frm
    SetWindowRgn frm.hWnd, hFrame, True
End SubPrivate Sub GetFrameClientRgn(frm As Form)
    GetWindowRect frm.hWnd, rctFrame
    GetClientRect frm.hWnd, rctClient    '将窗口矩形坐标转换为屏幕坐标
    Dim lpTL As POINTAPI, lpBR As POINTAPI
    lpTL.x = rctFrame.Left
    lpTL.Y = rctFrame.Top
    lpBR.x = rctFrame.Right
    lpBR.Y = rctFrame.Bottom
    ScreenToClient frm.hWnd, lpTL
    ScreenToClient frm.hWnd, lpBR
    rctFrame.Left = lpTL.x
    rctFrame.Top = lpTL.Y
    rctFrame.Right = lpBR.x
    rctFrame.Bottom = lpBR.Y
    rctClient.Left = Abs(rctFrame.Left)
    rctClient.Top = Abs(rctFrame.Top)
    rctClient.Right = rctClient.Right + Abs(rctFrame.Left)
    rctClient.Bottom = rctClient.Bottom + Abs(rctFrame.Top)
    rctFrame.Right = rctFrame.Right + Abs(rctFrame.Left)
    rctFrame.Bottom = rctFrame.Bottom + Abs(rctFrame.Top)
    rctFrame.Top = 0
    rctFrame.Left = 0    hClient = CreateRectRgn(rctClient.Left, rctClient.Top, _
    rctClient.Right, rctClient.Bottom)
    hFrame = CreateRectRgn(rctFrame.Left, rctFrame.Top, _
    rctFrame.Right, rctFrame.Bottom)    CombineRgn hFrame, hClient, hFrame, RGN_XOR
End SubPrivate Sub Form_Resize()
    MakeTransparent Me
End Sub

解决方案 »

  1.   

    to Jneu(沧海桑田):看不懂啊,透明色在那里呀!
      

  2.   

    http://swordgrass.myrice.com
    这里有。
      

  3.   

    ========在win2000下有效===========Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    '其中hwnd是透明窗体的句柄,crKey为颜色值,bAlpha是透明度,
    '取值范围是[0,255],dwFlags是透明方式,可以取两个值:当取值为LWA_ALPHA时,
    'crKey参数无效,bAlpha参数有效;当取值为LWA_COLORKEY时,bAlpha参数有效而
    '窗体中的所有颜色为crKey的地方将变为透明--这个功能很有用:我们不必再为建立
    '不规则形状的窗体而调用一大堆区域分析、创建、合并函数了,只需指定透明处的颜色'
    '值即可,哈哈哈哈!请看具体代码。
    Private Const WS_EX_LAYERED = &H80000
    Private Const GWL_EXSTYLE = (-20)
    Private Const LWA_ALPHA = &H2
    Private Const LWA_COLORKEY = &H1
    '代码一: 一个半透明窗体
    Private Sub Form_Load()
        Dim rtn As Long
        rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
        rtn = rtn Or WS_EX_LAYERED
        SetWindowLong hwnd, GWL_EXSTYLE, rtn
        SetLayeredWindowAttributes hwnd, 0, 200, LWA_ALPHA
    End Sub'代码二: 形状不规则的窗体
    'Private Sub Form_Load()
    '    Dim rtn As Long
    '    BorderStyler = 0
    '    rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
    '    rtn = rtn Or WS_EX_LAYERED
    '    SetWindowLong hwnd, GWL_EXSTYLE, rtn
    '    SetLayeredWindowAttributes hwnd, &H80C0FF, 0, LWA_COLORKEY    '将扣去窗口中的蓝色
    'End Sub
    '
      

  4.   

    好说,下载LYFTOOLS控件,有这个属性
      

  5.   

    API函数SetLayeredWindowAttributes 在W98下没有
    所以不行