Public Declare Function AlphaBlend Lib "msimg32" (ByVal hdcDest As Long, _
ByVal nXOriginDest As Long, ByVal nYOriginDest As Long, _
ByVal nWidthDest As Long, ByVal hHeightDest As Long, _
ByVal hdcSrc As Long, ByVal nXOriginSrc As Long, _
ByVal nYOriginSrc As Long, ByVal nWidthSrc As Long, _
ByVal nHeightSrc As Long, ByVal blendFunc As Long) As Boolean
'以上是module中的声明
'在Pic(1)中画渐变色
Private Sub Command1_Click()
Dim i As Long, j As Long
Pic(1).Cls
For i = 0 To Pic(1).ScaleWidth - 1
For j = 0 To Pic(1).ScaleHeight - 1
Pic(1).PSet (i, j), RGB(Fix(i * 255 / Pic(1).ScaleWidth), _
0, 255 - Fix(j * 255 / Pic(1).ScaleHeight))
Next
Pic(1).Refresh
Next
End Sub
'合并Pic(0)和Pic(1)的图像
Private Sub Command2_Click()
Dim SourceConstantAlpha As Long, r As Byte, StrRes As String
StrRes = InputBox("Give a number from 0 to 255 (the greater the " + _
"value the farest you get from the clouds):", _
"Alpha blend example...", 100)
If StrRes = "" Then Exit Sub
r = CLng(StrRes) Mod 256
SourceConstantAlpha = r * 65536
Pic(0).Cls
Call AlphaBlend(Pic(0).hDC, 0, 0, Pic(0).ScaleWidth, Pic(0).ScaleHeight, _
Pic(1).hDC, 0, 0, Pic(1).ScaleWidth, Pic(1).ScaleHeight, _
SourceConstantAlpha)
Pic(0).Refresh
End Sub
Public Type BITMAPINFOHEADER
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
Public Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Public Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Public 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
Public Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function SetDIBitsToDevice Lib "gdi32" (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 Scan As Long, ByVal NumScans As Long, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage As Long) As Long
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Function ShadeColors(ByVal Dst As Long, ByVal Src As Long, ByVal Shade As Byte)
Select Case Shade
Case 0: ShadeColors = Dst
Case 255: ShadeColors = Src
Case Else:
ShadeColors = (Src And &HFF) * Shade / 255 + (Dst And &HFF) * (255 - Shade) / 255 Or _
((Src And &HFF00&) * Shade / 255 + (Dst And &HFF00&) * (255 - Shade) / 255) And &HFF00& Or _
((Src And &HFF0000) * (Shade / 255) + (Dst And &HFF0000) * ((255 - Shade) / 255)) And &HFF0000
End Select
End Function
Public Function AlphaBlend(ByVal DstDC As Long, ByVal DstX As Long, ByVal DstY As Long, ByVal DstW As Long, ByVal DstH As Long, ByVal SrcDC As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal Alpha As Byte, ByVal TransColor As Long, ByVal Flags As Long) As Long
If Alpha = 0 Or DstW = 0 Or DstH = 0 Then Exit Function
Dim B As Long, H As Long, F As Long, I As Long
Dim TmpDC As Long, TmpBmp As Long, TmpObj As Long
Dim Sr2DC As Long, Sr2Bmp As Long, Sr2Obj As Long
Dim Data1() As Long, Data2() As Long
Dim Info As BITMAPINFO
For H = 0 To DstH - 1
F = H * DstW
For B = 0 To DstW - 1
I = F + B
If (Flags And &H1) And ((Data2(I) And &HFFFFFF) = TransColor) Then
Else
Data1(I) = ShadeColors(Data1(I), Data2(I), Alpha)
End If
Next B
Next H
Erase Data1
Erase Data2
DeleteObject SelectObject(TmpDC, TmpObj)
DeleteObject SelectObject(Sr2DC, Sr2Obj)
DeleteDC TmpDC
DeleteDC Sr2DC
End Function
'----------------------------------------
'窗体中的代码
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 Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim CurX As Single, CurY As Single
Dim WH As Long, WD As Long
Dim TPPX As Integer
Dim TPPY As Integer
Private Sub Form_Load()
Picture3.Picture = LoadPicture("back.bmp")
Width = Picture3.Width
Height = Picture3.Height
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
Picture1_MouseDown Button, Shift, x, y
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Picture1_MouseMove Button, Shift, x, y
End Sub
Private Sub Image1_Click()
Me.WindowState = vbMinimized
End Sub
Private Sub Image2_Click()
Unload Me
End Sub
Private Sub Image3_Click()
MsgBox "Test"
End Sub
Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
If Button = vbLeftButton Then
CurX = x
CurY = y
End If
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim DeltaX As Long, DeltaY As Long
Dim WH As Long, WD As Long
If Button = 1 Then
WH = GetDesktopWindow
WD = GetDC(WH)
DeltaX = x - CurX
DeltaY = y - CurY
BitBlt Picture2.hdc, 0, 0, ScaleWidth \ TPPX, ScaleHeight \ TPPY, Picture2.hdc, DeltaX \ TPPX, DeltaY \ TPPY, vbSrcCopy
If DeltaX > 0 Then
BitBlt Picture2.hdc, (ScaleWidth - DeltaX) \ TPPX, 0, DeltaX \ TPPX, ScaleHeight \ TPPY, WD, (Left + Width) \ TPPX, (Top + DeltaY) \ TPPX, vbSrcCopy
ElseIf DeltaX < 0 Then
BitBlt Picture2.hdc, 0, 0, -DeltaX \ TPPX, ScaleHeight \ TPPY, WD, (Left + DeltaX) \ TPPX, (Top + DeltaY) \ TPPY, vbSrcCopy
End If
If DeltaY > 0 Then
BitBlt Picture2.hdc, 0, (ScaleHeight - DeltaY) \ TPPY, ScaleWidth \ TPPX, DeltaY \ TPPY, WD, (Left + DeltaX) \ TPPX, (Top + Height) \ TPPY, vbSrcCopy
ElseIf DeltaY < 0 Then
BitBlt Picture2.hdc, 0, 0, ScaleWidth \ TPPX, -DeltaY \ TPPY, WD, (Left + DeltaX) \ TPPX, (Top + DeltaY) \ TPPY, vbSrcCopy
End If
'Picture2.Refresh
BitBlt Picture1.hdc, 0, 0, ScaleWidth \ TPPX, ScaleHeight \ TPPY, Picture2.hdc, 0, 0, vbSrcCopy
AlphaBlend Picture1.hdc, 0, 0, ScaleWidth \ TPPX, ScaleHeight \ TPPY, Picture3.hdc, 0, 0, 128, &HFF00FF, 1
Move Left + DeltaX, Top + DeltaY
Picture1.Refresh
BitBlt Me.hdc, 0, 0, ScaleWidth \ TPPX, ScaleHeight \ TPPY, Picture1.hdc, 0, 0, vbSrcCopy
ReleaseDC WH, WD
End If
End Sub
回复人: jixian(极限) (2001-8-20 1:26:26) 得0分
.....@.......
回复人: textstar(小熊) (2001-8-20 22:12:13) 得0分
to charset(神奈川):你能告诉我你的方法吗?分数吗可以给啊,我很讲信誉的!
另外谢谢 wxj_lake(蔚蓝的风) 你给我的代码我试一下,看看行不行,一定给分!
回复人: charset(神奈川) (2001-8-21 9:28:28) 得0分
'不用PictureBox和其他控件的方法!一级棒!
Public Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
Public 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
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
Public Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
Public Declare Function LoadBitmap Lib "user32" Alias "LoadBitmapA" (ByVal hInstance As Long, ByVal lpBitmapName As String) As Long
Public Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Public Const SRCAND = &H8800C6
Public Const SRCCOPY = &HCC0020
Public Const SRCERASE = &H440328
Public Const SRCINVERT = &H660046
Public Const SRCPAINT = &HEE0086
Public Const BLACKNESS = &H42
Public Const WHITENESS = &HFF0062
Public Function LoadBitmap2DC(hDC As Long, ByVal PicturePath As String, Optional ByVal nWidth As Long, Optional ByVal nHeight As Long) As Long
Dim PicPath As String
PicPath = PicturePath
Dim hBitmap As Long
hBitmap = LoadImage(0, PicPath, IMAGE_BITMAP, nWidth, nHeight, LR_LOADFROMFILE)
If hBitmap = 0 Then
LoadBitmap2DC = hBitmap
Exit Function
End If
hDC = CreateCompatibleDC(0)
SelectObject hDC, hBitmap
DeleteObject hBitmap
LoadBitmap2DC = -1
End Function
Public Sub CreateBlackness(hDC as long,ByVal nWidth as long,Byval nHeight as long)
hDC = CreateCompatibleDC(0)
Dim hBitmap As Long
hBitmap = CreateCompatibleBitmap(hDC, 100, 100)
SelectObject hDC, hBitmap
BitBlt hDC, 0, 0, 100, 100, 0, 0, 0, BLACKNESS
DeleteObject hBitmap
End Sub
'你用CREATEBLACKNESS造个可以容纳两个图片的大小的HDC
'在这里是两个图片横放
CREATEBLACKNESS(hBlackness,p1Width+p2Width,p1Height)
dim p1Path As String
dim p2Path as string
p1path=app.path &"p1.bmp"
p2path=app.path &"p2.bmp"
LoadBitmap2DC Hpic1DC,p1path
loadbitmap2DC Hpic2DC,p2path
'不可以LoadBitmap2DC hDC,app.path &"some.bmp"
'这样会出错
bitblt MainDC,0,0,p1Width,p1Height,hpic1DC,0,0,srccopy
bitblt Maindc,p1Width,0,p2Width,p2Height,hpic2dc,0,0,srccopy
'在MainDC里就是两副图片的东西。
'最后不要忘了把DC们都DELETEDC
'谢谢你的赏光,有空多联系:c_i_h@263.net