未知 [信息技术] 浅谈关于VB6.0中的窗口控制     阅读:17217  

浅谈关于VB6.0中的窗口控制
作者: 不详 编辑: 海韵 发布日期: 2004-05-28 00:00:00 点击量: 17217 来源: haiyun.net
动没有标题栏的窗口

我们一般是用鼠标按住窗口的标题栏,然后移动窗口,当窗口没有标题栏时,我们可以用下面的方法来移动窗口: 在 BAS 文件中声明:Declare Function ReleaseCapture Lib "user32" () As LongDeclare Function SendMessage Lib "user32" _Alias "SendMessageA" ( _ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As LongPublic Const HTCAPTION = 2Public Const WM_NCLBUTTONDOWN = &HA1 然后,在 Form_MouseDown 事件中:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)ReleaseCaptureSendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&End Sub

拖动无系统标准标题栏的窗口

  在VB6.0中可以通过设置Form的属性,制作无系统标题栏的窗口。可是,由于失去了系统标题栏,如何使用鼠标拖动窗口便成了一个棘手的问题。其实,借助API函数ReleaseCapture和SendMessage,这个问题便可迎刃而解了。  首先,在module文件中加入下列声明语句:  Declare Sub ReleaseCapture Lib"User"()  Declare Function SendMessage Lib"User"(ByVal hWnd _As Integer,ByVal wMsg As Integer,ByVal wParam As Integer,_lParam As Any)As Long  Public Const WM_SYSCOMMAND=&H112  Public Const SC_MOVE=&HF010  Public Const HTCAPTION=2  然后,在Form的MouseDown事件中加入下列代码:  ReleaseCapture  Ret&=SendMessage(Me.hWnd,WM_SYSCOMMAND,_SC_MOVE+HTCAPTION,0)  ……  程序运行后,只要当光标落在Form区域时按住鼠标左键,便可以拖动窗口了。在一些要求生动活泼的界面的程序设计中,开发者常常希望自制风格独特的标题栏,以满足整个界面的要求。通过这个方法,就可以使自制的标题栏达到乱真的地步。不过,用作自制标题栏的控件,必须具有MouseDown事件以摆放上述代码。

在VB6.0中如何拖动窗体或控件

许多Windows下的应用程序,都采用了图形化的界面,这样做的好处是可以使程序界面更漂亮生动,更具吸引力。但是在这样的界面下就不能使用Windows原来的标题条了,否则将会影响界面的美观性。那么在没有标题条的情况下,如何用鼠标拖动窗体呢?或者拖动其它的控件呢?其实,采用API函数调用很容易实现,下面我们以拖动窗体(Form1)为例来具体讲一下实现方法:1.新建立一个项目,名称为:test.vbp.2. 填加一个模块,名称为:test.bas,并且在声明部分加入以下代码:Declare Function ReleaseCapture Lib "user32" () As LongDeclare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPublic Const WM_SYSCOMMAND = &H112Public Const SC_MOVE = &HF012其中ReleaseCapture函数是用来释放鼠标捕获的,SendMessage函数是一个在WindowsAPI中非常重要的函数,在这里的作用是用来向Windows发送移动窗体的消息。WM_SYSCOMMAND是向Windows发送消息的常量。SC_MOVE是控制移动窗体的常量。请注意:这里SC_MOVE的赋值一定要是&HF012,它表示鼠标对象。3.在窗体的MouseDown过程中加入以下代码:ReleaseCaptureSendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0其中ReleaseCapture函数用来释放鼠标捕获,SendMessage函数向Windows发送移动窗体的消息。4.保存并运行程序,按下鼠标,你会发现窗体会随着鼠标的移动而移动。就和其它著名的应用程序一样。以上讲述了如何在VB中用鼠标拖动窗体,其实,控件的拖动的原理是一样的。例如以下代码可以实现图片框的拖动:ReleaseCaptureSendMessage Picture1.hwnd, WM_SYSCOMMAND, SC_MOVE, 0其实,运用API函数可以实现许多你意想不到的功能。如果需要更多有关VB的其它经验与技巧。建议访问http://vb2000.kstar.com站点。

VB6.0编程中窗体的控制技巧

