我有一块图象卡,直接用显卡显示,其中用到了回掉函数,回调函数中用到了UpdateWindow,问题是一旦窗体(具体是显示图象的哪个控件,我的是picturebox)移出屏幕外,图象就消失了,我看了图象卡自带的哪个程序,他是通过控制程序窗体的左右上下位置来实现显示的,即窗体的移到屏幕左边时(有一部分不可见),自动使窗体与屏幕左边对次,其他位置也一样
   请问在VB里怎么实现这样的功能
   另外toolbar 中设置按钮为dropdown时,点击其由段的小箭头会触发什么事件,我想在点击时谈出自己的菜单。
   记得以前有一个帖子谈到了如何调整commondialog在屏幕位置的问题,谁还有哪个帖子的地址。
   谢谢!

解决方案 »

  1.   

    把PictureBox的AutoRedraw设为True应该就能结决你所说的图像消失问题。如果不行。可以用一个Timer实时监视窗口是否在0,0,Screen.width,Screen.height范围内。如不是则移入。亦可用API截获在窗口标题栏上弹起鼠标的消息。并判断窗口位置。不在范围内则移入范围。
      

  2.   

    这个我以前做过,PictureBox的AutoRedraw设为True应该是不行的,用Timer来判断也应该是不行的,即使你的interval属性非常的小 ,因为只要窗体的left有一点点时间小于0,图象就会消失,用API拦截应该可以!
      

  3.   

    Option Explicit'以下程式在module1.bas
    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