VB界面技巧(一)2009-05-13 15:57用了2年的VB,面对着越来越多的界面漂亮的程序,我问自己:为什么我开发的程序的界面没有那么漂亮?不能老是说:“程序的重点是功能,而不是界面”,那是欺骗自己的做法。为了进一步掌握VB的界面设计技巧,我进行了分析和实验,并将结果总结出来,以利于大家参考。(本文重点放在界面上,不是说程序的功能不重要,不要引起误解。) 一、了解界面所涉及到的元素
当我们惊叹于一个漂亮的程序界面时,吸引我们眼球的,到底时什么?不过是:调和形状。调,主要指各种颜的搭配,可以利用图片背景和渐变填充效果获的更丰富的视觉效果。形状,主要指窗体的位置控制和外部轮廓控制,经常涉及到不外乎:磁性窗体,异形窗体,可变窗体,自动隐藏。在VB中,主要体现在一个对象的外观、位置、字体这几类属性上。下面,我们针对以上元素,充分挖掘VB的潜力,看看如何利用VB设计漂亮的界面。同时,我们还要考虑如何使这种方法程序化,以便于日后的运用。
在做进一步分析之前,我们要遵从一个约定,即:尽可能利用VB本身提供的功能。
好了,我们开始吧。
二、程序界面设计思路
这一点很重要,不管是开发较大的工程项目,还是做很小的实用工具,我们往往习惯于忽略掉程序界面设计这个环节,在经过软件分析和设计(主要是数据结构)后,便匆忙开始编写各各功能模块,当然,相应的界面元素也就随手建立了。等各部分代码都调试通过了,要发布软件时,我们才会发现:自己的姑娘虽然内秀,却面貌丑陋。于是,赶紧做做美容。这样出来的程序,界面一般都很普通,是Windows的标准风格。物以稀为贵,天天见到Windows标准风格的程序,就不稀罕了。要做出漂亮的程序界面,首先,我们得重视它,要把程序的界面设计当做一个必要环节来执行。好了,这一点很容易,拿起PhotoShop或者3DMax吧,做好程序的界面设计。(如何利用PhotoShop 或者3DMax等工具设计程序界面的细节就省略了。有时间的时候,在补上。)
三、如何将设计好的程序界面和程序结合起来?
首先,要熟悉VB常用控件的界面属性,也就是每个对象的外观属性,在VB6的属性栏中,选择按分类排序,可以看到该对象所支持的外观属性。下面以十分常用的几个控件为例,逐个考虑其界面相关的属性。
1、Form对象。
外观:
1)appearance:如果在设计时将其设置为 1,那么Appearance属性在画出控件时带有三维效果。如果窗体的 BorderStyle 属性被设置为固定双边框(vbFixedDouble,或 3),窗体的标题和边框也是以有三
维效果的方式绘画的。将 Appearance 属性设置为 1,也导致窗体及其控件的 BackColor 属性被设置为这样的颜,该颜是为操作系统控制面板“颜选项”中的按钮表面颜选定的。将 MDIForm 对象的 Appearance 属性设置为 1,只对 MDI 父窗体产生影响。想要在 MDI 子窗体上具有三维效果,必须将每个子窗体的 Appearance 属性设置为 1。
2)BackColor:返回或设置对象的背景颜。可以选择使用系统外观颜和调板颜。
3)ForeColor:返回或设置在对象里显示图片和文本的前景颜。可以选择使用系统外观颜和调板颜。
4)BorderStyle:返回或设置对象的边框样式。对 Form 对象和 Textbox 控件在运行时是只读的。 其中,设置为0,即无边框,则整个窗体可由我们来从新规划设计其布局。注意:将窗体对象的Caption设置为空,并将ControlBox属性设置为False,也可以去掉标题栏。
5)FillStyle:如果 FillStyle 设置为 1(透明),则忽略 FillColor 属性,但是 Form 对象除外。
6)返回或设置用于填充形状的颜:FillColor 也可以用来填充由 Circle 和 Line 图形方法生成的圆和方框。
7)Picture:很重要的一个属性,可以设置背景图片,从而可以实现更绚丽的界面效果。
位置:
1)Width,Height:窗体的外部高度和宽度,包括边框和标题栏,以缇来度量。通过TwipsPerPixelX、TwipsPerPixelY ,我们可以用熟悉的像素单位来控制窗体的大小。比如:form.width=800*TwipsPerPixelX,将窗体的宽度设置成800像素。
2)Left:返回或设置对象内部的左边与它的容器的左边之间的距离。
3)Top:返回或设置对象的内顶部和它的容器的顶边之间的距离。
4)StartUpPosition:返回或设置一个值,指定对象首次出现时的位置,运行时不能使用。
总结:通过控制窗体以及窗体上的控件,可以缩放窗体。
字体:
1)通过漂亮的字体,也可轻易获得一些特殊效果。
总结:窗体的字体设置好以后,后来在该窗体上建立的一些控件会自动继承其字体属性,利用这一点,可以提高我们的开发效率。
2、Lable对象,基本上和Form对象的界面属性类似,关键是BackStyle比较重要,其透明属性对于制作漂亮的界面很方便。
3、CommandButton对象,基本上和Form对象的界面属性类似,关键是Style比较重要,将style设置为:Graphical,便可以支持图形,有利于制作漂亮的界面。
4、Image和Picture对象,顾名思义,这两各对像本身就很适合于制作漂亮的图形界面。
5、Frame对象,通过将其BorderStyle设置为:none,可以去掉边框,然后,结合Image控件,可以实现图形化。
6、CheckBox和Option对像,都可通过其Style属性,将其设置为支持图
形的方式,从而适合于美化界面。
7、其他对象:除了上面提到的几个常用对象之外,还有许多其他的对象,我们也可充分利用其外观属性,使其更漂亮,但你很快就会发现,很多对象是不支持图形的,甚至有些对象的某些部分连背景颜也不可以改变。比如:FileListBox的垂直滚动条,默认的颜就是灰,无法直接改变。
8、Vb本声提供的Microsoft Forms 2.0 Libarary 控件,也对界面美化提供了强有力的支持。
总结:在VB中,要美化界面,首先是要充分利用各控件的背景图片,前景,背景;其次,要灵活地利用Image控件的图象属性,对程序界面进行装饰;最后,就是要善于利用Image控件来传递事件。
设想:有没有一个皮肤控件?它可以遮盖住所有放在它下面的控件,但又不抢先获得焦点?当然,即使没有这样的控件,我们也可以通过Imgage控件实现这种想法。我们可以用Image控件来将用户的操作传递给被Image控件覆盖的部分
在VB界面技巧(一)中,我们探讨了Vb本身的一些界面相关属性。如果程序比较大,那么就可能会用到多个窗体,控件就更多了,如何使所有的控件都具有一致的界面风格呢?好了,这一篇主要探讨一下这个问题:
四、界面形状控制
五、如何统一管理Vb控件的界面属性?
我们可以制作一个外观类(clsFace),用来控制整个程序的界面。可以在clsFace中,提供常用的界面属性,程序的各个界面部分,均使用clsFace提供的外观属性。这样一来,就可以用clsFace统一控制程序的界面风格。这种思路,十分类似于网页设计中常用的Css,通过一个Css文件,就可以方便地控制整个网站的界面风格。
1、字体控制:建立typeFont数据类型,其中中包含:fontName,fontSize,fontEffect
2、颜控制:建立typeColor数据类型,其中中包含:ForeColor,BackColor,MaskColor
3、图元控制:建立typePic数据类型,其中中包含:FormIcon,FormPicutre,FillPicture
这样,基本上就可以统一控制整个程序的界面风格了。如果属性不够,可以继续扩充,以满足实际需要。
下载源程序>>>
六、它山之石,可以攻玉
通过查资料,发现了一个很好的皮肤控件,即:ActiveSkin。目前,ActiveSkin的最高版本为4.27。大家可以到www.softshape/去下载最新版本。
1、使用ActiveSkin的优点:
1)快捷。很快就可以改变程序的界面风格,只需要个皮肤文件(后缀是skn),在程序中加两行代码就可以了。
改变button按钮的形状
2)界面漂亮大方。皮肤文件可以自己制作,也可以使用别人做好的。
2、使用ActiveSkin的缺点:
在使用中发现了一些问题:(也有可能是我没熟练掌握ActiveSkin)
1)界面比较
复杂的程序,在使用ActiveSkin后,变的面目全非。
2)有些控件,在使用ActiveSkin后,无法显示。比如:image控件。
总结:Active控件的确是个不错的工具,它很适合于修饰现有的程序界面,同时,也具有通用性,但也存在一些问题,应该酌情使用。
VB编程之路-如何让界面美化2010年05月01日 星期六 下午 06:12如果大家用过《Windows优化大师》
,肯定会被它的界面所倾倒,其实利用ActiveSkin 就可以办到,甚至更爽,但是如果要做的共享软件只是一个文件,在加上几个OCX累赘,似乎很是不爽,看看VB是怎么利用别的东东来实现的吧。
  首先新建一个EXE工程,再在窗体上拖几个Label控件,看看Label 的强大功能吧,原理就是利用Label来模拟一个按钮,但是首先要将Label控件的属性要调一下,