在VB6.0中,每个应用程序都是从窗体(Form)开始的,窗体是构成用户接口的所有控件的容器。录活运用窗体的各项属性和操作,可以为用户设计出赏心悦目的操作界面。1.窗体以当前屏幕分辨率全屏显示在应用程序的编制调试过程中,用于经常用到菜单、工具条和工具框等辅助工具,一般不将窗体设为全屏显示,以便于操作;另外,当屏幕分辨率改变时,窗体可能不能正常显示,可以在窗体的Load事件中插入下列代码,即可使窗体启动时以当前屏幕分辨率全屏显示:Private Sub Form_Load()Form1.top=0 ‘设置窗体上边界位置Form1.left=0 ‘设置窗体左边界位置Form1.Width=Screen.Width ‘设置窗体宽度为屏幕宽度Form1.Height=Screen.Height ‘设置窗体高度为屏幕高度End Sub2.使窗体保持在最上层有时应用程序需要一个信息或查询窗体总保持在最上层,即使用读书切换到其他窗体也能看到该窗体,如Microsoft Word中的Find窗体,这是通过调用Windows API函数SetWindowPos()实现的,示例如下:Option ExplicitPrivate Declare Function SetWindowPos Lib“User32”(ByValhwnd As Long,ByVal h WndInsertAfter As Long,ByVal x As Long,ByVAl y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags As Long)As LongConst HWND_TOPMOST=-1Const SWP_SHOWWINDOW=&H40Private Sub Form_load()Dim retValue As LongRetValue=setWindowPos(me.hwnd,HWND_TOPMOST,Me.CurrentX,Me.CurrentY,300,300,
SHOWWINDOW)End Sub3.窗体装入速度慢的处理技巧在缺省情况下,Visual Basic装入和显示项目的第一个窗体。如果窗体装入过程超过一秒,用户只好耐心等待,特别是在窗体中含有大型位图或许多控件时。其实,微软在OFFICE组件中已经很好地处理了这一问题。下面的程序演示了处理低速窗体的装入技巧,在应用程序启动时,首先启动一个简单的快速装入窗体,可以将公司标志或其他信息显示在上面,然后在快速窗体后台中装入慢速窗体,慢速窗体装入后将快速窗体卸出,从而解决了让用户厌烦的等待问题。Private Sub Form_Load()Form1.ShowForm1.RefreshLoad Form2 ‘装入慢速窗体Form2.Show ‘显示慢速窗体End Sub如果省略Form1.Show方法,则需装入慢速窗体后才能显示信息窗体。Refresh方法让Visual Basic更新显示后再执行后面的命令,缺省情况下,Visual Basic只在不执行其他代码时,才有机会刷新显示。慢速窗体Form2装入后,用下列代码将快速窗体Fomr1卸出:Private Sub Form_Load()UnLoad Form1 ‘卸出快速窗体End Sub一旦装入窗体,它就占用了所要的资源,所以不再需要的窗体应及时卸出,将占用的资源交还系统。另外,由于窗体装入比较慢,特别是包含位图或其他资源的大文件装入更慢,所以应用程序运行期间应尽量避免频繁装入/卸出窗体,而最好在应用程序启动时把窗体装入内存,需要时再显示。

利用VB6.0控制窗口显示风格

