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

【CSDN】【如何控制窗体缩放到一定大小后不能再缩小】

楼主drillmaster11(【CSDN教官】)2003-11-02 17:17:01 在 VB / 基础类 提问

Private   Sub   Form_Resize()  
  Frame1.Width   =   Me.ScaleWidth  
  Frame2.Width   =   Me.ScaleWidth  
  Frame3.Width   =   Me.ScaleWidth  
   
  Frame3.Height   =   Me.ScaleHeight   -   Frame1.Height   -   Frame2.Height  
   
  Frame2.Top   =   Frame1.Height  
  Frame3.Top   =   Frame1.Height   +   Frame2.Height  
   
  MSFlexGrid1.Left   =   20  
  MSFlexGrid1.Width   =   Frame3.Width   -   40  
  MSFlexGrid1.Height   =   Frame3.Height   -   160  
   
  Label1.Left   =   Frame1.Width   /   2   -   Label1.Width   /   2  
   
  End   Sub  
   
   
  以上代码能够实现当窗体变化时,控件能够自动调整其自身大小和位置,可是现在我要控制如何使窗体缩小到一定大小时不能再缩小,因为缩小到只剩下标题栏,如下语句会出现错误,程序崩溃  
  Frame3.Height   =   Me.ScaleHeight   -   Frame1.Height   -   Frame2.Height  
  Frame3.Top   =   Frame1.Height   +   Frame2.Height  
   
  请问如何实现呀 问题点数:100、回复次数:6Top

1 楼wea1978(川)回复于 2003-11-02 17:21:06 得分 1

加上   if   Frame3.Height<   数据   then   exit   sub  
              if   Frame3.Top<   数据   then   exit   subTop

2 楼callzjy2()回复于 2003-11-02 17:23:27 得分 20

Private   Sub   Form_Resize()  
  On   Error   Resume   Next  
   
  Frame1.Width   =   Me.ScaleWidth  
  Frame2.Width   =   Me.ScaleWidth  
  Frame3.Width   =   Me.ScaleWidth  
   
  Frame3.Height   =   Me.ScaleHeight   -   Frame1.Height   -   Frame2.Height  
   
  Frame2.Top   =   Frame1.Height  
  Frame3.Top   =   Frame1.Height   +   Frame2.Height  
   
  MSFlexGrid1.Left   =   20  
  MSFlexGrid1.Width   =   Frame3.Width   -   40  
  MSFlexGrid1.Height   =   Frame3.Height   -   160  
   
  Label1.Left   =   Frame1.Width   /   2   -   Label1.Width   /   2  
   
  End   Sub  
  Top

3 楼palmkey(原水)回复于 2003-11-02 18:38:04 得分 2

Private   Sub   Form_Resize()  
        '加上判断  
        If   Me.WindowState   =   1   Then     '最小化  
              Exit   Sub  
        End   If  
   
  Frame1.Width   =   Me.ScaleWidth  
  Frame2.Width   =   Me.ScaleWidth  
  Frame3.Width   =   Me.ScaleWidth  
   
  Frame3.Height   =   Me.ScaleHeight   -   Frame1.Height   -   Frame2.Height  
   
  Frame2.Top   =   Frame1.Height  
  Frame3.Top   =   Frame1.Height   +   Frame2.Height  
   
  MSFlexGrid1.Left   =   20  
  MSFlexGrid1.Width   =   Frame3.Width   -   40  
  MSFlexGrid1.Height   =   Frame3.Height   -   160  
   
  Label1.Left   =   Frame1.Width   /   2   -   Label1.Width   /   2  
   
  End   SubTop

4 楼hisofty(瘦马)回复于 2003-11-02 18:45:51 得分 10

