找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 20|回复: 2

淡入淡出按钮实现bbtn

[复制链接]
发表于 昨天 15:31 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
VERSION 5.00
Begin VB.UserControl BBtn
   AutoRedraw      =   -1  'True
   ClientHeight    =   2295
   ClientLeft      =   0
   ClientTop       =   0
   ClientWidth     =   4950
   ScaleHeight     =   153
   ScaleMode       =   3  'Pixel
   ScaleWidth      =   330
   Begin VB.Timer TBlend
      Enabled         =   0   'False
      Interval        =   33
      Left            =   2880
      Top             =   1680
   End
   Begin VB.Timer Tout
      Enabled         =   0   'False
      Interval        =   100
      Left            =   2880
      Top             =   960
   End
End
Attribute VB_Name = "BBtn"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = False
Option Explicit
'作者:夏煜 【Email:imperialeast@126.com QQ:499932452】

Private Type BLENDFUNCTION
    BlendOp As Byte
    BlendFlags As Byte
    SourceConstantAlpha As Byte ' 透明度:0=全透,255=不透明
    AlphaFormat As Byte
End Type

Private Declare Sub RtlMoveMemory Lib "kernel32.dll" (Destination As Any, Source As Any, ByVal length As Long)
Private Declare Function AlphaBlend Lib "Msimg32.dll" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal hdcSrc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal cxSrc As Long, ByVal cySrc As Long, ByVal BLENDFUNCTION As Long) As Long

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Private 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 Long) As Long

Private Type BITMAP
    bmType As Long
    bmWidth As Long       ' 像素宽度
    bmHeight As Long      ' 像素高度
    bmWidthBytes As Long
    bmPlanes As Integer
    bmBitsPixel As Integer
    bmBits As Long
End Type

Private Type POINTAPI
       X As Long
       Y As Long
End Type

Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function ScreenToClient Lib "user32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Public CircleChk As Boolean

Public Event Click()

Dim BlendVal       As Byte
Dim Pmove          As Boolean
Dim lFlags         As Byte
Dim m_Picture      As StdPicture
Dim height         As Long
Dim width          As Long

Public Property Get hDC() As Long
   hDC = UserControl.hDC
End Property

Public Property Get hWnd() As Long
   hWnd = UserControl.hWnd
End Property


Sub DrawNor()
Dim Bmp As BITMAP
If m_Picture Is Nothing Then Exit Sub
  GetObject m_Picture.handle, Len(Bmp), Bmp
  height = Bmp.bmHeight
  width = Bmp.bmWidth
  UserControl.width = (width / 4) * Screen.TwipsPerPixelX
  UserControl.height = height * Screen.TwipsPerPixelY
End Sub

Sub DoDraw(ByVal BlendVal As Byte, Optional ByVal flags As Byte = 0)
Dim mDC As Long, mBmp As Long, OldBmp As Long, ResDC As Long, ResBmp As Long, Blen As BLENDFUNCTION, lBF As Long
  If m_Picture Is Nothing Then Exit Sub
  mDC = CreateCompatibleDC(UserControl.hDC)
  mBmp = CreateCompatibleBitmap(UserControl.hDC, width / 4, height)
  OldBmp = SelectObject(mDC, mBmp)
  ResDC = CreateCompatibleDC(UserControl.hDC)
  ResBmp = SelectObject(ResDC, m_Picture.handle)
  With Blen
       .AlphaFormat = 0
       .BlendFlags = 0
       .BlendOp = 0
       .SourceConstantAlpha = BlendVal
   End With
   UserControl.Refresh
  Select Case flags
         
         Case 0    'normal
                 If BlendVal < 255 Then
                    BitBlt mDC, 0, 0, width / 4, height, ResDC, 0, 0, vbSrcCopy
                    SelectObject ResDC, ResBmp
                    DeleteDC ResDC
                    RtlMoveMemory lBF, Blen, 4
                    AlphaBlend hDC, 0, 0, width / 4, height, mDC, 0, 0, width / 4, height, lBF
                  Else
                    UserControl.Cls
                    BitBlt mDC, 0, 0, width / 4, height, ResDC, 0, 0, vbSrcCopy
                    SelectObject ResDC, ResBmp
                    DeleteDC ResDC
                   BitBlt hDC, 0, 0, width / 4, height, mDC, 0, 0, vbSrcCopy
                 End If
         Case 1    'over
                If BlendVal < 255 Then
                    BitBlt mDC, 0, 0, width / 4, height, ResDC, width / 4, 0, vbSrcCopy
                    SelectObject ResDC, ResBmp
                    DeleteDC ResDC
                    RtlMoveMemory lBF, Blen, 4
                    AlphaBlend hDC, 0, 0, width / 4, height, mDC, 0, 0, width / 4, height, lBF
                 Else
                    UserControl.Cls
                    BitBlt mDC, 0, 0, width / 4, height, ResDC, width / 4, 0, vbSrcCopy
                    SelectObject ResDC, ResBmp
                    DeleteDC ResDC
                    BitBlt hDC, 0, 0, width / 4, height, mDC, 0, 0, vbSrcCopy
                End If
               
            
         Case 2    'down
                UserControl.Cls
                BitBlt mDC, 0, 0, width / 4, height, ResDC, width / 2, 0, vbSrcCopy
                SelectObject ResDC, ResBmp
                DeleteDC ResDC
                BitBlt hDC, 0, 0, width / 4, height, mDC, 0, 0, vbSrcCopy
               
         Case 3    'gray not enabled
                BitBlt mDC, 0, 0, width / 4, height, ResDC, width * 3 / 4, 0, vbSrcCopy
                SelectObject ResDC, ResBmp
                DeleteDC ResDC
                BitBlt hDC, 0, 0, width / 4, height, mDC, 0, 0, vbSrcCopy
  End Select
  SelectObject mDC, OldBmp
  DeleteObject mBmp
  DeleteDC mDC