软件界面生动与否很大程度上决定于你对窗口的设计和控制。事实上,Windows程序员可以对系统中的任何窗口进行操纵,它意味着,Windows程序员可以直接操纵任何正在运行的应用窗口;可以发现一个特定的应用是否在运行,如果该应用没有运行还可以启动它;可以重新排列屏幕上的所有窗口;还可以使其他应用的窗口最大化或最小化。下面我们探讨一种十分有意义的应用。我们很希望在程序激活其它窗口时仍使得封面窗口处于前台,也就是说该窗口具有“ 总在最前面”(“Always On Top”)这一特性。其实Microsoft系列软件都是这样做的,当你运行Word、Excel或PowerPoint时,你会发现它们的封面窗口不随系统激活其它窗口而消失。Visual Basic For Windows(以下简称VB)作为一种可视化编程软件,以其优秀的图形化界面设计风格而著称。利用它可使软件开发周期大为缩短,然而VB对Windows DLL(动态链接库)调用的强大功能却易受不少程序员所忽略。事实上,灵活应用Windows DLL的API(应用程序接口)才能使你开发的系统更加充满活力。正是由于VB支持DLL使得我们可以随心所欲地控制窗口显示风格,从而我们可以让系统封面总处于前台,下面说明用到的API函数。.SetWindowPOSVB定义:Declare Sub SetWindowPosLib“User” (Bybal hWnd as Integer ,hWndInsertAfter as Integer,ByVal X as Integer,ByVal Y as Integer,ByVal cx as Integer ,ByVal cy as Integer,ByVal wFlags as Integer)说明:能改变窗口的位置和大小,并能修改窗口在内部窗口列表中所处的位置,以控制显示次序。参数 类型/说明hWnd Integer-需定位的窗口hWndInsertAfter Integer-窗口句柄,在窗口列表里,窗口 hWnd 将放在该窗口句柄的后面,它可以取以下值:hWnd_BOTTOM:把窗口放在窗口列表的底部;hWnd-TOP:把窗口放在Z序的顶部。Z序是窗口按层次级别显示的顺序;hWnd_TOP(MOST):把窗口放在列表的顶部,位于所有最顶窗口之后。X Integer—窗口新的X坐标,如果hWnd是一个子窗口,X给出的是父窗口的客户坐标。Y Integer—窗口新的Y坐标,如果hWnd是一个子窗口,Y给出的是父窗口的客户坐标。cx Integer—指定新窗口宽度。cy Integer—指定新窗口高度。wFlags Integer—包含下列标志之一的整数:SWP_DRAWFRAME:围绕窗口画一个边框;SWP_HIDEWINDOW:隐藏该窗口;SWP_NOACTIVATE:不激活该窗口;SWP_NOMOVE:保持当前位置(X和Y被忽略);SWP_NOREDRAW:窗口不自动重画;SWP_NOSIZE:保持当前大小(cx和cy被忽略);SWP_NOZORDER:保持窗口列表中的当前位置(hWndInsertAfter被忽略);SWP_SHOWWINDOW:显示该窗口。注释:当一个窗口成为最顶窗口时,它所有的从属窗口也成为最顶窗口;当它成为非最顶窗口时,它全部的从属窗口和拥有窗口也成为非最顶窗口,Z序表示窗口沿着从屏幕里向外延伸的假想Z轴,从顶到底的排列次序。VB实现窗口拥有“Always On Top”特性:首先,定义全局常量及函数。Global Const hWnd_TOPMOST=-1Global Const SWP_NOACTIVATE=&H10Global Const SWP_SHOWWINDOW=&H40Declare Sub SetWindowPosLib “User” ByBal hWnd as Integer,hWndInsertAfter as Integer,ByVal X as Integer,ByVal Y as Integer,ByVal cx as Integer,ByVal cy as Integer,ByVAL wFlags as Integer)主程序如下编写:Sub Main 0Screen.MousePointer=11'使鼠标变为漏斗状Load SystemCover'装载系统封面窗体SetWindowPos SystemCover.hWnd,hWnd_TOPMOST,0,0,0,0,SWP_NOACTIVATE Or SWP_SHOWWINDOW'使得封面总处于最前面Load InitWindow1'装载初始化窗体1Load InitWindow2'装载初始化窗体2

Unload SystemCover'关闭系统封面窗体Screen.MousePointer=0'使鼠标变为缺省形状End Sub

让窗口一直在上面

