如何判断鼠标点击的焦点是否在label上?

pengwu666 2013-02-28 01:22:29
我是做这样的,很多个label 点击哪个哪个就变色,
再点击一个 上一个就恢复。

这个就是我要实现的。谁懂,提示一下
...全文
491 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2013-03-03
  • 打赏
  • 举报
回复
那就做个循环,在Click事件中先用这个循环把所有Label都恢复成不变色的状态,再单独对Index所标志的那一个设置成被点击后的状态. 何必搞得那么复杂.
Tiger_Zhao 2013-03-01
  • 打赏
  • 举报
回复
你15楼的代码和我6楼的代码一个原理。
可以很负责地告诉你,没有任何问题。
一切脱离了环境谈效率的讨论都是扯谈。
你、我、13楼的代码在用户体验上没有任何区别。
CPU极大部分都是空闲的情况下,省下一点运算有意义吗?

又:重复我16楼最后一句话。
pengwu666 2013-03-01
  • 打赏
  • 举报
回复
引用 17 楼 c0631106233 的回复:
引用 14 楼 pengwu666 的回复: 引用 6 楼 Tiger_Zhao 的回复:Visual Basic code ?= Index, vbIn…… 你这个是,一松手就恢复,我是想选中下一个的时候,这个才恢复。 我糊涂了,越来越搞不懂楼主究竟想要什么样的效果,请能看懂的明示一下……
比如说我15楼发的代码,就是把10个控件都先恢复颜色,再点击变色。 这样每次点击都要循环,比较麻烦、
pengwu666 2013-03-01
  • 打赏
  • 举报
回复
我有10个label 控件,并且设置了边框。 我点击其中一个label,这个的背景变色。 我再点另一个,另一个背景也变色,但是上次的那个背景恢复。 始终就是只有一个是变色的。 这样清楚了吗
酷心 2013-03-01
  • 打赏
  • 举报
回复
引用 14 楼 pengwu666 的回复:
引用 6 楼 Tiger_Zhao 的回复:Visual Basic code ?= Index, vbIn…… 你这个是,一松手就恢复,我是想选中下一个的时候,这个才恢复。
我糊涂了,越来越搞不懂楼主究竟想要什么样的效果,请能看懂的明示一下……
Tiger_Zhao 2013-03-01
  • 打赏
  • 举报
回复
引用 8 楼 c0631106233 的回复:
>引用 6 楼 Tiger_Zhao 的回复: >…… 用循环历遍好像有点浪费?
NO!!! 无论是否循环,都能在0.01秒内完成。用户体验上没有任何区别。 而不使用模块变量的循环,减少了函数(事件)的耦合度,维护做多了你就能体会出这样做的好处了。
pengwu666 2013-03-01
  • 打赏
  • 举报
回复
现在我就是用这个办法来实现的,效率不高,凑活能用。有木有更好的办法,贴上来看看

Private Sub Label1_Click(Index As Integer)
Dim i As Long
For i = 0 To 9
If Label1(i).BackColor = &HFFFF00 Then
Label1(i).BackColor = &H8000000F
End If
Next
Label1(Index).BackColor = &HFFFF00
End Sub
pengwu666 2013-03-01
  • 打赏
  • 举报
回复
引用 6 楼 Tiger_Zhao 的回复:
Visual Basic code ?= Index, vbIn……
你这个是,一松手就恢复,我是想选中下一个的时候,这个才恢复。
pengwu666 2013-03-01
  • 打赏
  • 举报
回复
我觉得不太对啊,都不会恢复本来颜色的。 总体说就是这里的label始终只有1个是变色的、
of123 2013-03-01
  • 打赏
  • 举报
回复
丢了一句:

Option Explicit
Dim SelLabelIndex As Integer

Private Sub Label1_Click(Index As Integer)
    Label1(SelLabelIndex).ForeColor = vbBlack
    Label1(Index).ForeColor = vbRed
    SelLabelIndex = Index
End Sub
of123 2013-03-01
  • 打赏
  • 举报
回复
引用 8 楼 c0631106233 的回复:
引用 5 楼 of123 的回复: 引用 6 楼 Tiger_Zhao 的回复: …… 用循环历遍好像有点浪费?
上面代码适用于不采用控件数组的方式。 如果用控件数组则更简单:

Dim SelLabelIndex As Integer

Private Sub Label1_Click(Index As Integer)
    Label1(SelLabelIndex).ForeColor = vbBlack
    Label1(Index).ForeColor = vbRed
