CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

请问如何移动不带标题栏的窗体?

楼主Dickson(沧海冷心)2004-12-02 19:23:20 在 VB / 基础类 提问

同上 问题点数:20、回复次数:5Top

1 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2004-12-02 19:46:55 得分 10

1、在MouseDown事件发生时判断按键状态并获取鼠标位置:  
     Private   Sub   Form_MouseDown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
     '如果是鼠标左键按下  
     If   Button   =   1   Then  
       '标示为移动状态  
       MoveScreen   =   True  
       '得到鼠标在窗体上的位置(相对与窗体内部坐标)  
       MousX   =   X  
       MousY   =   Y  
     End   If  
     End   Sub  
     2、当鼠标MouseMove事件发生时,计算新的窗体坐标,并移动:  
     Private   Sub   Form_MouseMove(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)      '如果处于鼠标左键按下的状态,即MoveScreen   =   True时  
     If   MoveScreen   Then  
       '计算新的窗体坐标值  
       CurrX   =   Form1.Left   -   MousX   +   X  
       CurrY   =   Form1.Top   -   MousY   +   Y  
       '移动窗体到新的位置  
       Form1.Move   CurrX,   CurrY  
     End   If  
     End   Sub  
  Top

2 楼Zezese(蓝酷云)回复于 2004-12-02 20:19:44 得分 10

'模块  
  Option   Explicit  
  Public   Const   GWL_WNDPROC   =   (-4)  
   
  Public   Const   WM_NCHITTEST   =   &H84  
  Public   Const   HTCLIENT   =   1  
  Public   Const   HTCAPTION   =   2  
   
  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   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hWnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
   
  Public   prevWndProc   As   Long  
   
  Function   WndProc(ByVal   hWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long  
  WndProc   =   CallWindowProc(prevWndProc,   hWnd,   Msg,   wParam,   lParam)  
  If   Msg   =   WM_NCHITTEST   And   WndProc   =   HTCLIENT   Then  
  WndProc   =   HTCAPTION  
  End   If  
  '窗体  
  Option   Explicit  
   
  Private   Sub   Command1_Click()  
  Unload   Me  
  End   Sub  
   
  Private   Sub   Form_Load()  
  prevWndProc   =   GetWindowLong(Me.hWnd,   GWL_WNDPROC)  
  SetWindowLong   Me.hWnd,   GWL_WNDPROC,   AddressOf   WndProc  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
  SetWindowLong   Me.hWnd,   GWL_WNDPROC,   prevWndProc  
  End   Sub  
  Top

3 楼baoaya(点头)(大风起兮云飞扬)回复于 2004-12-02 20:51:10 得分 0

 
  private   sub   from_mousedown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
  if   me.WindowState   =   0   Then  
          const   WM_NCLBUTTONDOWN=&HA1  
          call   SendMessage   (me.hWnd,   WM_NCLBUTTONDOWN,   2,   0&)   '发送按住标题栏的“假消息”呵呵  
  end   if  
  end   sub  
   
  这里是在from的mousedown事件里,你也可以   自己制作一个   标题栏Top

4 楼baoaya(点头)(大风起兮云飞扬)回复于 2004-12-02 20:56:10 得分 0

对不起   刚才手动输入   没测试过   这个是完整的代码,只要按住窗体的任何地方就可以移动他  
  Option   Explicit  
  Private   Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   (ByVal   hWnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long  
  Private   Declare   Function   ReleaseCapture   Lib   "user32"   ()   As   Long  
  Private   Sub   Form_MouseDown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
          If   Me.WindowState   =   0   Then  
                  Const   WM_NCLBUTTONDOWN   =   &HA1  
                  ReleaseCapture  
                  Call   SendMessage(Me.hWnd,   WM_NCLBUTTONDOWN,   2,   0&)     '发送按住标题栏的“假消息”呵呵  
          End   If  
  End   Sub  
  Top

5 楼syre(神仙)回复于 2004-12-02 22:01:11 得分 0

private   sub   from_mousedown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
  if   me.WindowState   =   0   Then  
          const   WM_NCLBUTTONDOWN=&HA1  
          call   SendMessage   (me.hWnd,   WM_NCLBUTTONDOWN,   2,   0&)   '发送按住标题栏的“假消息”呵呵  
  end   if  
  end   sub  
  如此最简单Top

相关问题

  • 如何移动一个无标题栏的窗体?
  • 如何不用标题栏可以移动窗体
  • 移动无标题栏的窗体时,如何实现虚框?
  • 怎么移动无标题栏窗体
  • 无标题栏窗体的移动
  • 在FORM窗体中无标题栏的情况下如何移动窗体,急急急~~~~~~~~~~~~~~~~~~
  • 如何自画窗体标题栏?
  • 如何去掉窗体的标题栏。。
  • 在没有标题栏的窗体中,怎样移动窗体?
  • 如何当鼠标按住图片上下左右移动时窗体也一样移动,象标题栏

关键词

  • 鼠标
  • 移动
  • 窗体
  • movescreen
  • single
  • 状态
  • 位置
  • sub
  • integer
  • button

得分解答快速导航

  • 帖主:Dickson
  • happy_sea
  • Zezese

相关链接

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

广告也精彩

反馈

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