很多流行软件都有这样一个选项:Always on Top。它可以让窗口在最上面,别的窗口不能覆盖它。我们在 VB 中,可以使用下面的方法来实现:Private Const SWP_NOSIZE = &H1Private Const SWP_NOMOVE = &H2Private Const SWP_NOZORDER = &H4Private Const SWP_NOREDRAW = &H8Private Const SWP_NOACTIVATE = &H10Private Const SWP_FRAMECHANGED = &H20Private Const SWP_SHOWWINDOW = &H40Private Const SWP_NOCOPYBITS = &H80Private Const SWP_NOOWNERZORDER = &H200Private Const SWP_DRAWFRAME = SWP_FRAMECHANGEDPrivate Const SWP_NOREPOSITION = SWP_NOOWNERZORDERPrivate Const HWND_TOP = 0Private Const HWND_BOTTOM = 1Private Const HWND_TOPMOST = -1Private Const HWND_NOTOPMOST = -2Private Declare Function SetWindowPos Lib "user32" ( _ByVal hwnd As Long, _ByVal hWndInsertAfter As Long, _ByVal X As Long, _ByVal Y As Long, _ByVal cx As Long, _ByVal cy As Long, _ByVal wFlags As Long) As LongPrivate mbOnTop As BooleanPrivate Property Let OnTop (Setting As Boolean)if Setting ThenSetWindowPos hwnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZEElseSetWindowPos hwnd, -2, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZEEnd IfmbOnTop = SettingEnd Property Private Property Get OnTop() As Boolean'Return the private variable set in Property LetOnTop = mbOnTopEnd Property调用 OnTop=True 即可让窗口 Always On Top。

创建无 Icon 的窗口

我们在很多时候都需要那种无 Icon 的 窗口,如“关于……”“查找”等。在 VB 中,我们可以按以下步骤来创建此类窗口:1、设置窗口的 BorderStyle = 3;2、在 Form_Load 中加入:Me.Icon = LoadPicture("")

创建不规则窗口

Win32 API 有很多让你意想不到的功能。要创建特殊的不规则窗口看上去似乎很难。但我们如果我们说我们用几行代码就可以实现,这似乎不可思议。但事实就是如此!请试试:Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Sub Form_Load()Show 'The form!SetWindowRgn hWnd, CreateEllipticRgn(0, 0, 300, 200), TrueEnd Sub上述代码可以创建一个椭圆形状的窗口。怎么样??

用VB6.0获取正在系统中运行的窗口标题

