如何在状态栏中显示菜单的相关提示?(在线等待!!)

sndir 2003-05-10 03:53:29
我做了一个多文档窗口,现在想当鼠标指向下拉菜单的某一项时,能在状态栏中显示该菜单项的相关提示?该如何实现?谢谢各位。
...全文
111 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishzone 2003-05-10
  • 打赏
  • 举报
回复
'还有最后一个函数,自定义的,忘了写进去。其实就是显示字符串那部分。
'现在只是显示菜单的文字,你可以根据这些文字设定具体要显示的内容。

Private Sub GetMenuInfo(str As String)
' Str = Left(Str, InStr(1, Str, Chr(0)) - 1)

Dim strMenu As String
Dim n As Long
strMenu = ""
If Not Trim(str) = "" Then
For n = 1 To Len(str) - 1
If Mid(str, n, 1) = "(" Then
strMenu = Mid(str, 1, n - 1)
Exit For
End If
Next n
frmMain.stbStatus.Panels(2).Text = strMenu
End If
End Sub
sndir 2003-05-10
  • 打赏
  • 举报
回复
fishzone(阿愚-本ID已经消毒) 这是厉害了,太谢谢拉
我这就试一试!!
sndir 2003-05-10
  • 打赏
  • 举报
回复
谢谢楼上两位!不过,Leftie(Leftie) 可能理解错了我的意思(或许是我没写清楚问题)。
我要得是yefanqiu(叶帆) 的答案,现在是你的意思我也知道拉,不过,谁能在具体的代码方面给些提示?谢!!
fishzone 2003-05-10
  • 打赏
  • 举报
回复
'判断当前佩选择的菜单项,并在statusbar中显示信息
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long

Public Const GWL_WNDPROC = (-4)
Public Const WM_MENUSELECT = &H11F
Public Const MF_BYCOMMAND = &H0&
Public Const MF_BYPOSITION = &H400&



'判断当前被选中的菜单项,并显示相应信息
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Dim MenuItemStr As String, SubMenuStr As String
Dim hSubmenu As Long, MenuId As Long, i As Long
Dim tmpl As tLong, tmpt As TwoWord
'以下程式会截取WM_MENUSELECT处理完後,再将之送往原来的Window Procedure
If Msg = WM_MENUSELECT Then
SubMenuStr = String(255, 0)
MenuItemStr = String(255, 0)

tmpl.ll = wParam
LSet tmpt = tmpl
MenuId = tmpt.LowWord

hSubmenu = GetSubMenu(lParam, MenuId)
If hSubmenu = 0 Then '表示该item之下没有popupMenu了
Call GetMenuString(lParam, MenuId, MenuItemStr, 256, MF_BYCOMMAND)
MenuItemStr = Left(MenuItemStr, InStr(1, MenuItemStr, Chr(0)) - 1)
GetMenuInfo MenuItemStr
' If Not Trim(MenuItemStr) = "" Then
' frmMain.stbStatus.Panels(2).Text = MenuItemStr
' End If
Else
Call GetMenuString(hMenu, hSubmenu, SubMenuStr, 256, MF_BYCOMMAND)
SubMenuStr = Left(SubMenuStr, InStr(1, SubMenuStr, Chr(0)) - 1)
GetMenuInfo SubMenuStr
' If Not Trim(MenuItemStr) = "" Then
' frmMain.stbStatus.Panels(2).Text = SubMenuStr
' End If
End If
End If
'将之送往原来的Window Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function



'在statusbar显示当前菜单信息
Private Sub DisplayMenu()
Dim Ret As Long
hMenu = GetMenu(Me.hwnd)
'记录原本的Window Procedure的位址
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
'设定Combo1的window Procedure到wndproc
SetWindowLong Me.hwnd, GWL_WNDPROC, AddressOf wndproc
End Sub

饮水需思源 2003-05-10
  • 打赏
  • 举报
回复
在单击某一菜单时:
MdiFrm.StatusBar1.Panels(1) = "我单击了这个菜单"
叶帆 2003-05-10
  • 打赏
  • 举报
回复
有一个替代方法实现,但太复杂,并且不通用,不过可以实现。

给你思路:
1、获取当前鼠标下的窗体句柄,并获知它的类(vb的为#32768)
2、获得鼠标的位置(屏幕座标),并把屏幕座标转换为菜单的客户座标
3、根据屏幕座标获知是那个菜单,根据客户座标获知是菜单的那个项
4、内容当然你编写的应该清楚。


7,763

社区成员

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

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