主题:含笑不语:异型窗体代码逐句详解,请高手指教点评,菜鸟分享
含笑不语
[专家分:50] 发布于 2008-01-06 19:35:00
在自学VB过程中,我遇到许多困难,很多教材语焉不详,让身为菜鸟的我吃够了苦头!特发此帖,作为我的VB自学系列笔记之一,希望能给广大VB菜鸟同仁带来帮助!
------------------含笑不语 2008-1-6
特别鸣谢 btxdlibin大大 tanchuhan大大 merry05大大
实例1 异型窗体
1.建Form1,添加2个CommandButton,Caption1="外边为圆角矩形,里边为椭圆透明洞的窗体" Caption2="中间有椭圆透明洞的窗体"
添加From2, Caption="中间有椭圆透明洞的窗体" , BackColor=&H00FFFF80&
2.Form1代码:
Option Explicit '(注释1)
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long '(注释2) 用API函数 CreateRectRgn 创建剪裁区域,用来在上边建立各种异型窗体
Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long'(注释3)用API函数 CreateRoundRectRgn创建外边的圆 角矩形
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long '(注释4) 用API函数 CreateEllipticRgn 创建里边的椭圆
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long'(注释5) 用API函数 CombineRgn 将两个区域组合在一起
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As long) As Long'(注释6) 用API函数 SetWindowRgn 将组合在一起的区域创建为新区域
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long'(注释7) 删除创建的新区域
Private Const RGN_DIFF = 4'(注释8)用Const将RGN_DIFF声明为常数4,即将两个区域相减
Private OutRgn As Long '声明变量外边圆角矩形OutRgn的数据类型为Long(长整型)
Private InRgn As Long '声明变量里边椭圆InRgn的数据类型为Long(长整型)
Private MyRgn As Long '声明变量创建的新区域MyRgn的数据类型为Long(长整型)
Private Sub Command1_Click()
If OutRgn <> 0 And InRgn <> 0 And MyRgn <> 0 Then Exit Sub ' (注释9)防止重复创建图形
Dim w As Long, h As Long '声明变量w,h的数据类型为Long(长整型)
w = ScaleX(Form1.Width, vbTwips, vbPixels) ' (注释10) 将Form1的窗体宽度由缇变为像素值后赋给变量W
h = ScaleY(Form1.Height, vbTwips, vbPixels) '将Form1的窗体高度由缇变为像素值后赋给变量h
MyRgn = CreateRectRgn(0, 0, 0, 0) '用API函数 CreateRectRgn 创建剪裁区域MyRgn
OutRgn = CreateRoundRectRgn(30, 30, w - 30, h - 30, 100, 100) '用API函数 CreateRoundRectRgn 创建圆角矩形OutRgn
InRgn = CreateEllipticRgn(100, 100, w - 100, h - 100) '用API函数 CreateEllipticRgn 创建椭圆InRgn
Call CombineRgn(MyRgn, OutRgn, InRgn, RGN_DIFF) '(注释11)将圆角矩形区域OutRgn中不属于椭圆InRgn的区域合并到MyRgn
Call SetWindowRgn(Form1.hWnd, MyRgn, True) '在Form1中以MyRgn为句柄创建新区域
Form1.BackColor = QBColor(4) '(注释12)将Form1的背景色设置为红色
End Sub
Private Sub Command2_Click()
Form2.Show '显示Form2
End Sub
Private Sub Form_Load()
OutRgn = 0 '加载窗体Form1时将区域OutRgn设置为0
InRgn = 0 '加载窗体Form1时将区域InRgn设置为0
MyRgn = 0 '加载窗体Form1时将区域MyRgn 设置为0
End Sub
Private Sub Form_Unload(Cancel As Integer)
If MyRgn <> 0 Then DeleteObject MyRgn '卸载窗体Form1时如果区域MyRgn不为0则删除MyRgn
If OutRgn <> 0 Then DeleteObject OutRgn '卸载窗体Form1时如果区域OutRgn不为0则删除OutRgn
If InRgn <> 0 Then DeleteObject InRgn '卸载窗体Form1时如果区域InRgn不为0则删除InRgn
End Sub
Form2代码:
Option Explicit'(注释1)
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long'(注释2) 用API函数 CreateRectRgn 创建剪裁区域,用来在上边建立各种异型窗体
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long,ByVal Y2 As Long) As Long'(注释4) 用API函数 CreateEllipticRgn 创建里边的椭圆
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long'(注释5) 用API函数 CombineRgn 将两个区域组合在一起
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long'(注释6) 用API函数 SetWindowRgn 将组合在一起的区域创建为新区域
Private Sub Form_Resize() '(注释13)用Form_Resize()事件设置控件的属性
Const RGN_DIFF = 4 '(注释8)用Const将RGN_DIFF声明为常数4,即将两个区域相减
Dim outer_rgn As Long '声明变量outer_rgn为Long型(长整型)
Dim inner_rgn As Long '声明变量inner_rgn为Long型(长整型)
Dim combined_rgn As Long '声明变量combined_rgn为Long型(长整型)
Dim wid As Single '声明变量wid为Single型(单精度浮点数)
Dim hgt As Single '声明变量hgt为Single型(单精度浮点数)
Dim border_width As Single '声明变量border_width为Single型(单精度浮点数)
Dim title_height As Single '声明变量title_height为Single型(单精度浮点数)
If WindowState = vbMinimized Then Exit Sub '(注释14)如果窗口最小化那么就退出.(窗口最小化的话,就没有坐标来创建图形了)
Me.ScaleMode = 3 '将Form2的ScaleMode属性设置为3,否则的话,Form2有可能编译通不过!
wid = ScaleX(Width, vbTwips, vbPixels) ' (注释10) 将Form2的窗体宽度由缇变为像素值后赋给变量wid
hgt = ScaleY(Height, vbTwips, vbPixels) ' (注释10) 将Form2的窗体高度由缇变为像素值后赋给变量 hgt
outer_rgn = CreateRectRgn(0, 0, wid, hgt) '(注释2) 用API函数 CreateRectRgn 创建外边的矩形窗体
border_width = (wid - ScaleWidth) / 2 '(注释15)计算窗体Form2边框宽度
title_height = hgt - border_width - ScaleHeight '(注释16)计算窗体Form2标题栏高度
inner_rgn = CreateEllipticRgn(border_width + ScaleWidth * 0.1, title_height + ScaleHeight * 0.1, ScaleWidth * 0.9, ScaleHeight * 0.9) '(注释17) 用 API函数 CreateEllipticRgn 创建里边的椭圆
combined_rgn = CreateRectRgn(0, 0, 0, 0) '(注释2) 用API函数 CreateRectRgn 创建剪裁区域,用来在上边建立各种异型窗体
CombineRgn combined_rgn, outer_rgn,inner_rgn, RGN_DIFF '(注释11)将矩形区域outer_rgn中不属于椭圆inner_rgn的区域合并到combined_rgn中
SetWindowRgn hWnd, combined_rgn, True '在Form2中以combined_rgn为句柄创建新区域
End Sub
回复列表 (共37个回复)
11 楼
含笑不语 [专家分:50] 发布于 2008-01-06 19:57:00
注释6: Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As long) As Long
1).SetWindowRgn
【VB声明】
Private Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
【说明】
这是那些很难有人注意到的对编程者来说是个巨大的宝藏的隐含的API函数中的一个。本函数允许您改变窗口的区域。
通常所有窗口都是矩形的——窗口一旦存在就含有一个矩形区域。本函数允许您放弃该区域。这意味着您可以创建圆的、星形 的窗口,也可以将它分为两个或许多部分——实际上可以是任何形状
【返回值】
Long,执行成功为非零值,失败为0
【备注】
为区域指定的所有坐标都以窗口坐标(不是客户坐标)表示,它们以整个窗口(包括标题栏和边框)的左上角为起点
【参数表】
hWnd ----------- Long,将设置其区域的窗口
hRgn ----------- Long,将设置的区域的句柄,一旦设置了该区域,就不能使用或修改该区域句柄,也不要删除它
bRedraw -------- Boolean,若为TRUE,则立即重画窗口
2).user32 - user32.dll
user32 - user32.dll - DLL文件信息
DLL 文件: user32 或者 user32.dll
DLL 名称: Windows User API Client DLL
描述:
user32.dll是Windows用户界面相关应用程序接口,用于包括Windows处理,基本用户界面等特性。
属于: Windows User API
系统 DLL文件: 是
常见错误: File Not Found, Missing File, Exception Errors
12 楼
含笑不语 [专家分:50] 发布于 2008-01-06 19:59:00
注释7 : Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
1).DeleteObject
Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用 SelectObject函数,比如上面介绍的字体设置,就会用到这个函数。当你创建一个位图时,这时Windows就会在内存里分配一块内 存空间,用来保存位图的数据。当你创建字体时,也会分配一块内存空间保存字体。如果程序只是分配,而不去删除,就会造成 内存使用越来越多,最后导到Windows这幢大楼倒下来。如果你忘记删除它,就造成了内存泄漏。因此,当你创建显示设备资源时 ,一定要记得删除它们啊,否则运行你的程序越长,就导致系统不稳定。记得使用DeleteObject函数去删除它们,把占用的内存 释放回去给系统。
DeleteObject函数功能:该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源, 在 对象被删除之后,指定的句柄也就失效了。
函数原型:BOOL DeleteObject(HGDIOBJ hObject);
参数:
hObject:逻辑笔、画笔、字体、位图、区域或者调色板的句柄。
返回值:成功,返回非零值;如果指定的句柄无效或者它已被选入设备上下文环境,则返回值为零。
注释:当一个绘画对象(如笔或画笔)当前被选入一个设备上下文环境时不要删除该对象。当一个调色板画笔被删除时,与该画 笔相关的位图并不被删除,该图必须单独地删除。
Windows CE:当对象在当前被选入一个设备上下文环境时,DeleteObject函数返回错误。
13 楼
含笑不语 [专家分:50] 发布于 2008-01-06 19:59:00
注释8: Private Const RGN_DIFF = 4
Const RGN_AND = 1 '将两个区域相加
Const RGN_OR = 2 '将两个区域进行或操作
Const RGN_XOR = 3 '将两个区域进行异或操作
Const RGN_DIFF = 4 '将两个区域相减
Const RGN_COPY = 5 '创建hSrcRgn1的拷贝
VB中const是干什么的?
1.描述
声明用于代替文字值的常数。
2.语法
[Public | Private] Const constname = expression
如
Private Const sMyName As String = "Harry Potter"
Private Const rPi As Single = 3.1415927
Private Const rPi2 As Single = rPi * 2
Const 语句的语法包含以下部分:
部分 描述
Public 可选。该关键字用于在 Script 级中声明可用于所有 Script 中所有过程的常数。不允许在过程中使用。
Private 可选。该关键字用于在 Script 级中声明只可用在声明所在的 Script 中的常数。不允许在过程中使用。
constname 必选。常数的名称,根据标准的变量命名约定。
expression 必选。文字或其他常数,或包括除 Is 外的所有算术操作符和逻辑操作符的任意组合。
3.作用:
定义常量。一来可以防止写错,二来修改方便。
4.说明
在默认情况下常数是公用的。过程中的常数总是专有的,其可见性无法改变。Script(标准模块)中,可用 Private 关键字来改 变 Script级常数可见性的默认值。不过,在类模块中,常数只能是私有的,而且用 Public 关键字也不能改变其可见性。 要在同一行中声明若干个常数,可用逗号将每个常数赋值分开。用这种方法声明常数时,如果使用了 Public 或 Private 关键字 ,则该关键字对该行中所有常数都有效。
5.注意
常数声明中不能使用变量、用户自定义的函数或 VBScript 内部函数(如 Chr)。按定义,它们不能是常数。另外也不能从含有 操作符的表达式中创建常数,即只允许使用简单常数。在 Sub 或 Function 过程中声明的常数是该过程的局部常数。在过程外声 明的常数是声明所在的 Script 中的全局常数。可以在任何使用表达式的地方使用常数。 常数可以使 Script 更具可读性,且易 于修改。在 Script 运行时,常数不会象变量那样无意中被改变。 如果在声明常数时没有显式地使用 As type 子句,则该常数的数据类型是最适合其表达式的数据类型。在 Sub、Function 或 Property 过程中声明的常数都是该过程的.
14 楼
含笑不语 [专家分:50] 发布于 2008-01-06 19:59:00
注释9: If OutRgn <> 0 And InRgn <> 0 And MyRgn <> 0 Then Exit Sub
这句是防止重复创建图形.后面CreateRectRgn,CreateRoundRectRgn,CreateEllipticRgn三个函数创建区域后OutRgn,InRgn和MyRgn就不等于0了
15 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:00:00
注释10: w = ScaleX(Form1.Width, vbTwips, vbPixels)
h = ScaleY(Form1.Height, vbTwips, vbPixels)
ScaleX、ScaleY 方法
--------------------------------------------------------------------------------
scalex是在VB中form的方法,功能是把坐标长度转换成像元素数
应用于将 Form,PictureBox 或 Printer 的宽度或高度值从一种 ScaleMode 属性的度量单位转换到另一种。不支持命名参数。
语法
object.ScaleX (width, fromscale, toscale)
object.ScaleY (height, fromscale, toscale)
ScaleX 和 ScaleY 方法的语法包含如下部分:
部分 描述
object 可选的。一个对象表达式,其值为“应用于”列表中的一个对象。如果省略 object,则带有焦点的 Form 对象缺省为 object。
width 必需的。为 object 指定被转换的度量单位的数量。
height 必需的。为 object 指定被转换的度量单位的数量。
fromscale 可选的。一个常数或数值,按照下列设置中的描述,指定 object 的 width 或 height 从哪一种坐标系统转换。 fromscale 可取的数值与 ScaleMode 属性的数值加上 HiMetric 的新数值相同。
toscale 可选的。一个常数或数值,按照下列“设置值”中的描述,指定 object 的 width 或 height 转换到哪一种坐标系统 toscale 可取的数值与 ScaleMode 属性的数值加上 HiMetric 的新数值相同。
设置值
用于 fromscale 和 toscale 设置值有:
常数 值 描述
vbUser 0 用户定义:指示 object 的宽度和高度设置为自定义值。
vbTwips 1 缇(每逻辑英寸 1440 缇;每逻辑厘米 567 缇)。
vbPoints 2 磅(每逻辑英寸 72 点)。
vbPixels 3 像素 (显示器或打印机分辨率的最小单位)。
vbCharacters 4 字符(水平 = 每单位 120 缇,垂直 = 每单位 240 缇)。
vbInches 5 英寸
vbMillimeters 6 毫米
vbCentimeters 7 厘米
vbHimetric 8 HiMetric。如果省略 fromscale,则 HiMetric 为缺省值。
vbContainerPosition 9 决定控件位置。
vbContainerSize 10 决定控件大小。
说明
ScaleX 和 ScaleY 方法按 fromscale 指定的度量单位取值(width 或 height),并将它转换为 toscale 指定的度量单位下相 应的值。也可以结合 PaintPicture 方法使用 ScaleX 和 ScaleY。
--------------------------------------------------------------------------------
应用于:
Form 对象、Forms 集合
PictureBox 控件
PropertyPage 对象
UserControl 对象
--------------------------------------------------------------------------------
相关基础知识:
命名参数
一参数,在对象库中预先定义了其名称。对每个参数,不必拘泥于语法所规定的特定顺序来提供值,而是只需按任何顺序用命名 参数分配值。例如,假设一方法接受了三个参数:
DoSomeThing namedarg1, namedarg2, namedarg3
在对命名参数赋值时,可使用以下语句:
DoSomeThing namedarg3 := 4, namedarg2 := 5, namedarg1 := 20
注意,命名的参数不必按语法中安排的正规顺序出现。
对象表达式
说明具体对象的表达式,可以包含对象的容器。例如,应用程序可以拥有 Application 对象,其中包含 Document 对象,而 Document 对象又包含 Text 对象。
焦点
在任何时间接收鼠标单击或键盘输入的能力。在 Microsoft Windows 环境中,在同一时间只有一个窗口、窗体或控件具有这种能 力。“具有焦点”的对象通常会以突出显示标题或标题栏来表示。用户或应用程序可设置焦点。
缇
一个与屏幕无关的单位,用来保证屏幕应用程序对屏幕元素的定位和比例在所有的显示系统上的一致性。一缇等价于 1/20 个打 印机的磅。一逻辑英寸大约有 1440 缇,一逻辑厘米约 567 缇(打印时的一英寸或一厘米所对应的屏幕上的长度)。
磅
在印刷术语中,一磅是 1/72 英寸。字体大小通常用磅来表达。
像素
即“图片元素”的简称,它是代表屏幕上的最小图形度量单位的点。像素是依赖于屏幕的,即屏幕元素的维数因显示系统和分辨率而异。
16 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:01:00
注释11: Call CombineRgn(MyRgn, OutRgn, InRgn, RGN_DIFF)
1.Call语法
[Call] name [argumentlist]
部分 描述
Call 可选参数;关键字。如果指定了这个关键字,则 argumentlist 必须加上括号,例如:Call MyProc(0)
name 必要参数,要调用的过程名称。
argumentlist 可选参数,变量
2.说明
调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要 加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。如果使用 Call 语法来调用内建函数或用户 定义函数,则函数的返回值将被丢弃。若要将整个数组传给一个过程,就要使用数组名,然后在数组名后加上空括号。
3.区别:
用法不同(一个有括号一个没括号)
call testproc(a,b,c)
testproc a,b,c
4.注意
有时调用系统API时有时不用CALL会编译不通过的,因为有的API会返回值,编译时提示表达式左边缺少变量=。如果兩個過程不在 一個窗體或者糢塊,那么Call也没用
5.作用:
Call就是调用某个函数,如 Call TestFunc()
6.补充:
call不是必须要用的,但是call是有它存在的道理的。你直接把一个函数名写在那边,如果代码很多,可读性就不是很好,相反 , 如果在前面加上一个Call,那么就有一目了然的感觉,知道知识调用的一个函数,如果没有,可读性就不是很好了!区别主要 在这 里。
17 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:01:00
注释12: Form1.BackColor = QBColor(4)
QBColor函数
颜色也可以用QBColor函数来表示,返回一个 Long,用来表示所对应颜色值的 RGB 颜色码。语法QBColor(color)必要的 color 参数是一个界于 0 到 15 的整型。始于最低有效字节,返回值指定了红、绿、蓝三原色的值,用于设置成 VBA中RGB 系统的对应 颜色。
VB中用QBColor(i)代表一种颜色
i值 颜色 i值 颜色
--- ------ --- ------
0 黑色 8 灰色 gray
1 蓝色 9 亮蓝色
2 绿色 10 亮绿色
3 青色 11 亮青色 cyan
4 红色 12 亮红色
5 粉红色 13 亮粉红色
6 黄色 14 亮黄色
7 白色 15 亮白色
VB.NET color
RGB函数 常数 返回值 颜色
-------------------- ---------- ---------- ------
RGB(0,0,0) VbBlack &H0 黑色
RGB(255,0,0) VbRed &HFF0 红色
RGB(0,255,0) VbGreen &HFF00 绿色
RGB(0,0,255) VbBlue &HFF0000 蓝色
RGB(0,255,255) VbCyan &HFFFF00 青色
RGB(255,0,255) VbMagenta &HFF00FF 紫红色
RGB(255,255,0) VbYellow &HFFFF 黄色
RGB(255,255,255) VbWhite &HFFFFFF 白色
18 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:02:00
注释13: Private Sub Form_Resize()
Form_Resize()事件:
Form_Resize()是在Form_Initialize()事件和Form_Load()事件之后的窗体初始化事件。
Form_Resize()主要设置一些控件的属性,比如:
Text1.Width=......
Command1.Top=......
Form_Resize()是一个事件过程,而不是什么属性。
此事件的激发条件是当窗体的大小有变化时发生。
在这个事件里,你可以放入你的代码,作你自己想作的事。
补充:
Initialize 事件
当应用程序创建 Form、MDIForm、User控件、Property Page Webclass、DHTML Page Designer或类的实例时发生。
1.语法
Private Sub object_Initialize( )
object 所在处代表对象表达式,其值是“应用于”列表中的一个对象。
2.说明
如下情况触发 Initialize 事件:
用 CreateObject 函数创建类的一个实例,如:
Set X = CreateObject("Project1.MyClass")
引用窗体或类实例的属性或事件,该属性或事件由用户代码自动创建。
MyForm.Caption = "Example"
应用此事件初始化 Form、MDIForm、或类所用的数据。对 Form 或 MDIForm,Initialize 事件在 Load 事件之 前发生。
3.作用:
form的initialize事件将会优先于form的load事件被触发,如果说你要在form载入的时候需要先做些什么动作的话可以在这两个 事件中加入代码。比如说初始化变量,初始化窗体控件摆放的样式,初始化控件内容等等。
19 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:02:00
注释14: If WindowState = vbMinimized Then Exit Sub
vb程序中 windowstate 属性用法?
1.语法
object.WindowState [= value]
部分 描述
Object 对象表达式,其值是“应用于”列表中的一个对象。
Value 一个用来指定对象状态的整数,“设置值”中有详细描述。
value 的设置值为:
常数 值 描述
vbNormal 0 (缺省值)正常 。
VbMinimized 1 最小化(最小化为一个图标)
VbMaximized 2 最大化(扩大到最大尺寸)
windowstate=0 '平常模式
windowstate=1 '最小化模式
windowstate=2 '最大化模式
2.说明
在窗体被显示之前,WindowState 属性常常被设置为正常 (0),而不管其初始设置值。这反映在 Height、Left、 ScaleHeight、ScaleWidth、Top、和 Width 属性设 置值中。如果窗体在它已被显示后被隐藏,那么这些属性将反映以前的状态 直到窗体被再次显示,而不管在此期间对 WindowState 属性所作的任何改变。
如:
Private Sub Form_Load ()
Form2.Show ' 显示 Form2。
End Sub
Private Sub Form_Resize ()
' 如果父窗体被最小化...
If Form1.WindowState = vbMinimized Then
' ...隐藏 Form2。
Form2.Visible = False
' 如果父窗体不再是最小化...
Else
' ...恢复 Form2。
Form2.Visible = True
End If
End Sub
3.作用
用来控制窗口的显示/隐藏
20 楼
含笑不语 [专家分:50] 发布于 2008-01-06 20:03:00
注释15: border_width = (wid - ScaleWidth) / 2
wid ------------- -------- 是Form2的窗体宽度
ScaleWidth--------- -------- 是Form2的实际工作区宽度,即除去边框的宽度
(wid - ScaleWidth) / 2------ 即窗体边框宽度
1.一个窗体中width与scalewidth的具体区别
width是容器的宽度,单位是缇(很小的单位)
scalewidth是容器里面你自己定义的宽度,比如说你想画图,表示最宽3公里,那么你就可以自己用这个属性定义自己的坐标系统
举个例子:
width变大了一倍,那么窗体在屏幕上就宽了一倍
ScaleWidth变大了一倍,窗体在屏幕上的大小不会有变化
但窗体内的坐标系会有变化
如果原来坐标是(0,0)-(100,100),那么就会变成(0,0)-(200,100)
这时,你Form1.PSet (50, 50),其实就等于ScaleWidth改变以前的Form1.PSet (25, 50)
scalewidth是一个对象内部的坐标系统的一个宽度值
而width是一个对象的宽度,其值比scalewidth要大,因为包含外部边框的长度
Scale表示这个窗体的除标题栏的坐标分辨数值...
改变了ScaleMode后,ScaleWidth和ScaleHeight都会自动随之变化,但Width和Height不会变
自己试试就知道了,
一个窗体 print me.width & "----" & me.Scalewidth ,会发现,第一个数值比第二个大一点点, me.width 获得的是窗体(包括边框)的宽度,me.Scalewidth ,获得的是窗 体( 不包括边框 )的宽度区别仅此而已,x=me.Scalewidth /2,得到的是窗体横向的中心位置,配合 y=me.scaleheight/2,就获得了窗体中心位置的坐标
scalewidth 实际工作区宽度
scaleheight 实际工作区高度
scaletop 实际工作区的上顶点
scaleLeft 实际工作区的左顶点
width 宽度
height 高度
top 上顶点
Left 左顶点
比如form拥有以上属性,如果想获得抛去边框的尺寸,则需要scale
修改scalewidth 不会改变窗体的大小 只改变坐标系统
建议读一下 窗体的坐标系统及scalemode
2.ScaleHeight、ScaleWidth 属性
当使用图形方法或调整控件位置时,返回或设置对象内部的水平 (ScaleWidth) 或垂直 (ScaleHeight) 度量单位。对于 MDIForm 对象,在设计时 是不可用的, 并且在运行时是只读的。
语法
object.ScaleHeight [= value]
object.ScaleWidth [= value]
ScaleHeight 和 ScaleWidth 属性的语法包含下面部分:
部分 描述
Object 对象表达式,其值是“应用于”列表中的一个对象。
Value 一个用来指定水平或垂直度量的数值表达式。
说明
能够使用这些属性来为绘图或打印创建一个自定义的坐标比例尺。例如,语句 ScaleHeight = 100 将改变窗体实际内部高度的度量单位。取代当前高度为 n 个单位(缇、像素、...),高度将变为 100 个自定义单位。因而,50 个单位的距离就是对象的高度/宽度的一半,101 个单位的距离将超出对象 1 个单位。
为了定义基于标准度量单位的比例尺,例如缇、磅、像素、字符、英寸、毫米、或厘米应使用 ScaleMode 属性。
这些属性设置为正值将使坐标从上向下及从左向右增加。它们设置为负值将使坐标从下向上及从右向左增加。
这些属性和相关的 ScaleLeft 与 ScaleTop 属性的使用,可以建立起一个完全的带有正、负坐标的坐标系统。所有这四个 Scale 属性与 ScaleMode 属性按下面的方式进行交互作用:
把其它任何 Scale 属性设置为任何值都将使 ScaleMode 自动地设置为 0。ScaleMode 等于 0 是用户定义。
把 ScaleMode 设置为一个大于 0 的数,将使 ScaleHeight 和 ScaleWidth 的度量单位发生改变,并将 ScaleLeft 和 ScaleTop 设置为 0。另外,CurrentX 和 CurrentY 的设置值将发生改变以反映当前点的新坐标。
也可以在语句中使用 Scale 方法设置 ScaleHeight、ScaleWidth、ScaleLeft 和 ScaleTop 属性。
注意 ScaleHeight 和 ScaleWidth 属性与 Height 和 Width 属性是不一样的。
对于 MDIForm 对象,ScaleHeight 和 ScaleWidth 仅涉及窗体中未被 PictureBox 控件覆盖的区域。在 MDIForm 的 Resize 事件中应避免使用这些属性调整 PictureBox 的大小。
3.功能:
当使用图形方法或调整控件位置时,返回或设置对象内部的水平(ScaleWidth)或垂直(ScaleHeight)度量单位。对于MDIForm对象,在设计时不可用,在运行时为只读。
说明:
(1)使用该属性为绘图或打印创建一个自定义的坐标比例尺。例如,语句ScaleHeight=100将改变窗体内部高度的度量单位,高度将变为100个自定义单位。因而,50个单位的距离 即为对象高度的一半,101个单位的距离将超出对象1个单位(ScaleWidth使用相同)。
(2)若需定义标准度量单位的比例尺,例如缇、磅、像素、字符、英寸、毫米、厘米等应使用ScaleMode属性。
(3)该属性设置为正值将使坐标从上向下及从左向右增加;设置为负值将使坐标从下向上及从右向左增加。
(4)该属性与ScaleLeft、ScaleTop属性一起使用,可建立完全的带有正、负坐标的坐标系统。这四个Scale(ScaleHeight、ScaleWidth、ScaleLeft和ScaleTop)属性与ScaleMode 属性按下面的方式交互:
设置其他任何Scale属性均将使ScaleMode属性自动地设置为0(自定义坐标)。
(5)将ScaleMode设置为大于0的数,将改变ScaleHeight和ScaleWidth的度量单位,并将ScaleLeft和ScaleTop设置为0。也可以在程序中使用Scale方法修改ScaleHeight、 ScaleWidth、ScaleLeft和ScaleTop属性。
(6)ScaleHeight和ScaleWidth属性与Height和Width属性不同。ScaleHeight和ScaleWidth属性指定控件的内边界大小,单位由控件本身指定;Height和Width属性指定控件的外边 界大小,单位由包含控件的父控件指定。
我来回复