熟悉Visual Basic的读者都知道,AppActivate语句是激活一个应用程序窗口其后所带的参数是指要被子激活的应用程序窗口标题条的字符串。如果要激活的是一个常见的应用程序,我们在编写程序时就可以直接写上此程序的窗口标题。例如,我们想激活Windows95的计算器,可先运行程序x=SHELL("Calc.exe",1),然后再激活计算器窗口AppActivate“计算器”,则程序焦点自动转到计算器窗口上。然而单纯使用该方法局限性非常大,比如上述例子,如果我们放在英文Windows95上运行,计算器的窗口标题就不是“计算器”,而是“Calculator”。再一个局限性就是在很多情况下我们并不知道要激活的程序窗口标题名称,如何编制一个能自动查找程序窗口标题名称的程序是本文要解决的问题。我们可以采取如下办法,来获取正在系统运行的窗口标题。在WindowsAPI中有一个函数:Get Windows (ByVal hWnd As Long ,ByVal wCmd As Long) As Long其中,hWnd是当前窗口句柄,wCmd是与hWnd有联系的常量,其含义如下:wCmd值含义GW-GHILD第一个子窗口GW-HWNDFIRST子窗口的第一兄弟窗口,其第一个顶层窗口GW-HWNDLAST子窗口的最后一个兄弟窗口,或最后一个顶层窗口GW-HWNDNEXT后继窗口GW-HWNDPRCV先前窗口GW-OWNER窗口拥有者此函数返回值是wCmd所指的窗口的句柄。我们利用此句柄 ,再用函数Get WindowsText (ByVal hWnd As Long ,ByVal Ipstring As String, ByVal cch As Long) As Long,将句柄hWnd指定的窗口标题放入一个字符串变量Ipstring中,cch是指放入Ipstring中的最大字符数。此函数成功时返回字符串长度,如果窗口无标题则返回零。在使用Get WindowsText函数前,还要先用函数Get WindowsTextLength (ByVal hWnd As Long )As Long得到hWnd指定窗口标题的长度,放入cch中。自编一个过程FindTitle()查找系统中正在运行的所有标题,首先获得第一个顶层窗口句柄currwnd,而后采用While…Wend循环结构,当currwnd不为零而且标题文本长度不为零时,将获得的标题存入列表框Combo1,再找后继窗口的句柄,当句柄currwnd=0时表示已没有了后继窗口,退出循环。这样就将系统中所有的窗口句柄及标题找出来了。然而调试中发现用此方法找到的窗口标题非常多,这说明Windows系统运行时有许多隐含的窗口,而这些窗口是我们所不需要的,而且用AppActivate激活时也出现错误。因此我们再自编一个过程Sift ()查找可激活的窗口。其方法是用AppActivate逐个激活所有窗口,出现错误的丢掉,保留可激活的窗口标题,放入列表框Combo2。首先新建窗体Form1,Caption=“获取窗口标题”,在窗体Form1上建立两个标签,Label1,Caption=“所有窗口标题”,Label2.Caption=“可激活的窗口标题”;建立两个下拉列表框,Combo1存放系统中的所有标题名称,Combo2存放可激活的标题名称;再建立两个命令按钮,Command1.Caption=“激活窗体”,可对所列窗体进行测试,命令按钮Command2.Caption=“刷新”,点击它可重新查找所有在系统中的窗体名称,当本程序运行以后又运行了新程序时使用此按钮。从VB系统菜单上选取Project中的Add Module,将下述API函数及一些常量录入。'Module 模块Declare Function GetWindow Lib "user32"(ByVal hwnd As Long, ByVal wCmd As Long)As LongDeclare Function GetWindowText Lib "user32" Aias"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String,ByVal cch As Long)As LongDeclare Function GetWindowText Length Lib "user32" Aias"GetWindowTextLengthA" (ByVal hwnd As Long)As LongPublic Const GW-HWNDFIRST=0Public Const GW-HWNDLAST=1Public Const GW-HWNDNEXT=2Public Const GW-HWNDPREV=3Public Const GW-OWNER=4建立两个子程序:Sub FindTitle ()'查找桌面上的所有窗口标题Dim currwnd As IntegerCombo1.ClearCurrwnd=GetWindow (hwnd, GW-HWNDFIRST)While currwnd<>0Length= GetWindow TextLength (currwnd)listitem$=Space $(length +1)length= GetWindow Text (currwnd,listitem$,length+1)if length>0 ThenCombo1.Addltem listitem $End ifcurrwnd= GetWindow (currwnd, GW-HWNDNEXT)if Combl1.ListCount>0 ThenCombo1.Text=Combol.List (0)Combo1.Listindex =0ElseMsgBox“没有发现可活动的窗口”,16,“活动”End ifWendEnd SubSub Sift ()'测试窗口能否活动i=0Combo2.ClearDoOn Local Error Resume NextAppActivate Combo1.List (i)If Err =0 ThenCombo2.Additem Combo1.List(i)End ifi=i+1Loop Unti 1 i=Combo1.ListCount-1AppActivate Form1.CaptionIf Combo2.ListCount>0 thenCombo2.Text =Combo2.List (0)Combo2.Listindex =0ElseMsgBox “没有发现可活动窗口”,16,“活动”End ifEnd SubPrivate Sub Form-Load ()Form1.Show'首先将本窗体显示出来,否则查找出的窗体标题没有本身MsgBox "开始查找窗口标题"Call FindTitleCall SiftEnd SubPrivate Sub Command1-Click ()F $=Combo2.TextOn Local Error Resume NextAppActivate F $End SubPrivate Sub Command2-Click ()Call FindTitleCall SiftEnd 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 PoinTAPIx As Integery As IntegerEnd TypeDeclare 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 PoinTAPIDim hparent As Integerp.x=(Source.Left+Source.Width/2)/Screen.Twipsperpixel)p.y=(Source.Top+Source.Height/2)/Screen.Twipsperpixel)hparent=GetParent(source.hwnd)ClientToScreen hparent ptSetCursorPos pt.x pt.yEnd Sub使用该子程序很容易,例如我们想把鼠标移动到按钮Command1上,就可使用语句Move Cursor On Command1您会看到鼠标箭头已经指着按钮Command1。需要说明的是,千万不要滥用该子程序。让鼠标自己满屏乱飞,我们的用户会感到失去对应用程序的控制,这是违反我们的初衷的。在有数个输入框的窗口中(这在数据库应用程序中是很典型的),当用户完成第一个输入框的输入后,总爱习惯性的加一个回车,希望输入焦点落到下一个输入框中(DOS中大多数应用程序是如此),可往往事与愿违,这一回车却触发了拥有Default特性的按钮,结果不是关闭了当前窗口就是又蹦出另一窗口。用户睁大眼睛看着屏幕,“咦?!我到底做了什么?”这是Windows新用户经常遇到的事情。解决它其实很容易,只需在输入框的KeyPress事件中加入如下代码:IF KeyASCII=13 ThenKeyASCII=0Sendkeys "{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=0For N%=1 To 100If N%>100 ThenExit subEnd IfP3d.FloodPercent=N%Next N%End Sub按F5,运行该程序,点击Command按纽,即可看到流动条效果。

