⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ba38.htm

📁 VB教程
💻 HTM
字号:
<HTML>
<HEAD>
<TITLE>自制IE风格按纽控件</TITLE>
 
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
 
</head>
<p align="center"><script src="../../1.js"></script></a>
<BODY topMargin=4 vLink=#0000ff>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
  <TBODY>
  <TR>
    <TD height="52"> 
      <DIV align=center>
      <CENTER>
          <table border=0 cellpadding=0 cellspacing=0 width=679 align="center">
            <tbody> 
            <tr> 
              <td width=200 height="59"> 
                 
    </TD></TR><!--msnavigation--></TBODY></TABLE>
<table border=0 cellpadding=0 cellspacing=0 width="100%">
  <tbody> 
  <tr><!--msnavigation--><td valign=top height="123"> 
      <div align=center> 
        <table border=1 bordercolor=#b9d9ff cellpadding=0 cellspacing=0 
      class=table width=755>
          <center>
            <tr> 
               
              <td width="100%" height="8"> 
                <div align="center"> <strong>自制IE风格按纽控件</strong>&nbsp;&nbsp;&nbsp; 
                   </font></span></div>
              </td>
            </tr>
            <tr> 
              <td 
            width="100%" class="unnamed1" height="124"> 
                <div align="left">
                  <p align="left"> <br>
                    </font></p>
                  <p align="left">  作者:刘清涛</font></p>
                  <p align="left"><font size="-1" face="宋体">网上的IE风格按纽控件不可谓少,然而天下的免费午餐总不会让你轻轻松松到吃下去,其中个味众人自知。其实,在VB6.0中,IE风格按纽很容易制作,真正的核心代码只需调用两个API函数。 
                    </font></p>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    按常规,IE风格按纽的制作原理是,放置四条边线在Image和Label控件四周,在 Image和Label控件的MouseMove事件中,改变左,上,右,下线的Visible 
                    和 BorderColor属性,按纽呈现浮起效果,同时改变Image控件的Picture 属性,调入盘旋(Hover)图片;在Image和Label的MouseDown事件中通过改变Image和Label控件的位置(右下移)按纽呈现按下效果;鼠标离开按纽,按纽恢复平坦(Flat)状态。 
                    </font></p>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    如果你正在这样做,将会发现一个致命的问题。那就是,MouseMove事件只能检测到鼠标在Image和Label两个控件本身范围内的移动,你没有办法检测鼠标的离开。 
                    “计算机世界”曾经登载过一个解决的办法,利用SetCapture和ReleaseCapture API函数。经SetCapture设定的控件可以强制性地捕捉鼠标在整个屏幕上的移动。这样,不管鼠标是不是在控件界面范围内移动,控件都可以捕捉得到。经过实践发现这个解决方案仍然存在一个问题,那就是,SetCapture所设定控件在 
                    ReleaseCapture前,自动提示(ToolTipText)功能被抑制。这意味着这样编制的按纽没有自动提示功能,对很多人来说,这难以忍受。 
                    </font></p>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    WIN32 API函数集是个不折不扣的庞大宝藏,你总能从里面找到你需要的工具。 GetCursorPos和WindowFromPoint两个函数可以完美地解决这个问题。 
                    GetCursorPos可以返回鼠标指针相对整个屏幕的坐标,WindowFromPoint 则根据鼠标指针的坐标,返回指针所处的控件的句柄。在这里,还需要引入一个定时器 
                    (Timer)控件。 </font></p>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    整个编程原理是,在UserControl_Show事件中,先将定时器置为无效。在Image和Label的MouseMove事件中,执行使按纽浮起的代码,然后将定时器置为有效,这时定时器开始倒计时,在计时器的Timer事件中,用上述API函数检测鼠标指针是否已经离开了按纽,如果离开,则使按纽恢复平坦状态并立即使计时器无效,否则继续检测。我们看到,计时器的真正用途是用来触发事件,以检测鼠标的离开。将计时器置为无效是为了在不必要的时间,降低计时器对CPU的占用。 
                    </font></p>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    以下是函数和所需数据类型声明。 </font></p>
                  <div align="left"> 
                    <pre><font size="-1" face="宋体">Private Type POINTAPI
     X As Long
     Y As Long
End Type
Private Declare Function GetCursorPos Lib &quot;user32&quot;  _
(lpPoint As POINTAPI) As Long
Private Declare Function WindowFromPoint Lib &quot;user32&quot; _
(ByVal xPoint As Long, ByVal yPoint As Long) As Long
</font></pre>
                  </div>
                  <p align="left"><font color="#ffffff" size="-1" face="宋体">----</font>  
                    在VB6.0中新建一个ActiveX Control项目。添加LineLeft,LineTop,LineRight, 
                    LineBottom四条边线,一个Image控件Image1,一个Label标签控件Label1,一个定时器控件Timer1。关于用VB创建ActiveX控件的步骤这里不作描述(可以参考本文所附完整源代码)。与按纽制作有关的主要代码如下: 
                    </font></p>
                  <div align="left"> 
                    <pre><font size="-1" face="宋体">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 &lt; &gt; 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</font></pre>
                  </div>
                  <p align="left"> 转载自中国程序员网站</font> )</font>
                </div>
              </td>
            </tr>
          </center>
          <tr> 
            <td width="100%" class="unnamed1"> 
              <p align=right><a href="ba37.htm">(上一页)</a>---<a href="ba39.htm">(下一页)</a></p>
            </td>
          </tr>
          <tr> 
            <td width="100%" class="unnamed1"> 
               
    </div>
    </td>
  </tr>
  <!--msnavigation--></tbody>
</table>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -