在msgblst中如何处理指向结构变量的地址
编号:QA000727
建立日期: 1999年3月30日 最后修改日期:1999年3月30日
所属类别:
zhyan:
在vb中限制一个窗体有最小尺寸,您的回答(QA000410 "在VB中可以限制窗体的最小值吗")是在resize事件中限制,效果很难看。现在我下载了msgblst控件,想在wm_windowposchanging消息发生时来控制,可这个消息的lparam参数是指向windowpos结构的地址,我把一个定义为这个结构的变量传递给lparam,vb说类型错误,我把变量用括号括起来传递,还是出错。我想知道,如何给long型的lparam传递一个结构?或者说,我如何把一个结构的地址放到一个long型的变量里?谢谢
回答:
现在又是我卖弄技巧的时候了。在窗体中加上如下声明:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Const WM_WINDOWPOSCHANGING = &H46
Private Type WINDOWPOS
hwnd As Long
hWndInsertAfter As Long
x As Long
y As Long
cx As Long
cy As Long
flags As Long
End Type
Dim posWin As WINDOWPOS
然后在窗体上加上一个MsgBlst控件,加入如下代码:
Private Sub Form_Load()
Msgblst321.hWndTarget = hwnd
Msgblst321.MsgList(0) = WM_WINDOWPOSCHANGING
End Sub
Private Sub Msgblst321_Message(ByVal MsgVal As Long, ByVal wParam As Long, ByVal lParam As Long, lplRetVal As Long)
CopyMemory posWin, lParam, Len(posWin)
Debug.Print posWin.cy
If posWin.cy < 200 Then
posWin.cy = 200
CopyMemory ByVal lParam, VarPtr(posWin), Len(posWin)
End If
End Sub
这里我们限制窗体的高度为200个像素。我们先使用CopyMemory将WM_WINDOWPOSCHANGING的结构变量的内容拷贝到VB的变量中,修改后再使用CopyMemory拷贝回去。就这么简单,感受到了Msgblst的神奇魅力了吗?
此问题由李海回答。
| |
|
|
| |
|
|