VB6 制作图形按钮的问题

资源中101是正常时候的样子,102是鼠标在按钮上的样子,103是按下的样子,104是灰色状态的样子。'最小化按钮按下鼠标事件PrivateSubPicture10_Mo... 资源中101是正常时候的样子,102是鼠标在按钮上的样子,103是按下的样子,104是灰色状态的样子。

'最小化按钮按下鼠标事件
Private Sub Picture10_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button <> vbLeftButton Then Exit Sub
Picture10.Picture = LoadResPicture(103, 0)
End Sub
'最小化按钮松开鼠标事件
Private Sub Picture10_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button <> vbLeftButton Then Exit Sub
Picture10.Picture = LoadResPicture(101, 0)
End Sub
'最小化按钮移动鼠标事件
Private Sub Picture10_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture10.Picture = LoadResPicture(102, 0)
End Sub
'最小化按钮单击鼠标事件
Private Sub Picture10_Click()
Me.WindowState = 1
End Sub

使用这种方法解决,代码又长又乱,关键问题是移开鼠标后,按钮仍然保持102的状态。有没有办法可以在不使用第三方控件的情况下解决?(在窗体的MouseMove事件中加入 Picture10.Picture = LoadResPicture(101, 0)可以缓解,但是该按钮在窗体边缘,一旦鼠标移到窗体外则还是102状态)
圆满完成者追加20分
我有二十几个按钮,要用二十几个Timer?
展开
 我来答
KL1112
2010-05-10 · TA获得超过532个赞
知道小有建树答主
回答量:454
采纳率:0%
帮助的人:627万
展开全部
你可以用Timer控件来解决那个问题,具体想法如下:

在Picture10控件的MouseMove事件激活Timer控件,在Picture10控件的MouseUp事件关闭Timer控件。
Timer控件定时检测鼠标是不是在Picture10控件的范围内,如果不在,就设定Picture10控件的图片,同时关闭自己。

具体代码如下:

在通用区域添加API“GetCursorPos”,和自定义类型“POINTAPI”
定义变量
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type

Dim bT As Boolean, XY As POINTAPI
Dim SW As Long, SH As Long, SX As Single, SY As Single
Dim a As Single, b As Single, c As Single, d As Single

添加一个Timer控件,设定Enabled=False,Interval=50,
定义一个变量bT As Boolean,用于保存Timer控件的状态(不定义也行,使用Timer控件的Enabled属性也行)

在Form的Load事件里添加代码:
SW = Screen.Width: SH = Screen.Height
SX = Screen.TwipsPerPixelX: SY = Screen.TwipsPerPixelX

在Picture10控件的MouseMove事件里添加代码:
If Not bT Then
Timer1.Enabled = True
bT = True
End If

在Picture10控件的MouseUp事件里添加代码:
If bT Then
Timer1.Enabled = False
bT = False
End If

在Timer1控件的Timer事件里添加代码:
Call GetCursorPos(XY)
a = (Me.Left + Picture10.Left) / SX: b = a + Picture10.Width / SX
c = (Me.Top + Picture10.Top) / SY: d = c + Picture10.Height / SY
Print "Timer"
If XY.x < a Or XY.x > b Or XY.y < c Or XY.y > d Then
Timer1.Enabled = False
'*** (自己的代码)
End If

以前做这个效果时,还能很好地实现,现在发现Picture控件对MouseMove事件不是很灵敏,经常会出现不响应MouseMove事件。如果你试的时候,也是这种情况,那就只能一直用Timer控件来做了。

不知道这行不行...
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式