Visual Basic编程之路-如何让界面美化

来源:网络时间:2011-04-25 11:11:08

  如果大家用过《Windows优化大师》,肯定会被它的界面所倾倒,其实利用ActiveSkin就可以办到,甚至更爽,但是如果要做的共享软件只是一个文件,在加上几个OCX累赘,似乎很是不爽,看看VB是怎么利用别的东东来实现的吧。

  首先新建一个EXE工程,再在窗体上拖几个Label控件,看看Label的强大功能吧,原理就是利用Label来模拟一个按钮,但是首先要将Label控件的属性要调一下,

Name:LblBTn,

BorderStyle:1,

Appearance:0,

Alignment:2,

  这样一个按钮的雏形就已经出来了,如果工程量很大,可以将多个Label控件的Name属性设为一样的,对于按钮的识别就要靠识别Index属性了,为了方便起见,在进入到代码编辑窗口,输入以下代码:

PrivateConstLBL_BACK_COLOR=&HE0E0E0’正常时Label控件的背景色

PrivateConstLBL_WHEN_MOUSE_MOVE=&HC0C0C0’鼠标移动时Label的背景色

PrivateConstLBL_WHEN_MOUSE_DOWN=&H808080’鼠标按下时Label的背景色

再在Form的Load事件中输入以下内容

PrivateSubForm_Load()

DimCountAsInteger

ForCount=0To3’请将此出的3换成你的LblBTn数量的个数-1

LblBtn(Count).BackColor=LBL_BACK_COLOR’初始化LblBTn的背景

NextCount

EndSub

然后再在LblBTn的MouseMove和MouseDown事件中来搞定剩余部分:

PrivateSubLblBtn_MouseDown(IndexAsInteger,ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)’当鼠标按在LblBTn上时

LblBtn(Index).BackColor=LBL_WHEN_MOUSE_DOWN’临时改变LblBTn背景颜色

EndSub

PrivateSubLblBtn_MouseMove(IndexAsInteger,ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)’鼠标在LblBTn上面移动时触发该事件

DimCountAsInteger

DoEvents’暂时将系统控制权教给系统

IfButtonThenExitSub’如果按钮被按下就退出该过程

ForCount=0To3

IfCount<>IndexThen’如果按下的不是其它按钮

LblBTn(Index).BackColor=LBL_BACK_COLOR’将背景设为正常

Else

LblBTn(Index).BackColor=LBL_WHEN_MOUSE_MOVE’将背景设为鼠标移动的背景

EndIf

NextCount

EndSub

PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

DimCountAsInteger

DoEvents

ForCount=0To3

LblBTn(Count).BackColor=LBL_BACKCOLOR’恢复背景

NextCount

End

  本来利用Windows的消息系统来完成这一“艰巨”的任务最简单,可问题就来了,Label控件没有窗口句柄怎么办?可是此问题与题无关,写了会有骗稿费之:)

OK,Label控件就讲到这里,在来说说TextBox控件,

  各位看关恐怕看惯了白颜色的背景,那么就换换颜色以养养俺们那和绵羊一样的眼睛(为什么说绵羊?俺也不知道),可是VB提供的RGB函数弄出来的颜色不是怎么好看,这里俺来教大家一个小Tip,RGB函数的Red,Green,Blue这三个参数若一样,则产生的颜色是灰度,当然越接近白颜色越好,但也不能让各位看不出来,俺建议TextBox的背景为RGB(235,235,235),各位还是实战一下,将一个TextBox拖到窗体上,属性设置如下

Appearance0

BorderStyle1

MutilLineTrue

千万不要设置ScrollBars属性,否则会影响效果

在Form的Load事件中初始化TextBox

DimbkColorAsLong

PrivateSubForm_Load()

bkColor=RGB(235,235,235)

Text1.BackColor=bkColor

EndSub

在Form和Text1的MouseMove事件中:

PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

Text1.BorderStyle=0

EndSub

PrivateSuBText1_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

DoEvents

Text1.BorderStyle=1

EndSub

在按下F5试试是不是很Cool?

  可能各位看关玩过石器时代,一定会对里面的TextBox的效果感到很爽,VB还不是可以做到,有焦点的控件可以使用SetFocus方法来为其设置焦点,可是一个窗体上如果控件太多了,一个一个的用SetFocus是不是太傻了?这一节的主角就是--------API函数,

首先声明:

PrivateTypePOINTAPI

xAsLong

yAsLong

EndType

PrivateDeclareFunctionGetCursorPosLib"user32"Alias"GetCursorPos"(lpPointAsPOINTAPI)AsLong

PrivateDeclareFunctionWindowFromPointLib"user32"Alias"WindowFromPoint"(ByValxPointAsLong,ByValyPointAsLong)AsLong

PrivateDeclareFunctionSetFocusLib"user32"Alias"SetFocus"(ByValhwndAsLong)AsLong

但是这里的SetFocus会和控件的SetFocus会搞混淆,改改吧,

PrivateDeclareFunctionnSetFocusLib"user32"Alias"SetFocus"(ByValhwndAsLong)AsLong

只要Alias指向的接口是对的前面的函数名称简直就是摆设,

在建立一个过程:

PublicFunctionsSetFocus()AsLong

DimCPosAsPOINTAPI,SuccessfullAsBoolean,hWndAsLong

DoEvents

Successfull=GetCursorPos(CPos)

IfNotSuccessfullThenExitSub’如果未成功则退出该过程

hWnd=WindowFromPoint(CPos.x,CPos.y)

sSetFocus=nSetFocus(hWnd)

EndSub

  在窗体上放一个Timer控件,Interval属性设为100,就是0.1秒,在Timer1控件的Timer事件中填入sSetFocus,在运行一下看看,效果怎么样?

  可是有的先生小姐要问了,TextBox难道就不能用ScrollBar吗?非也非也,选工程->部件->MicrosoftWindowsCommonControls-26.0(SP3)就是你的答案,至于卷动TextBox就去研究SendMessage函数吧,否则又有骗稿费之嫌,如果想作绿色软件,不想用控件,可以用俺前面讲到的Label控件,利用字体Webdings来模拟ScrollBar,需要注意的是,如果模拟ScrollBar,上下左右箭头分别是5,6,3,4,别忘了把字体设为Webdings

  再来讲讲窗体的美化,其实将BorderStyle属性设为0就是很好的2D美化;)可是,这样一来,问题又来了,怎么办?凡事都要请API来帮忙,这里需要两个API,一下是该API的声明:

PublicDeclareFunctionReleaseCaptureLib"user32"Alias"ReleaseCapture"()AsLong注释:这个API是用来解下鼠标的追踪器,关于他的过多用法以及详细介绍可以写信向俺咨询,

还有

#p#副标题#e#

PublicDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong’这个该不要俺多介绍了吧

PublicConstHTCAPTION=2’代表窗体的标题区

PublicConstWM_NCLBUTTONDOWN=&HA1’表示非工作区左键按下

  原理很简单,卸下鼠标追踪器后向Form发送一个移动窗体的消息,其实做到这一点的方法很多,但俺个人认为这一种最简单,添加一个过程:

PublicSubMoveForm(hWndAsLong)

DoEvents

ReleaseCapture

SendMessagehWnd,WM_NCLBUTTONDOWN,HTCAPTION,0&

EndSub

在Form的MouseMove事件中:

PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

IfButton=vbLeftButtonThenMoveFormhWnd’如果按下鼠标左键就移动窗体

EndSub

台下的这位小姐又纳闷了,可是光秃秃的窗体没有了标题栏也不好看,俺要向这为小姐推荐俺的东东-ActiveX控件,ToolSign,需要的人可以写信给俺联系,

该控件需要在代码编辑区域内添加一下代码:

’一下声明是用在ToolSign的AutoQuit属性的

PublicConstEXIT_FORCE=2’注意,在VB中运行的时候如果选用此退出方式,VB也会退出

PublicConstEXIT_MESSAGE=1’由操作系统发送关闭消息

PublicConstEXIT_CUSTOM=Not(EXIT_FORCEOrEXIT_MESSAGE)’自定义

将其注册后在部件栏中把e-DogkidStudioToolsSign打钩,添加到工具箱中,双击加入到窗体中,

在Form的Load事件中添加一下初始化代码:

PrivateSubForm_Load()

WithSign1

.AutoQuit=EXIT_CUSTOM

.ParentsHWND=hWnd’填了此属性可以直接用ToolSign来移动窗体而不需要前面的代码

EndWith

EndSub

Sign1的Click事件

PrivateSubSign1_Click()

End’关闭程序

EndSub

在Form的Resize事件中添加一下代码:

PrivateSubForm_Resize()

Sign1.Width=Width

EndSub

如果想让窗体可以改变大小,可以修改一下属性

Caption""

BorderStyle2或5

ControlBoxFalse

  不知道各位看关见过爆炸试的窗体没有?,没有见过可以从俺要另外一个俺自己的ActiveXDLL,我的那个东东其实是给我的Software作运行库的,各位若不嫌弃,可以用用,注册后在工程->引用->e-DogkidRuntimeLibrary

然后在窗体Load事件中输入:

PrivateSubForm_Load()

DimSystemAse_Dogkid_Runtime_Library.System

SetSystem=Newe_Dogkid_Runtime_Library.System

Show

System.BoomIthDC,60,Width,Height,Left,Top

SetSystem=Nothing

EndSub

#p#副标题#e#

文章内容来源于网络,不代表本站立场,若侵犯到您的权益,可联系我们删除。(本站为非盈利性质网站) 联系邮箱:rjfawu@163.com
多特网友 2013-01-26 01:55:10 回复
想快点学会,就是写个字形结合就好了。
多特网友 2012-01-06 15:32:54 回复
高##你不够格,充其量是比初学者好点点,你写出来的东西高##没有眼看,初学者看不懂的东西,如同垃圾。
多特网友 2012-01-02 16:19:37 回复
来点初学者能看懂的行不?
多特网友 2011-11-15 17:50:04 回复
能不能边给教程边给出截图啊 光是文字讲解看的头大
多特网友 2011-09-23 10:41:17 回复
good very good
多特网友 2011-07-16 18:09:02 回复
我实在受不了。。。。。全是中文的标点符号。。。这还是编程?。真受不了
多特网友 2011-09-23 10:41:17 回复
good very good
多特网友 2011-11-15 17:50:04 回复
能不能边给教程边给出截图啊 光是文字讲解看的头大
多特网友 2012-01-02 16:19:37 回复
来点初学者能看懂的行不?
多特网友 2012-01-06 15:32:54 回复
高##你不够格,充其量是比初学者好点点,你写出来的东西高##没有眼看,初学者看不懂的东西,如同垃圾。