上面的代码实际上是在窗体改变大小后再改回去,下面的代码是直接的禁止改变大小:  
  利用子类处理技术限制窗体的大小    
  '   *   *   *   *   *   *   *   *   *   *   警告   *   *   *   *   *   *   *   *   *   *   *   *   *  
  '   对以下代码进行修改将有可能导致不可预料的后果,甚至能使您的VB崩溃!  
  '   在VB   IDE环境中运行本程序之前请先保存您的修改  
  '   不要使用断点调试模式,这将导致VB崩溃!  
  '   *   *   *   *   *   *   *   *   *   *   注意   *   *   *   *   *   *   *   *   *   *   *   *   *  
  模块:  
  Option   Explicit  
   
  Public   OldWindowProc   As   Long  
  Declare   Function   GetWindowLong   Lib   "user32"   Alias   "GetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long)   As   Long  
  '从指定的窗口结构中取得信息  
  '参数/类型   说明  
  'hwnd(long):   欲为其获取信息的窗口的句柄  
  'nIndex(long):   欲取回的信息,可以是下述任何一个常数  
  'GWL_EXSTYLE:扩展窗口样式  
  'GWL_STYLE:窗口样式  
  'GWL_WNDPROC:该窗口的窗口函数的地址  
  'GWL_HINSTANCE:拥有窗口的实例的句柄  
  'GWL_HWNDPARENT:该窗口之父的句柄.不要用   SetWindowWord   来改变这个值  
  'GWL_ID:对话框中一个子窗口的标识符  
  'GWL_USERDATA:含义由应用程序规定  
  '对话框亦可指定下列常数  
  'DWL_DLGPROC:这个窗口的对话框函数地址  
  'DWL_MSGRESULT:在对话框函数中处理的一条消息返回的值  
  'DWL_USER:含义由应用程序规定  
  Declare   Function   SetWindowLong   Lib   "user32"   Alias   "SetWindowLongA"   (ByVal   hwnd   As   Long,   ByVal   nIndex   As   Long,   ByVal   dwNewLong   As   Long)   As   Long  
  '在窗体结构中为指定的窗口设置信息  
  '参数/类型   说明  
  'hwnd(long)   欲为其获取信息的窗口的句柄  
  'nIndex(long)   参考GetWindowLong函数  
  'dwNewLong(long)   由nIndex指定的窗口信息的新值  
  Declare   Sub   CopyMemory   Lib   "kernel32"   Alias   "RtlMoveMemory"   (pDest   As   Any,   pSource   As   Any,   ByVal   ByteLen   As   Long)  
  '这就是在VisualBasic中处理指针的"短柄斧"--CopyMemory.你可能在API文档中找不到它,但它确实存在,并且功能异常强大  
  '参数/类型   说明  
  'pDest   你想写入字节到其中的任何变量的ByRef参数(地址)  
  'pSource   要从其中进行复制的ByRef变量  
  'ByteLen   要复制的字节数  
  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  
  '把控制权传回给原来的窗口过程  
  Public   Const   WM_GETMINMAXINFO   =   &H24  
  Type   POINTAPI  
   x   As   Long  
   y   As   Long  
  End   Type  
  '   This   is   the   structure   that   is   passed   by   reference(ByRef)(ie   an   address)   to   your   message   handler(消息侦听器)  
  '   The   key   items   in   this   structure   are   ptMinTrackSize   and   ptMaxTrackSize  
  Type   MINMAXINFO  
   ptReserved   As   POINTAPI  
   ptMaxSize   As   POINTAPI  
   ptMaxPosition   As   POINTAPI  
   ptMinTrackSize   As   POINTAPI  
   ptMaxTrackSize   As   POINTAPI  
  End   Type  
  Public   Function   SubClass1_WndMessage(ByVal   hwnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wp   As   Long,   ByVal   lp   As   Long)   As   Long  
  '   Watch   for   the   pertinent   message   to   come   in  
   If   Msg   =   WM_GETMINMAXINFO   Then  
    Dim   MinMax   As   MINMAXINFO  
  '    This   is   necessary   because   the   structure   was   passed   by   its   address   and   there  
  '    is   currently   no   intrinsic   way   to   use   an   address   in   Visual   Basic  
    CopyMemory   MinMax,   ByVal   lp,   Len(MinMax)  
  '   This   is   where   you   set   the   values   of   the   MinX,MinY,MaxX,   and   MaxY  
  '   The   values   placed   in   the   structure   must   be   in   pixels.   The   values  
  '   normally   used   in   Visual   Basic   are   in   twips.   The   conversion   is   as   follows:  
  '    pixels   =   twips\twipsperpixel  
    MinMax.ptMinTrackSize.x   =   3975   \   Screen.TwipsPerPixelX  
    MinMax.ptMinTrackSize.y   =   1740   \   Screen.TwipsPerPixelY  
    MinMax.ptMaxTrackSize.x   =   Screen.Width   \   Screen.TwipsPerPixelX   \   2  
    MinMax.ptMaxTrackSize.y   =   3480   \   Screen.TwipsPerPixelY  
  '   Here   we   copy   the   datastructure   back   up   to   the   address   passed   in   the   parameters  
  '   because   Windows   will   look   there   for   the   information.  
    CopyMemory   ByVal   lp,   MinMax,   Len(MinMax)  
  '   This   message   tells   Windows   that   the   message   was   handled   successfully  
    SubClass1_WndMessage   =   1  
    Exit   Function  
   End   If  
  '   Here,   we   forward   all   irrelevant   messages   on   to   the   default   message   handler.  
   SubClass1_WndMessage   =   CallWindowProc(OldWindowProc,   hwnd,   Msg,   wp,   lp)  
  End   Function  
   
  窗体代码:  
  Option   Explicit  
   
  Private   Const   GWL_WNDPROC   =   (-4)  
  Private   Sub   Form_Load()  
  '   First,   we   need   to   store   the   address   of   the   existing   Message   Handler  
   OldWindowProc   =   GetWindowLong(Me.hwnd,   GWL_WNDPROC)  
  '   Now   we   can   tell   windows   to   forward   all   messages   to   out   own   Message   Handler  
   Call   SetWindowLong(Me.hwnd,   GWL_WNDPROC,   AddressOf   SubClass1_WndMessage)  
  End   Sub  
   
  Private   Sub   Form_Unload(Cancel   As   Integer)  
  '   We   must   return   control   of   the   messages   back   to   windows   before   the   program   exits  
  Call   SetWindowLong(Me.hwnd,   GWL_WNDPROC,   OldWindowProc)  
  End   SubTop