End Sub
lliai 2013-03-01
  • 打赏
  • 举报
回复
9楼正解。。。。。。
酷心 2013-03-01
  • 打赏
  • 举报
回复
还正楼主自己视自己的编程而定吧,如果数量不多,循环次数少的话,不管是通过定义变量来保存还是通过循环历遍都一样可以达到你的目的,这种情况正如所说的使用循环历遍可以减少函数(事件)的耦合度,使得维护性好。不过如果数量很多,事件频繁的话我个人不是很推荐用历遍循环,比如下面这段:

Option Explicit 
Private Sub Form_Load()
  Dim vI As Long
  Dim vJ As Long
  Dim vX As Long
  Dim vY As Long
    Me.WindowState = 2
    Me.Show
    Label1(0).Move 0, 0, 180, 180
    vX = (Me.Width - 120) \ 210 + 1
    vY = (Me.Height - 630) \ 210 + 1
    vJ = vX * vY - 1
    For vI = 1 To vJ
      Load Label1(vI)
      Label1(vI).Move (vI Mod vX) * 210, (vI \ vX) * 210, 180, 180
      Label1(vI).Visible = True
    Next
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim lbl As Label
    For Each lbl In Label1
        lbl.BackColor = vbRed
    Next
End Sub
Private Sub Label1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim lbl As Label
    For Each lbl In Label1
        lbl.BackColor = IIf(lbl.Index = Index, vbBlue, vbRed)
    Next
End Sub
用户体验并不是很好,特别是MouseMove这种频繁性事件,以上纯属个人建议……
worldy 2013-02-28
  • 打赏
  • 举报
回复
dim curidx as integer Private Sub Label1_Click(Index As Integer) label1(curidx).forecolor=OrgColor '原始颜色 label1(index).forecolor=nColor '选中颜色 curidx=i end sub
酷心 2013-02-28
  • 打赏
  • 举报
回复
引用 5 楼 of123 的回复: 引用 6 楼 Tiger_Zhao 的回复:
……
用循环历遍好像有点浪费?
hpygzhx520 2013-02-28
  • 打赏
  • 举报
回复
Private i As Integer
Private c As Long

Private Sub Form_Load()
i = -1
c = Label1(0).BackColor
End Sub

Private Sub Label1_Click(Index As Integer)
If Index <> i Then
    Label1(Index).BackColor = vbRed
    If i <> -1 Then Label1(i).BackColor = c
    i = Index
End If
End Sub
Tiger_Zhao 2013-02-28
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Label1_Click(Index As Integer)
Dim lbl As Label
For Each lbl In Label1
lbl.BackColor = IIf(lbl.Index = Index, vbInfoBackground, vbButtonFace)
Next
End Sub
of123 2013-02-28
  • 打赏
  • 举报
回复

Option Explicit

Private Sub Label1_Click()
    Change_Label_Color ("Label1")
End Sub

Private Sub Label2_Click()
    Change_Label_Color ("Label2")
End Sub

Private Sub Label3_Click()
    Change_Label_Color ("Label3")
End Sub

Private Sub Change_Label_Color(ByVal strLabelName As String)
Dim x As Control

For Each x In Me.Controls
    If TypeOf x Is Label Then
        If x.Name = strLabelName Then
            x.ForeColor = vbRed
        Else
            x.ForeColor = vbBlack
        End If
    End If
Next x
End Sub
酷心 2013-02-28
  • 打赏
  • 举报
回复
如果是控件数组可以定义一个全局变量保存Index,像楼上的答案 如果不是可以定义一个全局的变量Lable,保存你点击的lable,当然也可以用在控件数组。 dim LastLb as Lable set LastLb=xxx(lable) 判断用 if Not LastLb Is Nothing Then ……
VBToy 2013-02-28
  • 打赏
  • 举报
回复
Option Explicit
Private mintCurIndex As Integer
Private Sub Form_Load()
    mintCurIndex = -1
End Sub
Private Sub Label1_Click(Index As Integer)
    If mintCurIndex >= 0 Then
       Label1(mintCurIndex).ForeColor = vbBlack
    End If
    If mintCurIndex = Index Then '再次点同一个标签时恢复
       mintCurIndex = -1
       Exit Sub
    End If
    Label1(Index).ForeColor = vbRed
    mintCurIndex = Index
End Sub
加载更多回复(2)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