用VB实现窗体背景花纹和全屏幕图形界面及动态功能提示

在开发软件的过程中,为提高软件的商品化程度,感觉到界面的美观程度是一个软件能否获得成功的一个重要因素,我们仔细研究了一些成功的商品化软件,从这些软件上可以看到,程序窗口背景能显示出非常美丽的、富有立体感的花纹。而采用Visual Basic进行窗体设计,若只按照系统提供的功能,只能从有限的几种颜色中选择一种颜色或采用程序绘制一些简单的线条。而想实现立体感很强的纹理图案,一般只能采用窗体的PICTURE属性调用位图文件,使用这种方法实现有许多缺点 ,其一是窗体大小受位图大小的限制,调整起来麻烦,不具有通用性和灵活性;其二是浪费资源,因为花纹图案基本上是重复图案,采用与窗体同样大小的位图是一种浪费。

一、窗体背景花纹实现的方法。在窗体上建立一个网格控件,设定网格行不可见,去掉固定行和固定列,用程序实现网格控件与窗体同样大小,并随窗体大小的改变而改变。然后设计一个花纹图案,形成BMP位图文件(本文程序使用文件Pict1.bmp),或者从其它图象中截取一段图案,也可以利用Windows系统提供的图案(如c:\windows\Tiles.bmp),将其调入Picture控件。设定网格的每个单元与该图案大小相同,使单元的数量正好覆盖整个窗体背景,再将所有单元均显示该图案。通过子程序Backpict()实现以上过程,不论图案大小、窗体大小,程序都能自动调整网格控件大小和网格单元大小及单元数量。该程序在Visual Basic 5.0上调试成功。1.新建窗体Form1,属性如下:Caption =“背景花纹的实现”Borderstyle=3(无最大、最小化按钮)2.建网格控件Grid1,它的位置和大小将在程序中设置(与Form1同样大),属性为:Enabled = False(焦点不会落在网格控件Grid1上)Fillstyle=1(改变所有单元Text特性)Fixedcols=0(无固定行)Fixedrows=0(无固定列)Gridlines = False(网格行不可见),Visible = True3.建立图象控件Picture1,程序运行时将背景花纹基本图案放入其中,属性为Visible = False(不可见)Autosize = True(自动调整大小)4.控件中加入Sheridan 3D Controls,选取其中的三维命令按钮SSCommand,建立两个按钮SSCommand1.Caption=“退出”SSCommand2.Caption=“更换背景”(演示不同的背景图案)它们的属性Picture可调用与背景相同或不同的图案,如果使用普通的命令按钮控件Command也可,只是命令按钮无背景图案。5.建立背景图案形成子程序:Dim pictfile As String '位图文件名Dim FILEPATH As String '文件路径Sub Backpict(pictfile)picture1.ScaleMode = 3Form1.ScaleMode = 3picture1.Picture = LoadPicture(pictfile)'网格控件覆盖整个窗体背景grid1.Top = -1grid1.Left = -1grid1.Width = Widthgrid1.Height = Heightgrid1.Cols=Int(Form1.ScaleWidth/picture1.ScaleWidth) + 1grid1.Rows=Int(Form1.ScaleHeight/picture1.ScaleHeight) + 1'所有单元大小等于基本图案大小For i = 0 To grid1.Cols - 1For j = 0 To grid1.Rows - 1grid1.ColWidth(i) = picture1.ScaleWidth * 15grid1.RowHeight(j) = picture1.ScaleHeight * 15Next jNext I '选定所有单元grid1.SelStartCol = 0grid1.SelStartRow = 0grid1.SelEndCol = grid1.Cols - 1grid1.SelEndRow = grid1.Rows - 1grid1.Picture = Picture1.PictureEnd Sub 6.窗体主程序Private Sub Form_Load()Private Sub Form_Load() '得到运行程序路径名,路径名后带反斜杠If Right(App.Path, 1) <> "\" ThenfilePath = App.Path & "\"ElsefilePath = App.PathEnd If'窗体初始显示由Tiles.bmp基本图案组成的背景pictfile = "c:\windows\Tiles.bmp"backpict (pictfile)End Sub7.退出程序命令按钮Private Sub SSCommand1_Click()EndEnd Sub8.演示不同的底纹图案Private Sub SSCommand2_Click() '两种背景图案交替演示If pictfile = filePath & "Pict1.bmp" Thenpictfile = "c:\windows\Tiles.bmp"Elsepictfile = filePath & "Pict1.bmp"End IfBackpict (pictfile)End Sub

