PDA

نسخه کامل مشاهده نسخه کامل : System Tray در MFC App



someone
20-03-2007, 15:13
سلام به دوستان خوبم.
عیدتون مبارک!
قبلا یه مقاله درباره System Tray گذاشته بودم. که در مورد Shell_NotufyIcon , NOTIFYICONDATA
صحبت شده بود و مثالی که داشته درباره برنامه های Win32 بود. که در link زیر هست:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خب! این بار در مورد اینکه چطور در MFC ازش استفاده کنیم و چطور بتونیم با مثلا right-click یک منو رو برای
این Icon فعال کنیم صحبت میشه.
روند کار مثل Win32 هست. ابتدا یک متغییر public از NOTIFYICONDATA ایجاد میکنیم.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

فرض کنین میخوایم با شروع برنامه , آیکن برنامه در tray قرار بگیره. تابع OnInitDialog رو پیدا میکنیم و بعد از
TODO: Add extra initialization here کد زیر رو در اون مینویسیم:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اگه دقت کنین یکی از property های NOTIFYICON به این شکل تعریف شده:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ما نیاز داریم وقتی که Mouse و یا Keyboard روی این Icon در Tray قرار میگیره پیغامی رو مبنی بر اینکه
مثلا الان Mouse روی این Icon هست دریافت کنیم. فرض کنین میخوایم با right-click منو ای رو به نمایش بذاریم
بنابراین با موقیت Mouse رو در Tray به اصطلاح handle کنیم.
به ابتدای فایل Cpp تون این کد رو اضافه کنین:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
WM_USER کمک میکنه تا ما بتونیم یک private-message برای برنامه خودمون ایجاد کنیم.
و معولا به این شکل ازش استفاده میشه :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
که X یک عدد میتونه باشه.(چون ممکنه در برنامه نیاز به چندین Message باشه.)
الان وقتی Mouse و یا Keyborad روی این Icon قرار بگیرند پشت سر هم پیغامی به پنجره برنامه
ما داده میشه. که میتونیم از این Message استفاده کنیم.
یک تابع با این مشخصات ایجاد کنین :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با استفاده از دو آرگومان این تابع میتونیم تمامی Event های Mouse و keyborad رو Handle کنیم.
(برای اطلاعات بیشتر در باره WPARAM , LPARAM به برنامه نویسی تحت Windows مراجعه کنین.)
خب حالا تابعی رو که ایجاد کردیم پیاده سازی میکنیم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
فکر میکنم در مورد کد بالا نیازی به توضیح نباشه. فقط اینکه با استفاده از LPARAM میتونیم
تک تک Event های
Mouse رو handle کنیم. که در کد بالا برای پیغام right-click آماده شده.
ما نیاز داریم تا هر وقت MYNOTIFY_MESSAGE در صف پیغامهای برنامه ما قرار گرفت تابع
MyNotify رو فعال کنیم. این کار با استفاده از این ماکرو انجام میشه:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
الان کافیه این کد رو به برنامه اضافه کنین:


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در آخر هم لازم هست وقتی برنامه بسته میشه Icon ما از Tray خارج بشه که اینکار رو با نوشتن کد
زیر در تابه OnDestroy انجام میدیم:

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

hamidreza_buddy
20-03-2007, 20:04
ای ول
تشکر از این مقالاتی که می نویسید
به نظر من بهتره که این مقالاتی رو که تا حالا نوشتید رو به مدیرا بگید که به صورت archive در بیارن که هم باقی باشه رو نت هم برای سرچ توی گوگل راحت تر پیدا بشه.
موفق باشی [ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]