Public Sub LoadRes(Res As tResource)
'把一幅图片加载到内存中
Dim tBmp As BITMAP
If Dir(Res.sPath) = "" Then
Exit Sub
End If
FreeRes Res
With Res
.hdc = CreateCompatibleDC(0)
Form1.picLoad.Picture = LoadPicture(.sPath)
.hBMP = CreateCompatibleBitmap(Form1.hdc, Form1.picLoad.ScaleWidth, Form1.picLoad.ScaleHeight)
.hOldBMP = SelectObject(.hdc, .hBMP)
BitBlt .hdc, 0, 0, Form1.picLoad.ScaleWidth, Form1.picLoad.ScaleHeight, Form1.picLoad.hdc, 0, 0, vbSrcCopy
MyGetObject .hBMP, Len(tBmp), tBmp
.Width = tBmp.bmWidth
.Height = tBmp.bmHeight
Set Form1.picLoad.Picture = Nothing
If .hBMP = 0 Then MsgBox "不能加载:" & Res.sPath
End With
End Sub
Public Function MakeMemBmp(ByVal Width As Long, ByVal Height As Long, Optional ByVal bkColor As Long = vbWhite) As tResource
'创建BMP图片
'Width,Height:宽高,pixels
'bkColor:背景色,默认为白色
Dim hBrush As Long
Dim hOldBr As Long
Dim rt As RECT
With MakeMemBmp
.hdc = CreateCompatibleDC(0)
.hBMP = CreateCompatibleBitmap(Form1.hdc, Width, Height)
.hOldBMP = SelectObject(.hdc, .hBMP)
.Width = Width
.Height = Height
If .hBMP = 0 Then
MsgBox "创建内存图象失败" '可能是内存不足,检查width和height的值
Exit Function
End If
hBrush = CreateSolidBrush(bkColor)
hOldBr = SelectObject(.hdc, hBrush)
rt.Left = 0
rt.Top = 0
rt.Right = Width
rt.Bottom = Height
FillRect .hdc, rt, hBrush
SelectObject .hdc, hOldBr
DeleteObject hBrush
DeleteObject hOldBr
End With
End Function
Public Sub FreeRes(ByRef Res As tResource)
SelectObject Res.hdc, Res.hOldBMP
DeleteObject Res.hBMP
DeleteObject Res.hOldBMP
DeleteDC Res.hdc
End Sub
Public Sub DrawString(ByVal hdc As Long, _
ByVal Text As String, _
ByVal Left As Long, _
ByVal Top As Long, _
ByVal Width As Long, _
ByVal Height As Long, _
ByVal Color As Long, _
ByVal Align As Long, _
Optional ByVal FontName As String = "宋体", Optional ByVal FontSize As Long = 12)
'在指定的设备是输出字符串
'hdc 设备hdc
'text 要写的字符串
'left,top,width,height 字符串对齐的矩形坐标
'color 字符颜色
'align 对齐方式,
'fontname 字体名称,默认为宋体
'fontsize 字体大小,默认为12
Dim rt As RECT
Dim lngLen As Long
Dim lf As LOGFONT
Dim hFont As Long
Dim hOldFont As Long
Public Sub DrawLine(ByVal hdc As Long, _
ByVal X1 As Long, _
ByVal Y1 As Long, _
ByVal X2 As Long, _
ByVal Y2 As Long, _
Optional ByVal Width As Long = 1, _
Optional ByVal Style As Long = PS_SOLID, _
Optional ByVal lColor As Long = vbBlack)
Dim hPen As Long
Dim hOldPen As Long
Public Sub SavePic(ByRef Res As tResource, ByVal FileName As String)
'保存Res为BMP图片
Dim BMI As BITMAPINFO
Dim bytBits() As Byte
Dim lSize As Long
Dim BFH As BITMAPFILEHEADER
Dim hFile As Long
Dim dwBytes As Long
With BMI.bmiHeader
.biSize = Len(BMI.bmiHeader)
.biWidth = Res.Width
.biHeight = Res.Height
.biBitCount = 24
.biPlanes = 1
.biCompression = BI_RGB
.biSizeImage = ((Res.Width * 3 + 3) And &HFFFFFFFC) * Res.Height
End With
Call GetDIBData(Res, bytBits, BMI)
Call WriteBMP(BMI.bmiHeader, bytBits, FileName)
Erase bytBits
End Sub
Public Sub SaveFullPic(ByVal FileName As String)
Dim BIF As BITMAPINFOHEADER
Dim BMI As BITMAPINFO
Dim bytBits1() As Byte
Dim bytBits2() As Byte
Dim bytBits12() As Byte
Dim bytBits34() As Byte
Dim bytBits() As Byte
Dim lSize As Long
Dim hFile As Long
Dim dwBytes As Long
With BMI.bmiHeader
.biSize = Len(BMI.bmiHeader)
.biWidth = tBmp(1).Width
.biHeight = tBmp(1).Height
.biBitCount = 24
.biPlanes = 1
.biCompression = BI_RGB
.biSizeImage = ((tBmp(1).Width * 3 + 3) And &HFFFFFFFC) * tBmp(1).Height
End With
Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
Public Type BITMAPFILEHEADER
bfType As Integer
bfSize1 As Integer 'bfSize as long,为对齐WORD,改为两个integer
bfSize2 As Integer
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits1 As Integer 'bfOffBits as long,为对齐WORD,改为两个integer
bfOffBits2 As Integer
End Type
Private Type BITMAPINFOHEADER '40 bytes
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
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors As RGBQUAD
End Type
Private Type SAFEARRAYBOUND
cElements As Long
lLbound As Long
End Type
Private Type SAFEARRAY2D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
Bounds(0 To 1) As SAFEARRAYBOUND
End Type
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Public Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 32
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 DeleteDC Lib "gdi32" (ByVal hdc 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 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 CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Public Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Public Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor 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 SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Public Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) 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 MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Long) As Long
Public Declare Function MyGetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Public Const TRANSPARENT = 1
Public Const DT_CENTER = &H1
Public Const DT_VCENTER = &H4
Public Const DT_LEFT = &H0
Public Const DT_SINGLELINE = &H20
Public Const DT_BOTTOM = &H8
Public Const DT_CENTERCENTER = DT_CENTER Or DT_VCENTER Or DT_SINGLELINE
Public Const PS_SOLID = 0
Public Const PS_DASH = 1
Public Const PS_DASHDOT = 3
Public Const PS_DASHDOTDOT = 4
Public Const PS_DOT = 2
Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal lMem As Long) As Long
Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Public Declare Function GlobalFree Lib "kernel32" (ByVal hMem 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, ByVal lpBits As Long, 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, ByVal lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Public Const DIB_PAL_COLORS = 1
Public Const DIB_RGB_COLORS = 0
Private Const BI_RGB = 0&
Type tResource
sPath As String
hBMP As Long
hOldBMP As Long
hdc As Long
Width As Long
Height As Long
End Type
Public 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 Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const CREATE_ALWAYS = 2
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE = -1
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Const FILE_BEGIN = 0
创建BMP图片并完成楼主指定的操作需要用到下面几个API:
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 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 SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Public Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Public Declare Function SetTextColor Lib "gdi32" (ByVal hdc 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