二、 全屏幕图形界面设计图形界面是现代软件中人机交互的主要手段。为了追求界面的统一和美观,在软件开放过程中,图形界面大多采用全屏幕构图方式。这是通过将窗体的边框设置为无边框(BorderStyle=None),将窗体显示模式设置为极大化(WindowState=Maximized)来实现的。当一个窗体界面的设计中要容纳多张图片和多个控制时,将出现窗体显示速度明显变慢的现象,严重影响了程序运行的流畅性。为了解决这一问题,在开放过程中,采用了一种将【界面设计窗体】与【功能实现窗体】分开处理的方法。在【界面设计窗体】中,首先按功能的需要和界面设计的创意,将所需的大量图片和控制在屏幕上安排好,选择美观的字体、颜色、线型,对屏幕界面进行设计、修饰加工;然后在其全屏幕运行的状态下,利用剪贴技术,将这一设计完成的图形界面全屏幕复制到剪贴板上;接着将这一屏幕映象作为一张图片粘贴在【功能实现窗体】的背景上。这样,从外观上看,两个窗体的形状完全相同,而在屏幕的显示速度上,后者明显加快。这时,【功能实现窗体】中的控件已变成一个象征性的图标,对它的操作,可在控制图标的对应位置上设置一个Image 类型的图象框,通过对图象框的操作,来代替原先对控制对象的操作。采用这种方法,使窗体界面设计的灵活性大大增加,可以任意发挥,而不用担心控件、图片太多,影响窗体的显示速度。但采用这种方法,将不可避免地增加应用程序本身所占的存储容量,这是以容量换取速度必须付出的代价。

三、 动态功能提示信息的实现在现代软件设计中,多数功能图标、按钮都在界面上直接确定其对应的名称,同时也提供了动态提示的功能,即当鼠标移至某一控件时,或使鼠标的形状用一具有象征意义的图标代替,或自动出现一条文字提示,下面介绍一下如何实现这种先进的提示模式。动态改变鼠标的图形形状,是通过控件的MousePointer属性设置为13(自定义),然后在MouseIeon属性中选取一ICO图标文件来完成的;动态文字提示功能是利用控件的MouseMove事件来实现的:将功能提示处理程序设计在对应的MouseMove事件过程中,当鼠标移动到该控件范围区域时,即可触发程序执行,完成动态功能提示;为了防止处理程序反复触发,必须设置一控制开关,使处理程序只在鼠标第一次触发该控件区域时被执行;取消功能提示的处理程序设计在窗体的MouseMove事件中,说明程序如下:Dim FirstTouch As Boolean '防止反复触发处理程序的控制变量Private Sub ControlObject- MouseMove ()If FirstTouch ThenFirstTouch =False '显示功能提示字符End Sub Private Sub Form- MouseMove ()FirstTouch =True '取消功能提示字符End Sub


[ 海韵 于 2004-05-28 00:00:00  星期五   ]  
相关文章:

网友评论
正在加载评论...


免责申明 | 版权申明 | 联系我们 | 关于
Copyright © 2001-2025 Haiyun.Net All Rights Reserved
地址:深圳市南山区南油天安工业区1栋3楼 邮编:518000
有我可以帮您的吗?QQ:12457275  
粤ICP备05017321号-1