Name: LblBtn,
BorderStyle: 1,
Appearance: 0,
Alignment: 2,
  这样一个按钮的雏形就已经出来了,如果工程量很大,可以将多个Label控件的Name属性设为一样的,对于按钮的识别就要靠识别Index属性了,为了方便起见,在进入到代码编辑窗口,输入以下代码:
Private Const LBL_BACK_COLOR = &HE0E0E0 ’正常时Label控件的背景
Private Const LBL_WHEN_MOUSE_MOVE = &HC0C0C0 ’鼠标移动时Label的背景
Private Const LBL_WHEN_MOUSE_DOWN = &H808080 ’鼠标按下时Label的背景
再在Form的Load事件中输入以下内容
Private Sub Form_Load()
Dim Count As Integer
For Count = 0 To 3 ’请将此出的3换成你的LblBtn数量的个数-1
LblBtn(Count).BackColor=LBL_BACK_COLOR ’初始化LblBtn的背景
Next Count
End Sub
然后再在LblBtn的MouseMove和MouseDown事件中来搞定剩余部分:
Private Sub LblBtn_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) ’当鼠标按在LblBtn上时
LblBtn(Index).BackColor = LBL_WHEN_MOUSE_DOWN ’临时改变LblBtn背景颜
End Sub
Private Sub LblBtn_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) ’鼠标在LblBtn上面移动时触发该事件
Dim Count As Integer
DoEvents ’暂时将系统控制权教给系统
If Button Then Exit Sub ’如果按钮被按下就退出该过程
For Count = 0 To 3
If Count <> Index Then ’如果按下的不是其它按钮
LblBtn(Index).BackColor = LBL_BACK_COLOR ’将背景设为正常
Else
LblBtn(Index).BackColor = LBL_WHEN_MOUSE_MOVE ’将背景设为鼠标移动的背景
End If
Next Count
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Count As Integer
DoEvents
For Count=0 To 3
LblBtn(Count).BackColor=LBL_BACKCOLOR ’恢复背景
Next Count
End
  本来利用Windows的消息
