主题:[转帖]窗口界面的编程技巧(1998-1999收集整理)
制作渐变的窗口背景色
吴斌
在许多Windows软件的安装程序中,时常可以看到以某种颜色由浅至深的渐变为背景的窗口。使用VB制作这类窗口的方法有不少,而通过调用API函数绘制渐变的窗口背景色,似乎是一种既简单又节省资源的方法。
首先,在module文件中加入下列声明语句:
Declare Function CreateSolidBrush Lib"GDI"(ByVal crColor As Long) As Integer
Declare Function FillRect Lib"USER"(ByVal hDC As Integer,lpRect As RECT,ByVal hBrush As Integer)As Integer
Declare Function DeleteObject Lib"GDI"(ByVal hObject As Integer)As Integer
Type RECT
left As Integer
top As Integer
right As Integer
bottom As Integer
EndType
然后,在窗口的Paint事件中加入下列代码:
Private Sub Form_Paint()
Dim Color As Integer
Dim hBrush As Integer
Dim OldMode As Integer
Dim RetVal As Integer
Dim StepSize As Integer
Dim X As Integer
Dim FillArea As RECT
OldMode%=Me.ScaleMode
Me.ScaleMode=3
StepSize%=1+Me.ScaleHeight/80
Color%=255
FillArea.left=0
FillArea.right=Me.ScaleWidth
FillArea.top=0
FillArea.bottom=StepSize%
For X%=1 To 80
hBrush%=CreateSolidBrush (RGB(0,0,Color%))
RetVal%=FillRect(Me.hDC,FillArea,hBrush%)
RetVal%=DeleteObject(hBrush%)
Color%=Color%-4
If Color% < 0 Then Color%=0
FillArea.top=FillArea.bottom
FillArea.bottom=FillArea.bottom+StepSize%
Next
Me.ScaleMode=OldMode%
EndSub
按F5运行,就会出现一个以从上至下、由浅至深的渐变蓝色为背景的窗口。对上述代码稍加改动,便可制作出各种颜色和水平方向的渐变背景。
如何在VB和Delphi中快速实现立体化窗口显示
在VB和Delphi中,我们可以很方便地创建具有立体化观感的窗口,这也是近两年来,Win3.X中较为流行的显示方式。许多专业化的软件都采用了这种立体化的窗口和相应的控件,达到了赏心悦目的效果。下面我们来谈谈如何在目前最流行的两种Win编程语言中实现这样的效果。
其实,无论是VB还是Delphi,要实现这种效果都较为容易,在编程中,并不需要调用外部的DLL,在程序运行时,会自动调用CTL3dV2.dll。
我们先来看看如何在VB中实现:
1.新建一个窗口。
2.在窗口form的属性列表中有一项Auto3D属性,缺省值为false,将其设置为true。它是控制VB中是否显示立体窗口的重要属性。
3.在form的属性列表中还有一项BorderStyle属性,这是控制窗口的边框显示类型,将其设置为3-Fixed Double。
4.现在可以运行这个程序了,你将会看到立体窗口出现。
将Auto3D属性设置为true,还有一个很好的副作用,那就是在这个窗口上的Text、Frame、CheckBox、OptionButton和ListBox都自动具有了立体效果。
在Delphi中实现似乎显得更加容易和直观:
1.新建一个窗口。
2.在窗口form的属性列表中有一项BorderStyle属性,它的缺省值为bsSizeable,表示边界可以任意调整,将其重新设置为bsDialog。
3.运行程序,你会发现立体窗口出现了。(看来,Delphi中将这种立体化窗口称为“对话窗口”,确实如此,比如在Word中,对话窗口都是这种立体化的显示,而主窗口仍然是一般的风格。)
与VB中的Auto3D类似,在Delphi中有一个属性为Ctl3D,将其设置为true,将使所有在这个窗口上的控件具有立体观感,并且这种变化是立刻反映的,而不象VB中在运行时才能看到。
在Delphi的窗口form中,你还可以通过设置FormStyle属性为fsStayOntop来轻而易举的实现“永远浮在其他窗口”上的效果。著名的“译林”Win版本就是用Delphi写的,它其中就有一个“永远在最上面”的功能,就是这样实现的。
用Visual Basic设计更好的用户界面
有时在一个窗口中出现较多的控制件时,如果能向导式地建议用户下一步该做什么,不失为上策。
在Visual Basic的程序设计中,我们可以使用语句:Object.SetFaocus使我们希望的控件得到输入焦点,举个例子:在Form1中我们加入一个按钮Command1和一个文本输入Text1,双击按钮控件,然后键入如下代码:
Text1.SetFocus
再按F5运行程序,您就会看到一单击按钮,文本框会立即取得输入焦点。另外,我们还可以使用语句:Sendkeys "{TAB}"使下一个控件获得焦点,但我们需要在设计时确定各控件的Index值。(在Properties窗口中)让控件自己感知自己的工作已完成,而主动将焦点让出,会使用户觉得应用程序很聪明,也减少了用户出错的机会。
可是当焦点切换的两个控件相隔有一定距离时,上述的方法有时也不足以引起用户的注意,那么一种好的解决方法是将鼠标箭头也移到控件上。可惜,VB并不支持鼠标移动,那我们就求助API函数,API函数SetCursorPos可让我们如愿。
下面是子程序MoveCursorOn,它可让鼠标移动到指定控件上方。
下列代码请放在declarations段中:
Type PoinTAPI
x As Integer
y As Integer
End Type
Declare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)
Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)
Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer
然后建立一个新的子程序(ALT+N→N→键入子程序名MoveCursorOn),下面是子程序的代码:
Sub MoveCursorOn(source As Control)
Dim Pt As PoinTAPI
Dim hparent As Integer
p.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)
p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)
hparent=GetParent(source.hwnd)
ClientToScreen hparent pt
SetCursorPos pt.x pt.y
End Sub
使用该子程序很容易,例如我们想把鼠标移动到按钮Command1上,就可使用语句
Move Cursor On Command1
您会看到鼠标箭头已经指着按钮Command1。
需要说明的是,千万不要滥用该子程序。让鼠标自己满屏乱飞,我们的用户会感到失去对应用程序的控制,这是违反我们的初衷的。
在有数个输入框的窗口中(这在数据库应用程序中是很典型的),当用户完成第一个输入框的输入后,总爱习惯性的加一个回车,希望输入焦点落到下一个输入框中(DOS中大多数应用程序是如此),可往往事与愿违,这一回车却触发了拥有Default特性的按钮,结果不是关闭了当前窗口就是又蹦出另一窗口。用户睁大眼睛看着屏幕,“咦?!我到底做了什么?”这是Windows新用户经常遇到的事情。
解决它其实很容易,只需在输入框的KeyPress事件中加入如下代码:
IF KeyASCII=13 Then
KeyASCII=0
Sendkeys "{TAB}"
END IF
这样,当用户在这个输入框中键入Enter时,就象键入TAB键时,焦点被移到下一控件上。但需注意,这种方法不适用于多行的TextBox,即TextBox的MultiLine特性设为True时,因为这时的回车键是起换行的作用。
利用VB三维面板控件设计流动条
VB提供了一个三维面板控件,利用这个控件可设计图形效果的立体界面,从而使应用程序的截面显得更生动、美观,该控件还可以设置各种形式的背景,然后在背景上显示各种形式的字符,令人感兴趣的是,使用三维面板控件,还可设计我们经常在安装程序中看到的表示安装进度的流动条,并可显示进程的流动条,并可显示进程百分比,改变流动条的颜色等。
一. 介绍属性
FloodColor: 确定流动条的颜色,缺省为蓝色。
FloodPercent: 显示当前过程如流动条进行的百分比,参数改变时显示的百分数和流动条的面积改变,设为一整型值,取值范围是0~100。
FloodShowpct: 决定是否在三维面板控件上显示百分比,是一个逻辑值。为Ture时显示,为False时不显示。
FloodType: 表示用户对三维面板控件的使用方式。可取值有6个,如下所示:
0 缺省设置
1 表示流动条方向从左到右
2 表示流动条方向从右到左
3 表示流动条方向从上到下
4 表示流动条方向从下到上
5 表示使用指定的颜色从圆心向外画圆
二. 流动条设计
如果在Windows 3.x下,工具箱中不存在三维面板控件,可选择File菜单中的"Add File…" 进行添加,在弹出的对话框中找到Windows\System目录,然后选定Threed.vbx文件即可,如果使用VB 4.0,需在Tools菜单中选择Custom Control命令,选定Sheridan 3d Controls项,按OK按纽,可在工具箱中增加三维面板控件。
启动VB ,在窗体中画一水平方向的长方形三维面板控件,按F4,在属性窗口中设置其Name为P3d、Bevellnner为2-Raised、FloodType为1、FloodshowPct为True,再在窗体中画一个按纽Command1,双击该按纽,键入下面的代码:
Sub Command1_Click()
P3d.floodpercent=0
For N%=1 To 100
If N%>100 Then
Exit sub
End If
P3d.FloodPercent=N%
Next N%
End Sub
按F5,运行该程序,点击Command按纽,即可看到流动条效果。
利用VB的图片框实现屏幕的滚动
对于学习使用VB来编程的电脑爱好者来说,可能会遇到这样一个问题:就是如何实现屏幕的滚动,因为当要显示的内容超出了屏幕的大小后,利用VB所提供的垂直滚动条和水平滚动条等控件是不可能直接实现这一特殊显示功能的。那么有没有其它的办法呢?答案是肯定的。我们知道VB的图片框是用来显示图形的,但它还有许多其它用途,比如可以用来创建一些动画图形等。其实对于上面的问题我们也可以利用图片框来巧妙地解决。方法如下:
首先,单击工具框中的图片框(Picture Box)控件和命令按钮控件,在窗体(Form1)上建立图片框对象Picture1和命令按钮对象Command1,将命令按钮的Caption属性设置为"退出",Picture1的大小设置为显示区域的大小,再单击工具框中的图片框控件,在Picture1上建立另一个图片框对象Picture2,将它的Left和Top属性设置为0。用文本框,标签框等其它控件或导入一幅图象在Picture2上设定具体的显示内容,当然Picture2的大小一定要先调整到能全部容纳所有要显示的内容,最后单击工具框中的垂直滚动条控件和水平滚动条控件,在窗体(Form1)上分别建立垂直滚动条对象VScroll1和水平滚动条对象HScroll1,并设置好它们的属性。至此在窗体(Form1)上的所有设置工作就完成了,下面是具体的程序代码:
Private Sub VScroll1_Change()
Picture2.Top= -VScroll1.Value
End Sub
Private Sub Hscroll1_Change()
Picture2.Left= -HScroll1.Value
End Sub
Private Sub Command1_Click()
End
End Sub
运行程序,当按下横、竖滚动条时,就能使显示内容实现左右、上下的滚动。此方法简单易行,有兴趣的朋友不妨试一试。
吴斌
在许多Windows软件的安装程序中,时常可以看到以某种颜色由浅至深的渐变为背景的窗口。使用VB制作这类窗口的方法有不少,而通过调用API函数绘制渐变的窗口背景色,似乎是一种既简单又节省资源的方法。
首先,在module文件中加入下列声明语句:
Declare Function CreateSolidBrush Lib"GDI"(ByVal crColor As Long) As Integer
Declare Function FillRect Lib"USER"(ByVal hDC As Integer,lpRect As RECT,ByVal hBrush As Integer)As Integer
Declare Function DeleteObject Lib"GDI"(ByVal hObject As Integer)As Integer
Type RECT
left As Integer
top As Integer
right As Integer
bottom As Integer
EndType
然后,在窗口的Paint事件中加入下列代码:
Private Sub Form_Paint()
Dim Color As Integer
Dim hBrush As Integer
Dim OldMode As Integer
Dim RetVal As Integer
Dim StepSize As Integer
Dim X As Integer
Dim FillArea As RECT
OldMode%=Me.ScaleMode
Me.ScaleMode=3
StepSize%=1+Me.ScaleHeight/80
Color%=255
FillArea.left=0
FillArea.right=Me.ScaleWidth
FillArea.top=0
FillArea.bottom=StepSize%
For X%=1 To 80
hBrush%=CreateSolidBrush (RGB(0,0,Color%))
RetVal%=FillRect(Me.hDC,FillArea,hBrush%)
RetVal%=DeleteObject(hBrush%)
Color%=Color%-4
If Color% < 0 Then Color%=0
FillArea.top=FillArea.bottom
FillArea.bottom=FillArea.bottom+StepSize%
Next
Me.ScaleMode=OldMode%
EndSub
按F5运行,就会出现一个以从上至下、由浅至深的渐变蓝色为背景的窗口。对上述代码稍加改动,便可制作出各种颜色和水平方向的渐变背景。
如何在VB和Delphi中快速实现立体化窗口显示
在VB和Delphi中,我们可以很方便地创建具有立体化观感的窗口,这也是近两年来,Win3.X中较为流行的显示方式。许多专业化的软件都采用了这种立体化的窗口和相应的控件,达到了赏心悦目的效果。下面我们来谈谈如何在目前最流行的两种Win编程语言中实现这样的效果。
其实,无论是VB还是Delphi,要实现这种效果都较为容易,在编程中,并不需要调用外部的DLL,在程序运行时,会自动调用CTL3dV2.dll。
我们先来看看如何在VB中实现:
1.新建一个窗口。
2.在窗口form的属性列表中有一项Auto3D属性,缺省值为false,将其设置为true。它是控制VB中是否显示立体窗口的重要属性。
3.在form的属性列表中还有一项BorderStyle属性,这是控制窗口的边框显示类型,将其设置为3-Fixed Double。
4.现在可以运行这个程序了,你将会看到立体窗口出现。
将Auto3D属性设置为true,还有一个很好的副作用,那就是在这个窗口上的Text、Frame、CheckBox、OptionButton和ListBox都自动具有了立体效果。
在Delphi中实现似乎显得更加容易和直观:
1.新建一个窗口。
2.在窗口form的属性列表中有一项BorderStyle属性,它的缺省值为bsSizeable,表示边界可以任意调整,将其重新设置为bsDialog。
3.运行程序,你会发现立体窗口出现了。(看来,Delphi中将这种立体化窗口称为“对话窗口”,确实如此,比如在Word中,对话窗口都是这种立体化的显示,而主窗口仍然是一般的风格。)
与VB中的Auto3D类似,在Delphi中有一个属性为Ctl3D,将其设置为true,将使所有在这个窗口上的控件具有立体观感,并且这种变化是立刻反映的,而不象VB中在运行时才能看到。
在Delphi的窗口form中,你还可以通过设置FormStyle属性为fsStayOntop来轻而易举的实现“永远浮在其他窗口”上的效果。著名的“译林”Win版本就是用Delphi写的,它其中就有一个“永远在最上面”的功能,就是这样实现的。
用Visual Basic设计更好的用户界面
有时在一个窗口中出现较多的控制件时,如果能向导式地建议用户下一步该做什么,不失为上策。
在Visual Basic的程序设计中,我们可以使用语句:Object.SetFaocus使我们希望的控件得到输入焦点,举个例子:在Form1中我们加入一个按钮Command1和一个文本输入Text1,双击按钮控件,然后键入如下代码:
Text1.SetFocus
再按F5运行程序,您就会看到一单击按钮,文本框会立即取得输入焦点。另外,我们还可以使用语句:Sendkeys "{TAB}"使下一个控件获得焦点,但我们需要在设计时确定各控件的Index值。(在Properties窗口中)让控件自己感知自己的工作已完成,而主动将焦点让出,会使用户觉得应用程序很聪明,也减少了用户出错的机会。
可是当焦点切换的两个控件相隔有一定距离时,上述的方法有时也不足以引起用户的注意,那么一种好的解决方法是将鼠标箭头也移到控件上。可惜,VB并不支持鼠标移动,那我们就求助API函数,API函数SetCursorPos可让我们如愿。
下面是子程序MoveCursorOn,它可让鼠标移动到指定控件上方。
下列代码请放在declarations段中:
Type PoinTAPI
x As Integer
y As Integer
End Type
Declare Sub SetCursorPos Lib "User"(Byval x As Integer,Byval y As Integer)
Declare Sub ClientToScreen Lib "User"(Byval hwnd As Integer,IpPoint As PointAPI)
Declare Function GetParent Lib "User"(Byval hwnd As Integer)As Integer
然后建立一个新的子程序(ALT+N→N→键入子程序名MoveCursorOn),下面是子程序的代码:
Sub MoveCursorOn(source As Control)
Dim Pt As PoinTAPI
Dim hparent As Integer
p.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)
p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)
hparent=GetParent(source.hwnd)
ClientToScreen hparent pt
SetCursorPos pt.x pt.y
End Sub
使用该子程序很容易,例如我们想把鼠标移动到按钮Command1上,就可使用语句
Move Cursor On Command1
您会看到鼠标箭头已经指着按钮Command1。
需要说明的是,千万不要滥用该子程序。让鼠标自己满屏乱飞,我们的用户会感到失去对应用程序的控制,这是违反我们的初衷的。
在有数个输入框的窗口中(这在数据库应用程序中是很典型的),当用户完成第一个输入框的输入后,总爱习惯性的加一个回车,希望输入焦点落到下一个输入框中(DOS中大多数应用程序是如此),可往往事与愿违,这一回车却触发了拥有Default特性的按钮,结果不是关闭了当前窗口就是又蹦出另一窗口。用户睁大眼睛看着屏幕,“咦?!我到底做了什么?”这是Windows新用户经常遇到的事情。
解决它其实很容易,只需在输入框的KeyPress事件中加入如下代码:
IF KeyASCII=13 Then
KeyASCII=0
Sendkeys "{TAB}"
END IF
这样,当用户在这个输入框中键入Enter时,就象键入TAB键时,焦点被移到下一控件上。但需注意,这种方法不适用于多行的TextBox,即TextBox的MultiLine特性设为True时,因为这时的回车键是起换行的作用。
利用VB三维面板控件设计流动条
VB提供了一个三维面板控件,利用这个控件可设计图形效果的立体界面,从而使应用程序的截面显得更生动、美观,该控件还可以设置各种形式的背景,然后在背景上显示各种形式的字符,令人感兴趣的是,使用三维面板控件,还可设计我们经常在安装程序中看到的表示安装进度的流动条,并可显示进程的流动条,并可显示进程百分比,改变流动条的颜色等。
一. 介绍属性
FloodColor: 确定流动条的颜色,缺省为蓝色。
FloodPercent: 显示当前过程如流动条进行的百分比,参数改变时显示的百分数和流动条的面积改变,设为一整型值,取值范围是0~100。
FloodShowpct: 决定是否在三维面板控件上显示百分比,是一个逻辑值。为Ture时显示,为False时不显示。
FloodType: 表示用户对三维面板控件的使用方式。可取值有6个,如下所示:
0 缺省设置
1 表示流动条方向从左到右
2 表示流动条方向从右到左
3 表示流动条方向从上到下
4 表示流动条方向从下到上
5 表示使用指定的颜色从圆心向外画圆
二. 流动条设计
如果在Windows 3.x下,工具箱中不存在三维面板控件,可选择File菜单中的"Add File…" 进行添加,在弹出的对话框中找到Windows\System目录,然后选定Threed.vbx文件即可,如果使用VB 4.0,需在Tools菜单中选择Custom Control命令,选定Sheridan 3d Controls项,按OK按纽,可在工具箱中增加三维面板控件。
启动VB ,在窗体中画一水平方向的长方形三维面板控件,按F4,在属性窗口中设置其Name为P3d、Bevellnner为2-Raised、FloodType为1、FloodshowPct为True,再在窗体中画一个按纽Command1,双击该按纽,键入下面的代码:
Sub Command1_Click()
P3d.floodpercent=0
For N%=1 To 100
If N%>100 Then
Exit sub
End If
P3d.FloodPercent=N%
Next N%
End Sub
按F5,运行该程序,点击Command按纽,即可看到流动条效果。
利用VB的图片框实现屏幕的滚动
对于学习使用VB来编程的电脑爱好者来说,可能会遇到这样一个问题:就是如何实现屏幕的滚动,因为当要显示的内容超出了屏幕的大小后,利用VB所提供的垂直滚动条和水平滚动条等控件是不可能直接实现这一特殊显示功能的。那么有没有其它的办法呢?答案是肯定的。我们知道VB的图片框是用来显示图形的,但它还有许多其它用途,比如可以用来创建一些动画图形等。其实对于上面的问题我们也可以利用图片框来巧妙地解决。方法如下:
首先,单击工具框中的图片框(Picture Box)控件和命令按钮控件,在窗体(Form1)上建立图片框对象Picture1和命令按钮对象Command1,将命令按钮的Caption属性设置为"退出",Picture1的大小设置为显示区域的大小,再单击工具框中的图片框控件,在Picture1上建立另一个图片框对象Picture2,将它的Left和Top属性设置为0。用文本框,标签框等其它控件或导入一幅图象在Picture2上设定具体的显示内容,当然Picture2的大小一定要先调整到能全部容纳所有要显示的内容,最后单击工具框中的垂直滚动条控件和水平滚动条控件,在窗体(Form1)上分别建立垂直滚动条对象VScroll1和水平滚动条对象HScroll1,并设置好它们的属性。至此在窗体(Form1)上的所有设置工作就完成了,下面是具体的程序代码:
Private Sub VScroll1_Change()
Picture2.Top= -VScroll1.Value
End Sub
Private Sub Hscroll1_Change()
Picture2.Left= -HScroll1.Value
End Sub
Private Sub Command1_Click()
End
End Sub
运行程序,当按下横、竖滚动条时,就能使显示内容实现左右、上下的滚动。此方法简单易行,有兴趣的朋友不妨试一试。