自制IE风格按钮控件

翻译|其它|编辑:郝浩|2007-09-24 09:33:14.000|阅读 921 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

网上的  IE  风格按纽控件不可谓少,然而天下的免费午餐总不会让你轻轻松松到吃下去,其中个味众人自知。其实,在  VB6.0中,IE  风格按纽很容易制作,真正的核心代码只需调用两个  API  函数。

按常规,IE  风格按纽的制作原理是,放置四条边线在  Image    Label  控件四周,在  Image  Label  控件的  MouseMove  事件中,改变左,上,右,下线的  Visible    BorderColor  属性,按纽呈现浮起效果,同时改变  Image  控件的  Picture  属性,调入盘旋(Hover)图片;在  Image    Label    MouseDown  事件中通过改变  Image    Label  控件的位置(右下移)按纽呈现按下效果;鼠标离开按纽,按纽恢复平坦(Flat)状态。

如果你正在这样做,将会发现一个致命的问题。那就是,MouseMove  事件只能检测到鼠标在 Image    Label  两个控件本身范围内的移动,你没有办法检测鼠标的离开。计算机世界曾经登载过一个解决的办法,利用  SetCapture    ReleaseCapture API  函数。经  SetCapture  设定的控件可以强制性地捕捉鼠标在整个屏幕上的移动。这样,不管鼠标是不是在控件界面范围内移动,控件都可以捕捉得到。经过实践发现这个解决方案仍然存在一个问题,那就是,SetCapture  所设定控件在 ReleaseCapture  前,自动提示(ToolTipText)功能被抑制。这意味着这样编制的按纽没有自动提示功能,对很多人来说,这难以忍受。

WIN32 API  函数集是个不折不扣的庞大宝藏,你总能从里面找到你需要的工具。GetCursorPos  WindowFromPoint  两个函数可以完美地解决这个问题。GetCursorPos  可以返回鼠标指针相对整个屏幕的坐标,WindowFromPoint  则根据鼠标指针的坐标,返回指针所处的控件的句柄。在这里,还需要引入一个定时器 (Timer)控件。

整个编程原理是,在  UserControl_Show  事件中,先将定时器置为无效。在  Image    Label  MouseMove  事件中,执行使按纽浮起的代码,然后将定时器置为有效,这时定时器开始倒计时,在计时器的  Timer  事件中,用上述  API  函数检测鼠标指针是否已经离开了按纽,如果离开,则使按纽恢复平坦状态并立即使计时器无效,否则继续检测。我们看到,计时器的真正用途是用来触发事件,以检测鼠标的离开。将计时器置为无效是为了在不必要的时间,降低计时器对  CPU  的占用。

以下是函数和所需数据类型声明。

Private Type POINTAPI
X As Long
Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib "user32" _
(ByVal xPoint As Long, ByVal yPoint As Long) As Long

  VB6.0中新建一个  ActiveX Control  项目。添加  LineLeft,LineTop,LineRight, LineBottom  四条边线,一个  Image  控件  Image1,一个  Label  标签控件  Label1,一个定时器控件  Timer1。关于用  VB  创建  ActiveX  控件的步骤这里不作描述(可以参考本文所附完整源代码)。与按纽制作有关的主要代码如下:

Private Sub UserControl_Show()
Timer1.Interval = 1 1/1000

Timer1.Enabled=False  
关闭定时器
  UserControl  的提示信息引入  Image1,Label1控件,
If UserControl.Ambient.UserMode = True Then
  RunTime
Image1.ToolTipText = UserControl.Extender.ToolTipText
Label1.ToolTipText = UserControl.Extender.ToolTipText
End If

......此处添加其它代码

End Sub
Private Sub Image1_MouseMove
(Button As Integer, Shift As Integer, _
X As Single, Y As Single)

....... 此处添加使按纽呈现浮起效果的代码

Timer1.Enabled = True 打开定时器

End Sub

Private Sub Timer1_Timer() 定时器触发

Dim MousePosition As POINTAPI
Dim ReturnValue As Long
Dim HwndHoverWindow As Long
ReturnValue = GetCursorPos(MousePosition)

返回鼠标指针坐标

返回指针所指位置的控件句柄

HwndHoverWindow = WindowFromPoint
(MousePosition.X, MousePosition.Y)
If HwndHoverWindow < > UserControl.hWnd Then

如果鼠标离开了按纽区域

...... 此处添加使按纽恢复平坦状态的代码

Timer1.Enabled = False  将定时器关闭,

以释放资源

End If
End Sub
Private Sub Image1_MouseDown
(Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If Button = 1 Then

....... 此处添加使按纽呈现按下状态的代码

End If
End Sub


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:百川之家

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP