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

请问怎么样实现无标题窗体大小的改变(100分)

楼主aojin54(shirley)2004-01-02 21:43:31 在 VB / 基础类 提问

有一篇文章介绍了的,如下,可以我按照他的方法做时却不能改变大小,有谁能告诉我为什么吗  
  =================================  
   
   
  在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素。这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体。但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦。本文介绍在VB中如何用API函数操作无边框窗体。    
  移动窗体  
   
  新建一标准工程,设置Form1的BorderStyle属性为0。此时运行程序后,无法移动窗体。为能移动窗体,在Form1的代码窗口声明下列函数和常数:    
  Option   Explicit  
   
  Private   Declare   Function   ReleaseCapture   Lib   “user32”   ()   As   Long    
  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  
   
  Const   WM_SYSCOMMAND   =   &H112    
  Const   SC_MOVE   =   &HF012  
   
  在Form_MouseDown事件中输入以下代码:    
  Private   Sub   Form_MouseDown(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
   
  按下鼠标左键    
  If   Button   =   vbLeftButton   Then  
   
  为当前的应用程序释放鼠标捕获    
  ReleaseCapture  
   
  移动窗体    
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   SC_MOVE,   0  
   
  End   If    
  End   Sub  
   
  注意:此时窗体上不能放置除Shape控件以外的任何控件,否则,在被控件遮住的地方点按鼠标还是无法移动窗体。要使点按控件也能移动窗体,需再添加一个该控件的MouseDown事件过程,代码与上述过程代码相似。    
  改变窗体的大小  
   
  为了改变窗体的大小,需要添加一个Timer控件,以定时捕获鼠标在窗体中的位置。当鼠标位于窗体边缘时,改变鼠标的形状,以通知用户可以进行改变大小的操作。为此,将Timer控件的Interval属性设为100(即每过100毫秒检测一下鼠标位置),其他取默认值。    
  在Form1的代码窗口中再添加下列两个函数,并定义两个自定义变量和一个字符串变量:  
   
  取得窗体位置的函数    
  Private   Declare   Function   GetWindowRect   Lib   “user32”   (ByVal   hwnd   As   Long,   lpRect   As   RECT)   As   Long  
   
  取得鼠标位置的函数    
  Private   Declare   Function   GetCursorPos   Lib   “user32”   (lpPoint   As   POINTAPI)   As   Long  
   
  鼠标位置变量    
  Private   Type   POINTAPI  
   
  x   As   Long    
  y   As   Long  
   
  End   Type    
  窗体位置变量  
   
  Private   Type   RECT    
  Left   As   Long  
   
  Top   As   Long    
  Right   As   Long  
   
  Bottom   As   Long    
  End   Type  
   
  所要执行的动作变量,是移动还是改变大小及从哪个方向改变大小    
  Dim   Action   As   String  
   
  在Timer1控件的Timer事件过程中添加以下代码:    
  Private   Sub   Timer1_Timer()  
   
  Dim   MyRect   As   RECT    
  Dim   MyPoint   As   POINTAPI  
   
  MyRect返回当前窗口位置    
  Call   GetWindowRect(Me.hwnd,   MyRect)  
   
  MyPoint返回当前鼠标位置    
  Call   GetCursorPos(MyPoint)  
   
  Select   Case   True    
  鼠标位于窗体左上方  
   
  Case   MyPoint.x   <   MyRect.Left   +   5   And   MyPoint.y   <   MyRect.Top   +   5    
  Screen.MousePointer   =   vbSizeNWSE  
   
  Action   =   “LeftUp”    
  鼠标位于窗体右下方  
   
  Case   MyPoint.x   >   MyRect.Right   -   5   And   MyPoint.y   >   MyRect.Bottom   -   5    
  Screen.MousePointer   =   vbSizeNWSE  
   
  Action   =   “RightDown”    
  鼠标位于窗体右上方  
   
  Case   MyPoint.x   >   MyRect.Right   -   5   And   MyPoint.y   <   MyRect.Top   +   5    
  ’45度双向鼠标指针  
   
  Screen.MousePointer   =   vbSizeNESW    
  Action   =   “RightUp”  
   
  鼠标位于窗体左下方    
  Case   MyPoint.x   <   MyRect.Left   +   5   And   MyPoint.y   >   MyRect.Bottom   -   5  
   
  Screen.MousePointer   =   vbSizeNESW    
  Action   =   “LeftDown”  
   
  鼠标位于窗体左边    
  Case   MyPoint.x   <   MyRect.Left   +   5  
   
  水平双向鼠标指针    
  Screen.MousePointer   =   vbSizeWE  
   
  Action   =   “Left”    
  鼠标位于窗体右边  
   
  Case   MyPoint.x   >   MyRect.Right   -   5    
  Screen.MousePointer   =   vbSizeWE  
   
  Action   =   “Right”    
  鼠标位于窗体上方  
   
  Case   MyPoint.y   <   MyRect.Top   +   5    
  垂直双向鼠标指针  
   
  Screen.MousePointer   =   vbSizeNS    
  Action   =   “Up”  
   
  鼠标位于窗体下方    
  Case   MyPoint.y   >   MyRect.Bottom   -   5  
   
  Screen.MousePointer   =   vbSizeNS    
  Action   =   “Down”  
   
  鼠标位于窗体其他位置    
  Case   Else  
   
  默认鼠标指针    
  Screen.MousePointer   =   0  
   
  Action   =   “Move”    
  End   Select  
   
  End   Sub    
  当利用SendMessage函数由系统向窗口发送改变大小的信息时,只要将上面移动窗体的语句“SendMessage   Me.hwnd,   WM_SYSCOMMAND,   SC_MOVE,   0”中的第3个参数改为相应的常数即可。  
   
  VB中&HF001~&HF008分别是从左、右、上、左上、右上、下、左下、右下8个方向改变窗体大小的常数。结合移动窗体的代码,将上述Form_MouseDown事件的代码综合如下(也可以把这8个常数声明为自定义常数):    
  Private   Sub   Form_MouseDown(Button   As   Integer,   Shift   As   Integer,   x   As   Single,   y   As   Single)  
   
  按下鼠标左键    
  If   Button   =   vbLeftButton   Then  
   
  为当前的应用程序释放鼠标捕获    
  ReleaseCapture  
   
  Select   Case   Action    
  Case   “Left”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF001,   0    
  Case   “Right”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF002,   0    
  Case   “Up”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF003,   0    
  Case   “LeftUp”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF004,   0    
  Case   “RightUp”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF005,   0    
  Case   “Down”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF006,   0    
  Case   “LeftDown”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF007,   0    
  Case   “RightDown”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   &HF008,   0    
  Case   “Move”  
   
  SendMessage   Me.hwnd,   WM_SYSCOMMAND,   SC_MOVE,   0    
  End   Select  
   
  End   If    
  End   Sub  
  问题点数:100、回复次数:9Top

1 楼3661512(.Net)回复于 2004-01-02 21:54:31 得分 0

直接调整窗口的Width和Height属性不行吗?例如长宽各增加100缇,  
  Private   Sub   Command1_Click()  
  Form1.Width   =   Form1.Width   +   100  
  Form1.Height   =   Form1.Height   +   100  
  End   SubTop

2 楼aojin54(shirley)回复于 2004-01-02 22:41:47 得分 0

这种方法当然不行啦,操作又不方便,又不美观  
  要跟普通有标题窗口缩方一样的效果的Top

3 楼3661512(.Net)回复于 2004-01-02 22:57:04 得分 0

用SendMesage   API函数  
   
  '窗体申明部分  
  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   Const   WM_SYSCOMMAND   =   &H112  
  Private   Const   SC_MINIMIZE   =   &HF020&  
  Private   Const   SC_MAXIMIZE   =   &HF030&  
  Private   Const   SC_RESTORE   =   &HF120&  
   
  Private   Sub   Command1_Click()   '最大化  
  SendMessage   Form1.hwnd,   WM_SYSCOMMAND,   SC_MAXIMIZE,   0&  
  End   Sub  
   
  Private   Sub   Command2_Click()   '最小化  
  SendMessage   Form1.hwnd,   WM_SYSCOMMAND,   SC_MINIMIZE,   0&  
  End   Sub  
   
  Private   Sub   Command3_Click()   '默认大小  
  SendMessage   Form1.hwnd,   WM_SYSCOMMAND,   SC_RESTORE,   0&  
  End   Sub  
   
  Private   Sub   Command4_Click()   '具体的调节大小,这里是长宽各增加100缇  
  Form1.Width   =   Form1.Width   +   100  
  Form1.Height   =   Form1.Height   +   100  
  End   Sub  
  Top

4 楼cpu54321(cpu)回复于 2004-01-02 22:58:29 得分 0

Dim   lStyle   As   Long  
  lStyle   =   GetWindowLong(Me.hwnd,   GWL_STYLE)   And   Not   WS_BORDER  
  SetWindowLong   Me.hwnd,   GWL_STYLE,   lStyle  
  SetWindowPos   Me.hwnd,   0&,   0&,   0&,   0&,   0&,   SWP_NOSIZE   Or   SWP_FRAMECHANGED   Or   SWP_NOMOVE  
   
  这样可以,不过在运行后要改窗体标题的话要用下面这样,不能直接改:  
  SetWindowText   Me.hwnd,   "Happy   New   Year!"  
   
  这个不能改大小:  
  lStyle   =   GetWindowLong(Me.hwnd,   GWL_STYLE)   And   Not   WS_BORDER   And   Not   WS_DLGFRAME   And   Not   WS_SIZEBOX  
  SetWindowLong   Me.hwnd,   GWL_STYLE,   lStyle  
  SetWindowPos   Me.hwnd,   0&,   0&,   0&,   0&,   0&,   SWP_NOSIZE   Or   SWP_FRAMECHANGED   Or   SWP_NOMOVE  
  Top

5 楼hhjjhjhj(大头)(http://office.9zp.com)回复于 2004-01-02 23:14:37 得分 0

用控件也行啊  
  如下是底边的例子  
  随便画一个空Picture1  
  Private   Sub   Form_Load()  
  With   Me.Picture1  
  .Width   =   Me.Width  
  .Height   =   5  
  .MousePointer   =   7  
  .Top   =   Me.ScaleHeight   -   10  
  .Left   =   0  
  End   With  
  End   Sub  
   
  Private   Sub   Picture1_MouseMove(Button   As   Integer,   Shift   As   Integer,   X   As   Single,   Y   As   Single)  
  If   Button   =   1   Then  
  Me.Height   =   Me.Height   +   Y  
  Me.Picture1.Top   =   Me.ScaleHeight   -   10  
  End   If  
  End   SubTop

6 楼rainstormmaster(暴风雨 v2.0)回复于 2004-01-03 00:12:14 得分 100

//有一篇文章介绍了的,如下,可以我按照他的方法做时却不能改变大小,有谁能告诉我为什么吗  
   
  新建一标准工程,设置Form1的BorderStyle属性为0,并输入下面的代码:  
   
  Option   Explicit  
   
  Private   Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
  '获取窗体结构信息函数  
  Private   Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  Private   Const   GWL_STYLE   =   (-16)  
  Private   Const   WS_SIZEBOX   =   &H40000  
   
  Private   Sub   Form_Load()  
          Dim   lStyle   As   Long  
          lStyle   =   GetWindowLong(Me.hwnd,   GWL_STYLE)  
          lStyle   =   lStyle   Or   WS_SIZEBOX   '为窗体增加   WS_SIZEBOX风格,可以改变大小  
          '按lStyle的值设置窗体信息  
          SetWindowLong   Me.hwnd,   GWL_STYLE,   lStyle  
          '保持窗体的大小与位置不变  
          Me.Width   =   Me.Width   +   100   '强制窗体刷新,当然还有别的刷新方法,但是这样容易  
          Me.Width   =   Me.Width   -   100          
  End   Sub  
   
  Top

7 楼rainstormmaster(暴风雨 v2.0)回复于 2004-01-03 00:12:58 得分 0

或者,设置Form1的BorderStyle属性为2,用setwindowlong去掉标题栏也可  
  Option   Explicit  
  Private   Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
  '获取窗体结构信息函数  
  Private   Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  Private   Const   GWL_STYLE   =   (-16)  
  Private   Const   WS_CAPTION   =   &HC00000  
  Private   Sub   Form_Load()  
          Dim   lStyle   As   Long  
          lStyle   =   GetWindowLong(Me.hwnd,   GWL_STYLE)  
          lStyle   =   lStyle   And   Not   WS_CAPTION  
          '按lStyle的值设置窗体信息  
          SetWindowLong   Me.hwnd,   GWL_STYLE,   lStyle  
          '保持窗体的大小与位置不变  
          Me.Width   =   Me.Width   +   100   '强制窗体刷新,当然还有别的刷新方法,但是这样容易  
          Me.Width   =   Me.Width   -   100  
  End   Sub  
   
   
   
  Top

8 楼ChinaKable(Kable)回复于 2004-01-03 00:30:44 得分 0

学习学习!Top

9 楼liyan010(我是大坏蛋)回复于 2004-01-03 03:33:18 得分 0

save   &   thinking~Top

相关问题

  • SendMessage 如何改变无标题栏窗体大小?
  • 十万火急,请问怎样可以改变无标题栏窗体大小?????????
  • 如何创建一个可以改变大小的无标题栏的窗体?
  • 改变窗体大小
  • 急急急!!!如何使窗体大小不能通过双击窗口标题栏来改变???
  • 如何用拖动的方法改变没有标题栏窗体的大小呢?
  • 十万火急,请问怎样可以改变无标题栏窗体大小,请高手们赐教
  • 请问在vb.net中如何用鼠标拖动改变无标题栏窗体的大小
  • 请问如何在VC中实现一个没有标题栏的窗体,且可以改变该窗体的大小?
  • 拖动窗体改变窗体大小时,怎么不闪动?

关键词

  • 鼠标
  • 控件
  • 函数
  • 代码
  • 移动
  • 属性
  • me
  • 窗体
  • syscommand
  • myrect

得分解答快速导航

  • 帖主:aojin54
  • rainstormmaster

相关链接

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

广告也精彩

反馈

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