CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

请问如何使窗体的移动范围仅在屏幕内!

楼主incubus(梦淫妖)2005-04-02 23:13:56 在 VB / API 提问

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

1 楼zxsoft(张旋)回复于 2005-04-03 08:34:36 得分 5

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

2 楼laviewpbt(人一定要靠自己)回复于 2005-04-03 09:05:26 得分 5

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

3 楼laviewpbt(人一定要靠自己)回复于 2005-04-03 18:16:31 得分 10

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   Long  
   
  Declare   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   Type  
   
  Public   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   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
      Dim   ret   As   Long  
      '取消Message的截取,而使之又只送往原来的Window   Procedure  
      ret   =   SetWindowLong(Me.hwnd,   GWL_WNDPROC,   preWinProc)  
  End   Sub  
   
   
   
  Top

相关问题

  • 请问窗体如何在屏幕上移动,比如说象左平移30!
  • 窗体的移动
  • 怎样使一个窗体(非模式)始终在另一个窗体(非MDI)之上,且移动范围在这个窗体之内?
  • 怎么判断窗体上的控件已经超出屏幕范围或者窗体本身已经超出范围
  • VB如何实现一个窗体在移动时不能移出屏幕外侧?
  • 如何移动窗体?
  • 窗体移动问题
  • 关于窗体移动
  • 如何移动windows窗体!
  • 窗体移动问题!!

关键词

  • 屏幕
  • wpos
  • 窗体
  • byval
  • 图象
  • longdeclare
  • windowpos
  • screen
  • as long
  • 范围

得分解答快速导航

  • 帖主:incubus
  • zxsoft
  • laviewpbt
  • laviewpbt

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo