我有一块图象卡,直接用显卡显示,其中用到了回掉函数,回调函数中用到了UpdateWindow,问题是一旦窗体(具体是显示图象的哪个控件,我的是picturebox)移出屏幕外,图象就消失了,我看了图象卡自带的哪个程序,他是通过控制程序窗体的左右上下位置来实现显示的,即窗体的移到屏幕左边时(有一部分不可见),自动使窗体与屏幕左边对次,其他位置也一样
请问在VB里怎么实现这样的功能
另外toolbar 中设置按钮为dropdown时,点击其由段的小箭头会触发什么事件,我想在点击时谈出自己的菜单。
记得以前有一个帖子谈到了如何调整commondialog在屏幕位置的问题,谁还有哪个帖子的地址。
谢谢!
请问在VB里怎么实现这样的功能
另外toolbar 中设置按钮为dropdown时,点击其由段的小箭头会触发什么事件,我想在点击时谈出自己的菜单。
记得以前有一个帖子谈到了如何调整commondialog在屏幕位置的问题,谁还有哪个帖子的地址。
谢谢!
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongDeclare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const GWL_WNDPROC = (-4)
Public Const WM_WINDOWPOSCHANGING = &H46
Type WINDOWPOS
hwnd As Long
hWndInsertAfter As Long
x As Long
y As Long
cx As Long
cy As Long
flags As Long
End TypePublic preWinProc As Long
'而重点就在於Window重新定位之前会传
'出WM_WINDOWPOSCHANGING这个讯息,而lParam指向一个WINDOWPOS的STRUCTURE。
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lwd As Long, hwd As Long
If Msg = WM_WINDOWPOSCHANGING Then
Dim WPOS As WINDOWPOS
CopyMemory WPOS, ByVal lParam, Len(WPOS)
'保证图象显示区域不被遮蔽
If WPOS.y > Screen.Height / Screen.TwipsPerPixelY - WPOS.cy Then WPOS.y = Screen.Height / Screen.TwipsPerPixelY - WPOS.cy
If WPOS.x > Screen.Width / Screen.TwipsPerPixelX - WPOS.cx Then WPOS.x = Screen.Width / Screen.TwipsPerPixelX - WPOS.cx
If WPOS.x < 0 Then WPOS.x = 0
If WPOS.y < 0 Then WPOS.y = 0 CopyMemory ByVal lParam, WPOS, Len(WPOS)
End If
'将之送往原来的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
窗体中Sub Form_Load()
Dim ret As Long
'记录原本的Window Procedure的位址
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
End SubPrivate Sub Form_Unload(Cancel As Integer)
Dim ret As Long
'取消Message的截取,而使之又只送往原来的Window Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
End Sub