VB6.0中的窗口控制技巧(2)

VB 专栏收录该内容
65 篇文章 0 订阅

让窗口一直在上面 

很多流行软件都有这样一个选项:Always on Top。它可以让窗口在最上面,别的窗口不能覆盖它。我们在 VB 中,可以使用下面的方法来实现:
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_NOCOPYBITS = &H80
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Private Const HWND_TOP = 0
Private Const HWND_BOTTOM = 1
Private Const HWND_TOPMOST = -1
Private Const HWND_NOTOPMOST = -2
Private 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 Long
Private mbOnTop As Boolean
Private Property Let OnTop (Setting As Boolean)
if Setting Then
SetWindowPos hwnd, -1, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
Else
SetWindowPos hwnd, -2, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End If
mbOnTop = Setting
End Property
 
Private Property Get OnTop() As Boolean
'Return the private variable set in Property Let
OnTop = mbOnTop
End 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 Long
Private 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), True
End 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 Long
Declare Function GetWindowText Lib "user32" Aias"GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String,ByVal cch As Long)As Long
Declare Function GetWindowText Length Lib "user32" Aias"GetWindowTextLengthA" (ByVal hwnd As Long)As Long
Public Const GW-HWNDFIRST=0
Public Const GW-HWNDLAST=1
Public Const GW-HWNDNEXT=2
Public Const GW-HWNDPREV=3
Public Const GW-OWNER=4
建立两个子程序:
Sub FindTitle ()
'查找桌面上的所有窗口标题
Dim currwnd As Integer
Combo1.Clear
Currwnd=GetWindow (hwnd, GW-HWNDFIRST)
While currwnd<>0
Length= GetWindow TextLength (currwnd)
listitem$=Space $(length +1)
length= GetWindow Text (currwnd,listitem$,length+1)
if length>0 Then
Combo1.Addltem listitem $
End if
currwnd= GetWindow (currwnd, GW-HWNDNEXT)
if Combl1.ListCount>0 Then
Combo1.Text=Combol.List (0)
Combo1.Listindex =0
Else
MsgBox“没有发现可活动的窗口”,16,“活动”
End if
Wend
End Sub
Sub Sift ()
'测试窗口能否活动
i=0
Combo2.Clear
Do
On Local Error Resume Next
AppActivate Combo1.List (i)
If Err =0 Then
Combo2.Additem Combo1.List(i)
End if
i=i+1
Loop Unti 1 i=Combo1.ListCount-1
AppActivate Form1.Caption
If Combo2.ListCount>0 then
Combo2.Text =Combo2.List (0)
Combo2.Listindex =0
Else
MsgBox “没有发现可活动窗口”,16,“活动”
End if
End Sub
Private Sub Form-Load ()
Form1.Show'首先将本窗体显示出来,否则查找出的窗体标题没有本身
MsgBox "开始查找窗口标题"
Call FindTitle
Call Sift
End Sub
Private Sub Command1-Click ()
F $=Combo2.Text
On Local Error Resume Next
AppActivate F $
End Sub
Private Sub Command2-Click ()
Call FindTitle
Call Sift
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<Br">    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写的,它其中就有一个“永远在最上面”的功能,就是这样实现的。

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值