End Sub



Private Sub TBlend_Timer()
BlendVal = BlendVal + 15
DoDraw BlendVal, lFlags
If BlendVal > 150 Then
  BlendVal = 1
  TBlend.Enabled = False
End If
End Sub

Private Function IsMouseOver() As Boolean
    Dim pt As POINTAPI
    GetCursorPos pt
    If CircleChk = False Then
        IsMouseOver = (WindowFromPoint(pt.X, pt.Y) = hWnd) 'RECT
      Else
        ScreenToClient Me.hWnd, pt
       IsMouseOver = IsInCircle(pt.X, pt.Y)                'Circle
    End If
    If IsMouseOver = False Then
      Pmove = False
      lFlags = 0
      BlendVal = 1
      TBlend.Enabled = True
      Tout.Enabled = False
    End If
End Function


Private Sub Tout_Timer()
IsMouseOver
End Sub

Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
  If CircleChk = True Then
    If IsInCircle(X, Y) Then DoDraw 255, 2
    Else
    DoDraw 255, 2
  End If
End If
End Sub

Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Pmove = False Then
  If CircleChk = True Then
     If IsInCircle(X, Y) Then Pmove = True: lFlags = 1: BlendVal = 1: TBlend.Enabled = True: Tout.Enabled = True
     Else
     Pmove = True: lFlags = 1: BlendVal = 1: TBlend.Enabled = True: Tout.Enabled = True
  End If
End If
End Sub

Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If CircleChk = True Then
    If IsInCircle(X, Y) Then DoDraw 255, 1: RaiseEvent Click
    Else
    DoDraw 255, 1: RaiseEvent Click
  End If
End Sub

Private Function IsInCircle(ByVal X As Long, ByVal Y As Long) As Boolean
  Dim R As Long
   If width / 8 <= height / 2 Then
      R = width / 8
     Else
      R = height / 2
   End If
  If (X - width / 8) ^ 2 + (Y - height / 2) ^ 2 < R ^ 2 Then
    IsInCircle = True
     Else
    IsInCircle = False
  End If
End Function



Public Property Set Picture(newp As StdPicture)
   Set m_Picture = newp
    DrawNor
    DoDraw 255
    Pmove = False
   PropertyChanged "Picture"
End Property

Public Property Get Picture() As StdPicture
  Set Picture = m_Picture
End Property


Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  Set Picture = PropBag.ReadProperty("Picture", m_Picture)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
     PropBag.WriteProperty "Picture", m_Picture
End Sub






以下是实例和工程源代码文件

通过网盘分享的文件:淡入淡出.rar
链接: https://pan.baidu.com/s/1Cdka4DjZUIZj88eaacHx3A?pwd=1234 提取码: 1234







屏幕截图 2026-01-29 151614.png
回复

使用道具 举报

 楼主| 发表于 昨天 15:32 | 显示全部楼层
这个是控件实现淡入淡出的button效果
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 昨天 15:35 | 显示全部楼层
图中程序效果,以及程序可以百度网盘下载,不是源码,是程序文件
通过网盘分享的文件:WinAMP(1).rar
链接: https://pan.baidu.com/s/1Y_z--BQxpaeXF8erupYZRg?pwd=1234 提取码: 1234
屏幕截图 2026-01-29 132805.png
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2026-1-30 12:22 , Processed in 0.036209 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表