如何用以下几个api函数实现窗体随着本窗体中的label的大小改变而改变 label里面的信息是通过自己写的一个MessageBox的Prompt输入
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function GetWindowDC 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 Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long
Private Type Size
cx As Long
cy As Long
End Type
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function GetWindowDC 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 Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hdc As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As Size) As Long
Private Type Size
cx As Long
cy As Long
End Type
模块内容:
Option ExplicitPublic Const DT_BOTTOM = &H8
Public Const DT_CALCRECT = &H400
Public Const DT_CENTER = &H1
Public Const DT_EXPANDTABS = &H40
Public Const DT_EXTERNALLEADING = &H200
Public Const DT_LEFT = &H0
Public Const DT_NOCLIP = &H100
Public Const DT_NOPREFIX = &H800
Public Const DT_RIGHT = &H2
Public Const DT_SINGLELINE = &H20
Public Const DT_TABSTOP = &H80
Public Const DT_TOP = &H0
Public Const DT_VCENTER = &H4
Public Const DT_WORDBREAK = &H10Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End TypeType SIZE
cx As Long
cy As Long
End TypeDeclare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hDC As Long, ByVal X As Long, ByVal Y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
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
Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" (ByVal hDC As Long, ByVal lpsz As String, ByVal cbString As Long, lpSize As SIZE) As Long
窗体内容:
Option ExplicitPrivate Sub Command1_Click()
Dim r As RECT, s As SIZE
r.Left = 50: r.Top = 50
r.Right = 135: r.Bottom = 65
Line (r.Left, r.Top)-(r.Right, r.Bottom), RGB(255, 255, 0), BF
DrawText Me.hDC, "Draw Text Test", 14, r, 0
r.Left = 50: r.Top = 100
r.Right = 135: r.Bottom = 115
Line (r.Left, r.Top)-(r.Right, r.Bottom), RGB(255, 255, 0), BF
DrawText Me.hDC, "Draw Text Test", 14, r, DT_NOCLIP
GetTextExtentPoint32 Me.hDC, "Draw Text Test", 14, s
r.Left = 50: r.Top = 150
r.Right = r.Left + s.cx: r.Bottom = r.Top + s.cy
Line (r.Left, r.Top)-(r.Right, r.Bottom), RGB(255, 255, 0), BF
DrawText Me.hDC, "Draw Text Test", 14, r, 0
End Sub
Option ExplicitDeclare 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
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long窗体内容:
Option ExplicitDim N As LongPrivate Sub cmdPrint_Click()
Dim sx As Long, sy As Long, hDC As Long
Dim px As Long, py As Long, I As Integer
Me.ScaleMode = vbPixels
sx = Me.Width / Screen.TwipsPerPixelX
sy = Me.Height / Screen.TwipsPerPixelY
picPrint.Width = sx
picPrint.Height = sy
For I = 0 To Controls.Count - 1
If TypeName(Controls(I)) <> "Menu" Then Controls(I).Visible = False
Next
DoEvents
picPrint.AutoRedraw = True
hDC = GetWindowDC(Me.hWnd)
BitBlt picPrint.hDC, 0, 0, sx, sy, hDC, 0, 0, vbSrcCopy
ReleaseDC Me.hWnd, hDC
picPrint.AutoRedraw = False
For I = 0 To Controls.Count - 1
If TypeName(Controls(I)) <> "Menu" And _
Controls(I).Name <> "picPrint" Then Controls(I).Visible = True
Next
Set picPrint.Picture = picPrint.Image
Dim w As Long, h As Long
Me.ScaleMode = vbTwips
Printer.ScaleMode = vbTwips
w = picPrint.Width * N \ 100
h = picPrint.Height * N \ 100
px = (Printer.ScaleWidth - w) / 2
py = (Printer.ScaleHeight - h) / 2
Printer.PaintPicture picPrint.Picture, px, py, w, h
Printer.EndDoc
End SubPrivate Sub Form_Load()
mPercent(100).Checked = True
N = 100
End SubPrivate Sub mPercent_Click(Index As Integer)
mPercent(50).Checked = False
mPercent(100).Checked = False
mPercent(150).Checked = False
mPercent(200).Checked = False
mPercent(Index).Checked = True
N = Index
End Sub
VB声明
Declare Function MoveWindow Lib "user32" Alias "MoveWindow" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
说明
改变指定窗口的位置和大小。顶级窗口可能受最大或最小尺寸的限制,那些尺寸优先于这里设置的参数
返回值
Long,非零表示成功,零表示失败
参数表
参数 类型及说明
hwnd Long,欲移动窗口的句柄 x Long,窗口新的左侧位置
y Long,窗口新的顶部位置
nWidth Long,窗口的新宽度
nHeight Long,窗口的高宽度
bRepaint Long,如窗口此时应重画,则设为TRUE(非零)。FALSE(零)则表明应用程序会自己决定是否重画窗口
GetWindowDC VB声明
Declare Function GetWindowDC Lib "user32" Alias "GetWindowDC" (ByVal hwnd As Long) As Long
说明
获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
返回值
Long,执行成功为窗口设备场景,失败则为0
参数表
参数 类型及说明
hwnd Long,将获取其设备场景的窗口
注解
不推荐在vb里使用这个函数。用完后一定要用ReleaseDC函数释放场景
ReleaseDC VB声明
Declare Function ReleaseDC Lib "user32" Alias "ReleaseDC" (ByVal hwnd As Long, ByVal hdc As Long) As Long
说明
释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害)
返回值
Long,执行成功为1,否则为0
参数表
参数 类型及说明
hwnd Long,要释放的设备场景相关的窗口句柄
hdc Long,要释放的设备场景句柄
注解
对那些用CreateDC一类的DC创建函数生成的设备场景,不要用本函数GetTextExtentExPoint VB声明
Declare Function GetTextExtentExPoint Lib "gdi32" Alias "GetTextExtentExPointA" (ByVal hdc As Long, ByVal lpszStr As String, ByVal cchString As Long, ByVal nMaxExtent As Long, lpnFit As Long, alpDx As Long, lpSize As SIZE) As Long
说明
判断要填入指定区域的字符数量。也用一个数组装载每个字符的范围信息
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
hdc Long,设备场景的句柄
lpszStr String,准备量度其范围的字串
cchString Long,lpszStr字串的长度
nMaxExtent Long,采用逻辑单位表示的水平范围
lpnFit Long,在其中保存欲填充到指定区域的字符数量。可以为NULL(用一个别名化的声明来设置ByVal As Long)——此时会忽略nMaxExtent设置
As Long,cchString数组的第一个条目。每个条目都要保存从字串起点到这个字符的距离(采用逻辑单位)。如果不需要这方面的信息,也可设为NULL(用别名声明设置 ByVal As Long)
lpSize SIZE,这个结构用于装载字串范围的高度和宽度信息
注解
可用这个函数计算自动换行输出时的字符位置