系统来完成这一“艰巨”的任务最简单,可问题就来了,Label控件没有窗口句柄怎么办?可是此问题与题无关,写了会有骗稿费之:)
OK,Label控件就讲到这里,在来说说TextBox控件,
  各位看关恐怕看惯了白颜的背景,那么就换换颜以养养俺们那和绵羊一样的眼睛(为什么说绵羊?俺也不知道),可是VB提供的RGB函数弄出来的颜不是怎么好看,这里俺来教大家一个小Tip,RGB函数的Red,Green,Blue这三个参数若一样,则产生的颜是灰度,当然越接近白颜越好,但也不能让各位看不出来,俺建议TextBox的背景为RGB(235,235,235),各位还是实战一下,将一个TextBox拖到窗体上,属性设置如下
Appearance 0
BorderStyle 1
MutilLine True
千万不要设置ScrollBars属性,否则会影响效果
在Form的Load事件中初始化TextBox
Dim bkColor As Long
Private Sub Form_Load()
bkColor=RGB(235,235,235)
Text1.BackColor=bkColor
End Sub
在Form和Text1的MouseMove事件中:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.BorderStyle = 0
End Sub
Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
DoEvents
Text1.BorderStyle = 1
End Sub
在按下F5试试是不是很Cool?
  可能各位看关玩过石器时代,一定会对里面的TextBox的效果感到很爽,VB还不是可以做到,有焦点的控件可以使用SetFocus方法来为其设置焦点,可是一个窗体上如果控件太多了,一个一个的用SetFocus是不是太傻了?这一节的主角就是--------API函数,
首先声明:
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
但是这里的SetFocus会和控件的SetFocus会搞混淆,改改吧,
Private Declare Function nSetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
只要Alias指向的接口是对的前面的函数名称简直就是摆设,
在建立一个过程:
Public Function sSetFocus() As Long
Dim CPos As POINTAPI,Successfull As Boolean,hWnd As Long
DoEvents
Successfull =GetCursorPos(CPos)
If Not Successfull Then Exit Sub ’如果未成功则退出该过程
hWnd=WindowFromPoint(CPos.x,CPos.y)
sSetFocus=nSetFocus(hWnd)
End Sub
  在窗体上放一个Timer控件,Interval 属性设为100,就是0.1秒,在Timer1控件的Timer事件中填入sSetFocus,在运行一下看看,效果怎么样?
  可

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。