5 楼callzjy2()回复于 2003-11-02 19:35:54 得分 65

Private   Sub   Form_Resize()  
  On   Error   Resume   Next  
   
  If   Me.ScaleWidth   <   11000   Then   Me.Width   =   11000  
  If   Me.ScaleHeight   <   8250   Then   Me.Height   =   8250  
   
  Frame1.Width   =   Me.ScaleWidth  
  Frame2.Width   =   Me.ScaleWidth  
  Frame3.Width   =   Me.ScaleWidth  
   
  Frame3.Height   =   Me.ScaleHeight   -   Frame1.Height   -   Frame2.Height  
   
  Frame2.Top   =   Frame1.Height  
  Frame3.Top   =   Frame1.Height   +   Frame2.Height  
   
  MSFlexGrid1.Left   =   20  
  MSFlexGrid1.Width   =   Frame3.Width   -   40  
  MSFlexGrid1.Height   =   Frame3.Height   -   160  
   
  Label1.Left   =   Frame1.Width   /   2   -   Label1.Width   /   2  
  End   Sub  
  Top

6 楼5653325(等待开刃的刀)回复于 2003-11-02 19:50:33 得分 2

用on   error   goto(resume   next)就可以了吧Top

相关问题

  • 如何把一个窗体(form)放到picture内?
  • 我想把两个窗体放到前面来
  • 在VB中,窗体在缩小后,怎样实现滚动条?
  • 无标题窗体怎样实现放大缩小?
  • 当把MDI子窗体放到最大时,为什么主窗体的MENU会不见了
  • 如何将一个窗体放到另外一个窗体的控件(比如Panel)上
  • 请问,怎样实现双击窗体上方的蓝色地带时窗体不会缩小啊?
  • 请教:MFC 窗体中的 STATIC Group box 如何实现和窗体一起放大和缩小
  • 怎么把菜单放到窗体的其它位置而不是顶端呢?
  • 怎么把一个文件拖放到另一个程序的窗体上!~

关键词

  • me
  • top
  • 窗体
  • frame
  • 缩小
  • heightframe
  • scalewidthframe
  • height
  • width

得分解答快速导航

  • 帖主:drillmaster11
  • wea1978
  • callzjy2
  • palmkey
  • hisofty
  • callzjy2
  • 5653325

相关链接

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

广告也精彩

反馈

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