PDA

View Full Version : استفاده از منوی سیستمی فرم



ASedJavad
دوشنبه 14 شهریور 1390, 15:28 عصر
سلام
من تو فرمم یه پیکچرباکس دارم که میخوام وقتی روش راست کلیک میشه، منوی سیستمی فرم نشون داده بشه و با انتخاب هر کدوم از گزینه هاش، اون گزینه اجراشه.
(منظورم همون منوییه که وقتی رو نوار عنوان فرم کلیک میکنی نشون میده و تو تصویر هم اومده)

74887


با کمک دستور زیر تونستم نمایشش بدم ولی هر چی گزینه هاش رو انتخاب میکنم، اتفاقی نمیفته

Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function TrackPopupMenu Lib "user32" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal x As Long, ByVal y As Long, ByVal nReserved As Long, ByVal hwnd As Long, ByVal lprc As Any) As Long
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Sub picture1_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Pt As POINTAPI
GetCursorPos Pt
If Button = 2 Then
TrackPopupMenu GetSystemMenu(Me.hwnd, False), 0, Pt.x, Pt.y, 0, Me.hwnd, ByVal 0&
End If
End Sub
چه کار باید بکنم؟

ASedJavad
پنج شنبه 17 شهریور 1390, 16:38 عصر
کسی نبود جواب بده؟

Veteran
پنج شنبه 17 شهریور 1390, 16:43 عصر
یک فرم اضافه کن بعد منو ها رو ایجاد کن بعد بورو روی شی که میخوای کلیک راست داشته باشه هر کردوم از رویداد ها
مثلا رویداد کلیک این کد رو استفاده کن
PopupMenu
نمونه
PopupMenu Form3.meno3
البته رویداد کلیک راست نداریم من ندیدم اما چه کلیک راست چه چپ بکنی منو رو نشون میده

returnx
پنج شنبه 17 شهریور 1390, 21:33 عصر
البته رویداد کلیک راست نداریم من ندیدم اما چه کلیک راست چه چپ بکنی منو رو نشون میده
فقط کافیه کد Popup منو رو در Mouse Down شی PictureBox قرار بدید ، بعد هم پارامتر Button رو چک کنید اگه مقدار برگشتی این پارامتر 1 بود یعنی کلیک چپ شده و اگه مقدار برگشتی این پارامتر 2 بود یعنی کلیک راست شده و اگه مقدار برگشتی 3 بود یعنی Scroll ماوس کلیک شده...

ASedJavad
جمعه 18 شهریور 1390, 09:07 صبح
سلام
فکر کنم گفتم منوهای سیستمی!
همین طور گفتم


(منظورم همون منوییه که وقتی رو نوار عنوان فرم کلیک میکنی نشون میده و تو تصویر هم اومده)

حتی تصویر هم گذشتم

حالا شما میای میگی:

یک فرم اضافه کن بعد منو ها رو ایجاد کن
ولی باز هم ممنون

returnx
جمعه 18 شهریور 1390, 23:12 عصر
دوست عزیز این راهی که گفتیم برای ساده تر شدن کد نویسی بود...

ASedJavad
شنبه 19 شهریور 1390, 01:22 صبح
میشه یه توضیح بدین یا یه مثال بذارید که من بفهمم چطوری میشه با این راهی که شما گفتید منو ی سیستمی فرم رو نمایش داد؟
انشا الله منظورت این نیست که بیایم یه منو مشابه منوی سیستمی فرم، خودمون طراحی کنیم و بعد اونو فراخونی کنیم؟
اون وقت اگه borderStyle ‌فرممون عوض شد باید دوباره بشینیم یه منوی جدید طراحی کنیم.
یا اگه کاربر سیستمش رو دستکاری کرده بود و منوهای سیستمی ویندوز بهشون چیزی کم یا اضافه شده بود، اون وقت باید به کاربر بگیم ببخشید لطفا تنظیمات ویندوز رو به دبفالت برگردون؟؟؟!!!!!

returnx
شنبه 19 شهریور 1390, 02:23 صبح
انشا الله منظورت این نیست که بیایم یه منو مشابه منوی سیستمی فرم، خودمون طراحی کنیم و بعد اونو فراخونی کنیم؟

دقیقا منظورم همین بود...

اون وقت اگه borderStyle ‌فرممون عوض شد باید دوباره بشینیم یه منوی جدید طراحی کنیم.

به چه دلیل !؟ نیازی نیست که چند منو طراحی کنید ، کافیه بعضی از item هارو مخفی یا نمایش بدید...

ASedJavad
شنبه 19 شهریور 1390, 08:22 صبح
ببین!
من اگه بخوام خودم منو طراحی کنم و بشیم برا تک تک رویدادهاش کد بنویسم، راه ساده تری رو شروع میکنم.
مثلا با همون دستوری که تو پست اول نوشتم ، منو رو نشون میدم
بعد یه تابع getMessege هم میذارم تو برنامه که بیاد پیغام انتخاب منو رو دریافت کنه و کار رو انجام بده.

حالا با فرض اینکه واقعا راه دیگه ای ندارم و باید خودم برا فشرده شدن هر منو، کد انجام اون رو بنویسم، یه زحمتی بکش و بگو وقتی کاربر منوی move یا size رو انتخاب کرد، باید چه کدی اجرا بشه.
مثلا برا منو move باید موس به شکل + در بیاد و بره وسط تایتل بار قرار بگیره و با حرکت موس یا رویدادهای صفحه کلید فرممون حرکت کنه. برا منوی size هم همین طور.

ولی با این همه من فکر میکنم راه بهتر و ساده تری هم باید وجود داشته باشه.

در ضمن تو اون راهی که شما گفتی راجع به

اگه کاربر سیستمش رو دستکاری کرده بود و منوهای سیستمی ویندوز بهشون چیزی کم یا اضافه شده بود، اون وقت باید به کاربر بگیم ببخشید لطفا تنظیمات ویندوز رو به دبفالت برگردون؟؟؟!!!!!

چیزی نگفتی:چشمک:!

returnx
شنبه 19 شهریور 1390, 13:35 عصر
چیزی نگفتی:چشمک:!
چطور میتونه ای منو رو تغییر بده!؟ اصلا ما فرض رو بر این میگیریم که چنین کاری نمیکنه امااگر هم چنین کاری کرد دیگه نمیتونه کلاس فرم ویندوز رو تغییر بده!!
آخر مجبورم کردی واست این برنامه رو بنویسم ، سورس رو ضمیمه کردم...

ASedJavad
جمعه 25 شهریور 1390, 16:16 عصر
سلام
به لطف آقای mohsenVj جوابم رو گرفتم.
البته نه از اون راهی که ms2222 گفته بود بلکه از راهی که خودم میخواستم.
(البته با تشکر از ms2222)
گفتم جوابشو بگم شاید به درد کسی بخوره:
فقط کافیه پیکچرباکس رو هوک (hook) کرد بعد تو تابع هوک چک کرد اگه lparam صفر بود و Msg برابر با WM_COMMAND بود، در این صورت Msg به WM_SYSCOMMAND تغییر داده بشه.
ممنون از کسایی که راهنمایی کردن.