?? modapi.bas
字號:
Attribute VB_Name = "modAPI"
'===Types=============================================================================================================
Public Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As Long, ByRef lpRect As RECT) As Long
Public Type POINTAPI
X As Long
Y As Long
End Type
Public Type RECT
Left As Long
Top As Long
Right As Long
bottom As Long
End Type
Public Type TRIVERTEX
X As Long
Y As Long
Red As Integer
Green As Integer
Blue As Integer
Alpha As Integer
End Type
Public Type GRADIENT_RECT
UpperLeft As Long
LowerRight As Long
End Type
Public Enum GradientFillRectType
GRADIENT_FILL_RECT_H = 0
GRADIENT_FILL_RECT_V = 1
End Enum
'=CONSTANTES de texte==================================================================================================
Public Const DT_RIGHT = &H2
Public Const DT_LEFT = &H0
Public Const DT_CENTER = &H1
Public Const DT_CALCRECT = &H400
Public Const DT_TOP = &H0
Public Const DT_BOTTOM = &H8
Public Const DT_VCENTER = &H4
Public Const DT_SINGLELINE = &H20
Public Const DT_END_ELLIPSIS = &H8000&
'=API POUR LE DESSIN==================================================================================================
Private Declare Function Rectangle Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function RoundRect Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Public Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function SetWindowRgn Lib "User32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Public Declare Function GradientFillRect Lib "msimg32" Alias "GradientFill" (ByVal hdc As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, pMesh As GRADIENT_RECT, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Public Declare Function GradientFill Lib "msimg32" (ByVal hdc As Long, pVertex As Any, ByVal dwNumVertex As Long, pMesh As Any, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Public Declare Function SetRect Lib "User32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Public Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, _
ByVal nWidth As Long, _
ByVal crColor As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
Public Declare Function GetCurrentObject Lib "gdi32" (ByVal hdc As Long, ByVal uObjectType As Long) As Long
Public Declare Function PaintRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long) As Long
Public Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, _
ByVal X As Long, _
ByVal Y As Long, _
lpPoint As POINTAPI) As Long
Public Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, _
ByVal X As Long, _
ByVal Y As Long) As Long
Public Declare Function OleTranslateColor Lib "olepro32.dll" (ByVal OLE_COLOR As Long, _
ByVal HPALETTE As Long, _
pccolorref As Long) As Long
Public Declare Function FillRect Lib "User32" (ByVal hdc As Long, _
lpRect As RECT, _
ByVal hBrush As Long) As Long
Public Declare Function DrawText Lib "User32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
'Public Declare Function InvalidateRect Lib "user32" (ByVal hwnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long
Public Declare Function GetCursorPos Lib "User32" (lpPoint As POINTAPI) As Long
Public Declare Function ScreenToClient Lib "User32" (ByVal hWnd As Long, lpPoint As POINTAPI) As Long
Public Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function GetGDIObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Function OffsetRect Lib "User32" (lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
' *************************************
' * CONSTANTS *
' *************************************
Private Const API_DIB_RGB_COLORS As Long = 0
' *************************************
' * TYPES *
' *************************************
Public Type tpAPI_RECT ' NEVER ever use 'Left' or 'Right' as names in a udt!
lLeft As Long ' You run into trouble with the VB build-in functions for
lTop As Long ' string/variant handling (Left() and Right(). And this
lRight As Long ' strange effects and error messages are really hard to debug ... ;(
lBottom As Long
End Type
Private Type tpBITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
' *************************************
' * API DECLARES *
' *************************************
Private Declare Function API_StretchDIBits Lib "gdi32" Alias "StretchDIBits" _
(ByVal hdc As Long, _
ByVal X As Long, _
ByVal Y As Long, _
ByVal dx As Long, _
ByVal dy As Long, _
ByVal SrcX As Long, _
ByVal SrcY As Long, _
ByVal wSrcWidth As Long, _
ByVal wSrcHeight As Long, _
lpBits As Any, _
lpBitsInfo As tpBITMAPINFOHEADER, _
ByVal wUsage As Long, _
ByVal dwRop As Long) As Long
'
'
'
Public Sub DrawTopDownGradient(hdc As Long, rc As tpAPI_RECT, ByVal lRGBColorFrom As Long, ByVal lRGBColorTo As Long)
Dim uBIH As tpBITMAPINFOHEADER
Dim lBits() As Long
Dim lColor As Long
Dim X As Long
Dim Y As Long
Dim xEnd As Long
Dim yEnd As Long
Dim ScanlineWidth As Long
Dim yOffset As Long
Dim r As Long
Dim G As Long
Dim B As Long
Dim end_R As Long
Dim end_G As Long
Dim end_B As Long
Dim dR As Long
Dim dG As Long
Dim dB As Long
' Split a RGB long value into components - FROM gradient color
lRGBColorFrom = lRGBColorFrom And &HFFFFFF ' "SplitRGB" by www.Abstractvb.com
r = lRGBColorFrom Mod &H100& ' Should be the fastest way in pur VB
lRGBColorFrom = lRGBColorFrom \ &H100& ' See test on VBSpeed (http://www.xbeat.net/vbspeed/)
G = lRGBColorFrom Mod &H100& ' Btw: API solution with RTLMoveMem is slower ... ;)
lRGBColorFrom = lRGBColorFrom \ &H100&
B = lRGBColorFrom Mod &H100&
' Split a RGB long value into components - TO gradient color
lRGBColorTo = lRGBColorTo And &HFFFFFF
end_R = lRGBColorTo Mod &H100&
lRGBColorTo = lRGBColorTo \ &H100&
end_G = lRGBColorTo Mod &H100&
lRGBColorTo = lRGBColorTo \ &H100&
end_B = lRGBColorTo Mod &H100&
'-- Loops bounds
xEnd = rc.lRight - rc.lLeft
yEnd = rc.lBottom - rc.lTop
' Check: Top lower than Bottom ?
If yEnd < 1 Then
Exit Sub
End If
'-- Scanline width
ScanlineWidth = xEnd + 1
yOffset = -ScanlineWidth
'-- Initialize array size
ReDim lBits((xEnd + 1) * (yEnd + 1) - 1) As Long
'-- Get color distances
dR = end_R - r
dG = end_G - G
dB = end_B - B
'-- Gradient loop over rectangle
For Y = 0 To yEnd
'-- Calculate color and *y* offset
lColor = B + (dB * Y) \ yEnd + 256 * (G + (dG * Y) \ yEnd) + 65536 * (r + (dR * Y) \ yEnd)
yOffset = yOffset + ScanlineWidth
'-- *Fill* line
For X = yOffset To xEnd + yOffset
lBits(X) = lColor
Next X
Next Y
'-- Prepare bitmap info structure
With uBIH
.biSize = Len(uBIH)
.biBitCount = 32
.biPlanes = 1
.biWidth = xEnd + 1
.biHeight = -yEnd + 1
End With
'-- Finaly, paint *bits* onto given DC
API_StretchDIBits hdc, _
rc.lLeft, rc.lTop, _
xEnd, yEnd, _
0, 0, _
xEnd, yEnd, _
lBits(0), _
uBIH, _
API_DIB_RGB_COLORS, _
vbSrcCopy
End Sub
' #*#
'[APIs]
'[This function will set your form smoothly curved ]
'=============================================================
Public Sub SmoothForm(Frm As Form, Optional ByVal Curvature As Double = 25)
Dim hRgn As Long
Dim X1 As Long, Y1 As Long
X1 = Frm.Width / Screen.TwipsPerPixelX
Y1 = Frm.Height / Screen.TwipsPerPixelY
hRgn = CreateRoundRectRgn(0, 0, X1, Y1, Curvature, Curvature)
SetWindowRgn Frm.hWnd, hRgn, True
DeleteObject hRgn
End Sub
'=============================================================
'dessine la bordure
Public Sub UtilDrawShapeStyle(ByVal lngHdc As Long, _
ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long, _
ByVal radius As Long)
RoundRect lngHdc, X1, Y1, X2, Y2, radius, radius
End Sub
'remplissage arr plan
Public Sub UtilDrawBackground(ByVal lngHdc As Long, _
ByVal colorStart As Long, _
ByVal colorEnd As Long, _
ByVal lngLeft As Long, _
ByVal lngTop As Long, _
ByVal lngWidth As Long, _
ByVal lngHeight As Long, _
Optional ByVal horizontal As Long = 0)
Dim tR As RECT
With tR
.Left = lngLeft
.Top = lngTop
.Right = lngWidth 'lngLeft + lngWidth
.bottom = lngHeight 'lngTop + lngHeight
' gradient fill vertical:
End With 'tR
GradientFillRectB lngHdc, tR, colorStart, colorEnd, IIf(horizontal = 0, GRADIENT_FILL_RECT_H, GRADIENT_FILL_RECT_V)
End Sub
Private Sub GradientFillRectB(ByVal lhdc As Long, _
tR As RECT, _
ByVal oStartColor As OLE_COLOR, _
ByVal oEndColor As OLE_COLOR, _
ByVal eDir As GradientFillRectType)
Dim tTV(0 To 1) As TRIVERTEX
Dim tGR As GRADIENT_RECT
Dim hBrush As Long
Dim lStartcolor As Long
Dim lEndColor As Long
'Dim lR As Long
' Use GradientFill:
If Not (HasGradientAndTransparency) Then
lStartcolor = TranslateColor(oStartColor)
lEndColor = TranslateColor(oEndColor)
setTriVertexColor tTV(0), lStartcolor
tTV(0).X = tR.Left
tTV(0).Y = tR.Top
setTriVertexColor tTV(1), lEndColor
tTV(1).X = tR.Right
tTV(1).Y = tR.bottom
tGR.UpperLeft = 0
tGR.LowerRight = 1
GradientFill lhdc, tTV(0), 2, tGR, 1, eDir
Else
' Fill with solid brush:
hBrush = CreateSolidBrush(TranslateColor(oEndColor))
FillRect lhdc, tR, hBrush
DeleteObject hBrush
End If
End Sub
Private Function TranslateColor(ByVal oClr As OLE_COLOR, _
Optional hPal As Long = 0) As Long
' Convert Automation color to Windows color
'--------- Drawing
If OleTranslateColor(oClr, hPal, TranslateColor) Then
TranslateColor = CLR_INVALID
End If
End Function
Private Sub setTriVertexColor(tTV As TRIVERTEX, _
ByVal lColor As Long)
Dim lRed As Long
Dim lGreen As Long
Dim lBlue As Long
lRed = (lColor And &HFF&) * &H100&
lGreen = (lColor And &HFF00&)
lBlue = (lColor And &HFF0000) \ &H100&
With tTV
setTriVertexColorComponent .Red, lRed
setTriVertexColorComponent .Green, lGreen
setTriVertexColorComponent .Blue, lBlue
End With 'tTV
End Sub
Private Sub setTriVertexColorComponent(ByRef iColor As Integer, _
ByVal lComponent As Long)
If (lComponent And &H8000&) = &H8000& Then
iColor = (lComponent And &H7F00&)
iColor = iColor Or &H8000
Else
iColor = lComponent
End If
End Sub
Public Property Get dBlendColor(ByVal oColorFrom As OLE_COLOR, _
ByVal oColorTo As OLE_COLOR, _
Optional ByVal Alpha As Long = 128) As Long
Dim lSrcR As Long
Dim lSrcG As Long
Dim lSrcB As Long
Dim lDstR As Long
Dim lDstG As Long
Dim lDstB As Long
Dim lCFrom As Long
Dim lCTo As Long
lCFrom = TranslateColor(oColorFrom)
lCTo = TranslateColor(oColorTo)
lSrcR = lCFrom And &HFF
lSrcG = (lCFrom And &HFF00&) \ &H100&
lSrcB = (lCFrom And &HFF0000) \ &H10000
lDstR = lCTo And &HFF
lDstG = (lCTo And &HFF00&) \ &H100&
lDstB = (lCTo And &HFF0000) \ &H10000
dBlendColor = RGB(((lSrcR * Alpha) / 255) + ((lDstR * (255 - Alpha)) / 255), ((lSrcG * Alpha) / 255) + ((lDstG * (255 - Alpha)) / 255), ((lSrcB * Alpha) / 255) + ((lDstB * (255 - Alpha)) / 255))
End Property
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -