درvb مي خوام از رويداد mouse move براي منو استفاده كنم كه با حركت ماوس روي گزينه هاي منو پيغامي در status bar نشون داده شه، ولي منو ها فقط رويداد كليك دارند چي كار كنم؟
Printable View
درvb مي خوام از رويداد mouse move براي منو استفاده كنم كه با حركت ماوس روي گزينه هاي منو پيغامي در status bar نشون داده شه، ولي منو ها فقط رويداد كليك دارند چي كار كنم؟
بطور ذاتي اينكار در ويبي امكان پذير نيست اما اگر با تكنيكهاي SubClassing آشنا باشي ميتوني
به اين هدف برسي.
اگر نميدوني بگو تا يه كلاس برات بنويسم كه بتونه براي منوها يه رويداد بهت بده تا چيزي رو كه ميخواي در
StatusBar نشون بدي
سلام
چيزي نمي دونم اگه كمكم كني ممنون ميشم
همونطور كه گفتم اين كار با تكنيكهاي SubClassing قابل پيادهسازي هست.
با اين تكنيك در واقع ما آدرس پروسه پنجره خودمون رو عوض ميكنيم تا هر رويدادي كه سمت پنجره ارسال ميشه رو مطلع بشيم و بتونيم تصميم بگيريم.
براي همين خاطر اقدام به ساخت يه DLL كردم كه در واقع حاوي يه كلاس هست كه بطور خيلي ساده يه رويداد براي شما فراهم ميكنه كه نشون ميده در حال حاضر كدام گزينه منو انتخاب شده و همان گزينه رو برگشت ميده. حالا كه گزينه رو داريد ميتونيد هر چيزي رو متناظر با اون نمايش بديد.
براي اينكه از اين فايل در پروژههاي خودتون استفاده كنيد كافيه كه اون رو توي پوشه system32 ويندوز كپي كنيد و بعد در محيط ويبي از گزينه Reference فايل رو باركنيد و بعد طبق سورس نمونه اقدام به استفاده كنيد.
سورس نمونه برنامه رو از آدرس زير بگيريد:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام
من مي خوام براي هر گزينه ي منو اطلاعات خاصي رو نشون بدم اما اين برنامه فقط كاپشن گزينه هارو نشون ميده .چه چطوري مي تونم از خاصيت index منو براي تغيير متن استفاده كنم .
از راهنمايي تون ممنونم
دوست عزيز اگه كمي اسفناج بخوري بد نيست.نقل قول:
خب وقتي شما caption منو رو داري ميتوني هر طور كه بخواي هر اطلاعات خاصي رو نشون بدي. مثلا اينطوري
کد:select mnucaption
case "open"
...
case "close"
...
...
end select
عيب كارمو فهميدم
من كاپشن هارو بين كوتيشن نمي زارم
در مورد كلاس مطلب مي خوام چيز خاصي پيدا نكردم .ميشه طريقه ي نوشتنشو بگيد.
ممنونم
از بحث SubClassing كه بگذريم (چون به مفاهيم سيستمعامل مربوط ميشه) كلاس در واقع يك نوع متغير هست كه يك سري توابع رو بعنوان متد و يك سري خصوصيات ارائه ميده. همينطور ويژگي بارز كلاس ارائه رويدادهايي هست كه بسته به نحوه پيادهسازي كلاس و كاربرد اون نوشته ميشه.
مثلا در همين مثال من اقدام به نوشتن كلاسي كردم با نام mnuClass كه چند تا متد و يك رويداد داره.
كلاسها رو ميشه مستقيما در پروژه نوشت و يا اونها رو بصورت Dll درآورد و در اختيار سايرين قرار داد.
mamnonam az rahnamaiiton
اگه بخوام از كليد هاي تركيبي براي يه منو استفاده كنم مثلا
Save Ctrl+S
براي عبارت جلوي case كه بايد كاپشن منو رو بگذارم چي بنويسم؟
بين Save و Ctrl+S ؟
بين عنوان منو و كليدهاي تركيبي كد اسكي 9 يعني همون ثابت vbTab درج ميشه.نقل قول:
مثلا اگر ميخواي عنوان كامل كليد رو در case استفاده كني بايد اينطوري بنويسي:
يا از اين كد توي همون رويداد استفاده كن تا ديگه كليدهاي سريع منوها رو در نظر نگيري:کد:case "Open"+vbTab+"Ctrl+O"
اين كد بخش كليدهاي تركيبي منوها رو حذف ميكنه و مثل اين ميمونه كه گزينههاي كليدهاي تركيبي ندارند.کد:Dim mCaption As String
Dim p As Long
p = InStr(mnucaption, vbTab)
If p Then
mCaption = Left(mnucaption, p - 1)
Else
mCaption = mnucaption
End If
Select Case mCaption
Case "Open..."
Case "Close"
...
End Select
وقتي تعداد منوهاي اصلي بيشتر از دوتا باشه مياد كاپشن زير منوي اول رو براي كاپشن هاي منوي اصلي (سوم و چهارم) نشون ميده
مي خواستم از كليد هاي تركيبي استفاده كنم تا شايد ديگه تكرار نشه ولي وقتي از كليد هاي تركيبي هم استفاده مي كنم دوباره تكرار
مي كنه.حتي اگه كاپشن منوي اصلي رو برابر با "" قرار بدم.
کد:Dim WithEvents usrmenu As clsMenu
Private Sub Form_Load()
Set usrmenu = New clsMenu
usrmenu.Active Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
usrmenu.DeActive
End Sub
Private Sub usrMenu_OnMenu(mnucaption As String)
If mnucaption = "" Then StatusBar1.SimpleText = ""
Select Case mnucaption
Case "Open..." + vbTab + "Ctrl+O"
StatusBar1.SimpleText = "Open"
Case "Close" + vbTab + "Ctrl+C"
StatusBar1.SimpleText = "Close"
Case "Exit" + vbTab + "Ctrl+Q"
StatusBar1.SimpleText = "Exit"
Case "Notepad"
StatusBar1.SimpleText = "Notepad"
Case "Cut"
StatusBar1.SimpleText = "Cut"
End Select
End Sub
متوجه نشدم منظورت چيه، بيشتر توضيح بده تا اگه ايرادي هست كلاس رو بازنويسي كنم.نقل قول:
در برنامه ايي كه خودتون نوشتيد، تعداد منوهاي اصلي 2 تا بود. اگه يكي ديگه به منوهاي اصلي اضافه كنيد مثلا Run با دو
زير منوي option و publish وقتي روي Run كليك كنم ، توضيحات اولين گزينه ي منوي اصلي يعني open رو براي
Run نشون ميده.
يا اصلا واضحتر بگم براي اينكه بشه براي منوي اصلي file يا Edit يا Run درstatusbar توضيحات نشون بدم،چي كار
كنم؟
اينو ببينيد
اینو ببین :نقل قول:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اينم مثه قبلياست اگه به منوي help يه زير منو اضافه بشه بازم ميشه مثه قبلي.
من از اين كلاس تو يه برنامه ايي استفاده كردم ،كه اين برنامه از كامپوننت KDtele (براي شماره گيري و ارسال فايل از طريق
خط تلفن) استفاده مي كنه،اين برنامه تا چند روز پيش كار مي كرد ولي وقتي از اين كلاس استفاده كردم كار نمي كنه. آيا استفاده
از كلاس محدوديت داره؟ يعني ممكنه با بعضي از كامپوننت ها كار نكنه؟
در صورتي كه بخوام پروژه رو با برنامه ي setup ساز نصبي كنم ،باز هم بايد اين كلاس رو تو پوشه ي system32 كپي
كنم؟يا لزومي نداره؟
کد:'In Module
Option Explicit
Private 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
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function GetMenuState Lib "user32" (ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long
Private 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
Private Const MF_BYPOSITION = &H400&
Private Const MF_HILITE = &H80&
Private Const WM_MENUSELECT = &H11F
Private Const GWL_WNDPROC = -4
Public lpPrevWndProc As Long
Public gHW As Long
Public Sub Hook()
lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub Unhook()
SetWindowLong gHW, GWL_WNDPROC, lpPrevWndProc
End Sub
Function AnyLit(hSubSubMenu As Long) As Long
Dim i As Long
Dim MenuCount As Long
MenuCount = GetMenuItemCount(hSubSubMenu)
For i = 0 To MenuCount - 1
If GetMenuState(hSubSubMenu, i, MF_BYPOSITION) And MF_HILITE Then
AnyLit = True
Exit Function
End If
Next i
AnyLit = False
End Function
Private Sub WalkSubMenu(hSubMenu As Long)
Dim i As Long
Dim MenuItems As Long
Dim hSubSubMenu As Long
Dim buffer As String
Dim result As Long
MenuItems = GetMenuItemCount(hSubMenu)
For i = 0 To MenuItems - 1
If GetMenuState(hSubMenu, i, MF_BYPOSITION) And MF_HILITE Then
hSubSubMenu = GetSubMenu(hSubMenu, i)
If hSubSubMenu And AnyLit(hSubSubMenu) Then
WalkSubMenu hSubSubMenu
Else
buffer = Space(255)
result = GetMenuString(hSubMenu, i, buffer, Len(buffer), MF_BYPOSITION)
buffer = Left$(buffer, result)
Form1.StatusBar1.Panels(1).Text = GetDescription(buffer)
Exit Sub
End If
End If
Next i
End Sub
Public Sub FindHilite(TheForm As Form)
Dim hMenu As Long
Dim hSubMenu As Long
Dim i As Long
Dim MenuCount As Long
Form1.StatusBar1.Panels(1).Text = ""
hMenu = GetMenu(TheForm.hwnd)
If hMenu <> 0 Then
MenuCount = GetMenuItemCount(hMenu)
For i = 0 To MenuCount - 1
If GetMenuState(hMenu, i, MF_BYPOSITION) And MF_HILITE Then
hSubMenu = GetSubMenu(hMenu, i)
WalkSubMenu hSubMenu
End If
Next i
End If
End Sub
Private Function GetDescription(MenuCaption As String) As String
Select Case MenuCaption
Case "New"
GetDescription = "New"
Case "Open"
GetDescription = "Opens"
Case "Close"
GetDescription = "Close"
Case "Cut"
GetDescription = "Cut"
Case "Copy"
GetDescription = "Copy"
Case "Paste"
GetDescription = "Paste"
Case "Components"
GetDescription = "Components"
Case "References"
GetDescription = "References"
Case "Contents"
GetDescription = "Contents"
Case "About"
GetDescription = "About"
Case Else
GetDescription = ""
End Select
End Function
Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_MENUSELECT Then
FindHilite Form1
End If
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]کد:Option Explicit
Private Sub Form_Load()
gHW = Me.hwnd
Hook
End Sub
Private Sub Form_Unload(Cancel As Integer)
Unhook
End Sub
در صورتي كه بخوام پروژه رو با برنامه ي setup ساز نصبي كنم ،باز هم بايد اين كلاس رو تو پوشه ي system32 كپي
كنم؟يا لزومي نداره؟