Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
DiscussionsAccessExcelInfoPathOutlookPowerPointPublisherWord
DirectoryUser Groups
Related Topics
Outlook ExpressInternet ExplorerWindowsMS Server ProductsMore Topics ...

MS Office Forum / Word / Programming / February 2007

Tip: Looking for answers? Try searching our database.

VBA: Right-Clicking in ListBoxes

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
Mickey F. - 06 Feb 2007 22:39 GMT
Is there a way to get Word to return the Index of an item in a ListBox that
you right-clicked over?

This is for Word 2002.
Karl E. Peterson - 06 Feb 2007 22:56 GMT
> Is there a way to get Word to return the Index of an item in a ListBox that
> you right-clicked over?
>
> This is for Word 2002.

Well, you'll need to obtain its hWnd (GetFocus, maybe?).  Once you have that, you
can translate mouse position to ListIndex something like this:

  Private Declare Function SendMessage Lib _
     "user32" Alias "SendMessageA" (ByVal hWnd As _
     Long, ByVal wMsg As Long, ByVal wParam As _
     Long, lParam As Any) As Long
  Private Const LB_GETITEMHEIGHT = &H1A1

  Private Sub List1_MouseMove(Button As Integer, _
     Shift As Integer, X As Single, Y As Single)
     Dim ItemHeight As Long
     Dim NewIndex As Long
     Static OldIndex As Long

     With List1
        ItemHeight = SendMessage(.hWnd, _
           LB_GETITEMHEIGHT, 0, ByVal 0&)
        ItemHeight = .Parent.ScaleY(ItemHeight, _
           vbPixels, vbTwips)
        NewIndex = .TopIndex + (Y \ ItemHeight)
        If NewIndex <> OldIndex Then
           If NewIndex < .ListCount Then
              .ToolTipText = .List(NewIndex)
           Else
              .ToolTipText = vbNullString
           End If
           OldIndex = NewIndex
        End If
     End With
  End Sub

Source:

  Ask the VB Pro, June 2000
  http://vb.mvps.org/articles/ap200006.asp

That was originally written for Classic VB, of course, but the same general
principles apply.  In this case, you're only after the value NewIndex.
Signature

.NET: It's About Trust!
http://vfred.mvps.org

Mickey F. - 06 Feb 2007 23:44 GMT
To be honest, I'm a little unsure of what's going on in that Private Declare
Function statement.  I've never really used them.  What it looks like is that
your using a function from the user32 library.  I've never used anything like
that before, so I'm a bit lost there.

I guess what I'm really looking for is an explanation of what SendMessage
does.  The article that you linked didn't go into detail on it.  I don't know
what any of the parameters are and not sure where to find documentation on
it, and (if my suppositions are correct) any other pre-made functions like it.

Also, another novice questions here, what significance is the Alias
"SendMessageA" portion?

> > Is there a way to get Word to return the Index of an item in a ListBox that
> > you right-clicked over?
[quoted text clipped - 40 lines]
> That was originally written for Classic VB, of course, but the same general
> principles apply.  In this case, you're only after the value NewIndex.
Karl E. Peterson - 07 Feb 2007 00:38 GMT
Hi Mickey --

> To be honest, I'm a little unsure of what's going on in that Private Declare
> Function statement.  I've never really used them.  What it looks like is that
> your using a function from the user32 library.  I've never used anything like
> that before, so I'm a bit lost there.

Yeah, SendMessage is a very powerful tool provided by the Windows API.  You "send" a
message to any particular window, and it (hopefully) responds with some information
you want/need.

> I guess what I'm really looking for is an explanation of what SendMessage
> does.  The article that you linked didn't go into detail on it.  I don't know
> what any of the parameters are and not sure where to find documentation on
> it, and (if my suppositions are correct) any other pre-made functions like it.

Okay, sorry about that.  Lots of implied knowledge there.  If you want to learn
about that sort of thing, I'd recommend starting slow, with specific examples (like
this, in fact) or at sites like http://word.mvps.org

> Also, another novice questions here, what significance is the Alias
> "SendMessageA" portion?

Ah, most of the API calls that work with strings in Windows come in both ANSI (A)
and Unicode (W) flavors.  VB automatically converts strings to ANSI when passing to
external DLLs, so that's the one we need to use most often.

Sadly, that all said, I just tried my suggestion in Word, and it doesn't work.
Seems the listbox in Word isn't a "real" listbox afterall.  It doesn't respond to
the LB_* messages.  :-(

Sorry...   Karl

>>> Is there a way to get Word to return the Index of an item in a ListBox that
>>> you right-clicked over?
[quoted text clipped - 43 lines]
>> ..NET: It's About Trust!
>>  http://vfred.mvps.org

Signature

.NET: It's About Trust!
http://vfred.mvps.org

Perry - 06 Feb 2007 22:57 GMT
No designated Rightclick event.
But however, you can mimick it, using the MouseUp (or Down) event
and catching the Button callback:
1 is the left- and 2 is the right mousebutton.

Private Sub ListBox1_MouseUp( _
   ByVal Button As Integer, _
   ByVal Shift As Integer, _
   ByVal X As Single, _
   ByVal Y As Single)

   If Button = 2 Then
       If Me.ListBox1.ListIndex > -1 Then
           MsgBox Me.ListBox1.ListIndex
       Else
           MsgBox "No Selection"
       End If
   End If
End Sub

Krgrds,
Perry

> Is there a way to get Word to return the Index of an item in a ListBox
> that
> you right-clicked over?
>
> This is for Word 2002.
Perry - 06 Feb 2007 22:57 GMT
No designated Rightclick event.
But however, you can mimick it, using the MouseUp (or Down) event
and catching the Button callback:
1 is the left- and 2 is the right mousebutton.

Private Sub ListBox1_MouseUp( _
   ByVal Button As Integer, _
   ByVal Shift As Integer, _
   ByVal X As Single, _
   ByVal Y As Single)

   If Button = 2 Then
       If Me.ListBox1.ListIndex > -1 Then
           MsgBox Me.ListBox1.ListIndex
       Else
           MsgBox "No Selection"
       End If
   End If
End Sub

Krgrds,
Perry

> Is there a way to get Word to return the Index of an item in a ListBox
> that
> you right-clicked over?
>
> This is for Word 2002.
Perry - 06 Feb 2007 22:57 GMT
No designated Rightclick event.
But however, you can mimick it, using the MouseUp (or Down) event
and catching the Button callback:
1 is the left- and 2 is the right mousebutton.

Private Sub ListBox1_MouseUp( _
   ByVal Button As Integer, _
   ByVal Shift As Integer, _
   ByVal X As Single, _
   ByVal Y As Single)

   If Button = 2 Then
       If Me.ListBox1.ListIndex > -1 Then
           MsgBox Me.ListBox1.ListIndex
       Else
           MsgBox "No Selection"
       End If
   End If
End Sub

Krgrds,
Perry

> Is there a way to get Word to return the Index of an item in a ListBox
> that
> you right-clicked over?
>
> This is for Word 2002.
Mickey F. - 06 Feb 2007 23:17 GMT
That doesn't seem to work for what I'm looking for.  I was hoping to return
the Index value of the item the mouse was currently over when I
right-clicked.  But since right-clicking doesn't change the ListIndex, it
just keeps message boxing whatever ListIndex currently is, rather than for
the item I right-clicked over.

> No designated Rightclick event.
> But however, you can mimick it, using the MouseUp (or Down) event
[quoted text clipped - 24 lines]
> >
> > This is for Word 2002.
Perry - 06 Feb 2007 23:27 GMT
Sorry for multiple posts :-)
My newsreader jammed and I had to "push" the answers, resulting in ... well
sorry for that.
Another sorry for not understanding yr question ...

Have you read the other contribution to this thread?
Worth looking at.

Imo, a little "user education" will help as well.
Selecting an item in the listbox, and "dragging" the selection across the
listitems will change
the listindex.
Do you really want the listindex to change on mouse-hovering ??

Krgrds,
Perry

> That doesn't seem to work for what I'm looking for.  I was hoping to
> return
[quoted text clipped - 31 lines]
>> >
>> > This is for Word 2002.
Mickey F. - 07 Feb 2007 00:01 GMT
> Imo, a little "user education" will help as well.
Man I wish I could educate my users.  There will probably be 100+ people
using this and many of them resist technology like it was the end of all
things good and pure in the world.

> Have you read the other contribution to this thread?
> Worth looking at.
I have, but I'm not on the same level as the person who contributed it.  I'm
not understanding the Declare Function statement and how it can be used so
I'm researching that a bit.

> Selecting an item in the listbox, and "dragging" the selection across the
> listitems will change
> the listindex.
> Do you really want the listindex to change on mouse-hovering ??
Not on MouseMove, but if I combine your Mouse_Up event suggestion, (after I
figure out how to use this Declare Function stuff) with Karl's suggestion
then I should get what I want.

> Sorry for multiple posts :-)
> My newsreader jammed and I had to "push" the answers, resulting in ... well
> sorry for that.
> Another sorry for not understanding yr question ...
No problem at all!  I'm sorry for my vague wording.

Thanks for all the help!

> > That doesn't seem to work for what I'm looking for.  I was hoping to
> > return
[quoted text clipped - 31 lines]
> >> >
> >> > This is for Word 2002.
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2008 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.