-
System Tray در MFC App
سلام به دوستان خوبم.
عیدتون مبارک!
قبلا یه مقاله درباره System Tray گذاشته بودم. که در مورد Shell_NotufyIcon , NOTIFYICONDATA
صحبت شده بود و مثالی که داشته درباره برنامه های Win32 بود. که در link زیر هست:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خب! این بار در مورد اینکه چطور در MFC ازش استفاده کنیم و چطور بتونیم با مثلا right-click یک منو رو برای
این Icon فعال کنیم صحبت میشه.
روند کار مثل Win32 هست. ابتدا یک متغییر public از NOTIFYICONDATA ایجاد میکنیم.
کد:
.
.
.
.
afx_msg void OnDestroy();
//}}AFX_MSG
afx_msg void MyNotify(WPARAM wp, LPARAM lp);
DECLARE_MESSAGE_MAP()
public :
NOTIFYICONDATA myNotify;
};
فرض کنین میخوایم با شروع برنامه , آیکن برنامه در tray قرار بگیره. تابع OnInitDialog رو پیدا میکنیم و بعد از
TODO: Add extra initialization here کد زیر رو در اون مینویسیم:
کد:
BOOL CMFC_TrayDlg::OnInitDialog()
{
CDialog::OnInitDialog();
.
.
.
.
// TODO: Add extra initialization here
//-------------------------------
HICON hIcon = LoadIcon(::AfxGetResourceHandle(),
MAKEINTRESOURCE(IDR_MAINFRAME));
myNotify.cbSize = sizeof(NOTIFYICONDATA);
myNotify.hIcon = hIcon;
myNotify.hWnd = this->m_hWnd;
strcpy(myNotify.szTip,"My Notify!!!");
myNotify.uCallbackMessage = MYNOTIFY_MESSAGE;
myNotify.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP ;
Shell_NotifyIcon(NIM_ADD,&myNotify);
//-------------------------------
return TRUE;
}
اگه دقت کنین یکی از property های NOTIFYICON به این شکل تعریف شده:
کد:
myNotify.uCallbackMessage = MYNOTIFY_MESSAGE
ما نیاز داریم وقتی که Mouse و یا Keyboard روی این Icon در Tray قرار میگیره پیغامی رو مبنی بر اینکه
مثلا الان Mouse روی این Icon هست دریافت کنیم. فرض کنین میخوایم با right-click منو ای رو به نمایش بذاریم
بنابراین با موقیت Mouse رو در Tray به اصطلاح handle کنیم.
به ابتدای فایل Cpp تون این کد رو اضافه کنین:
کد:
#include "stdafx.h"
#include "MFC_Tray.h"
#include "MFC_TrayDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MYNOTIFY_MESSAGE (WM_USER+1)
WM_USER کمک میکنه تا ما بتونیم یک private-message برای برنامه خودمون ایجاد کنیم.
و معولا به این شکل ازش استفاده میشه :
که X یک عدد میتونه باشه.(چون ممکنه در برنامه نیاز به چندین Message باشه.)
الان وقتی Mouse و یا Keyborad روی این Icon قرار بگیرند پشت سر هم پیغامی به پنجره برنامه
ما داده میشه. که میتونیم از این Message استفاده کنیم.
یک تابع با این مشخصات ایجاد کنین :
کد:
.
.
.
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMFC_TrayDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDestroy();
//}}AFX_MSG
afx_msg void MyNotify(WPARAM wp, LPARAM lp);
DECLARE_MESSAGE_MAP()
public :
NOTIFYICONDATA myNotify;
};
با استفاده از دو آرگومان این تابع میتونیم تمامی Event های Mouse و keyborad رو Handle کنیم.
(برای اطلاعات بیشتر در باره WPARAM , LPARAM به برنامه نویسی تحت Windows مراجعه کنین.)
خب حالا تابعی رو که ایجاد کردیم پیاده سازی میکنیم :
کد:
void CMFC_TrayDlg::MyNotify(WPARAM wp,LPARAM lp)
{
if ( lp == WM_RBUTTONDOWN )
{
POINT point;
CMenu menu;
menu.LoadMenu(IDR_MENU1);
CMenu *pMenu = menu.GetSubMenu(0);
GetCursorPos(&point);
pMenu->TrackPopupMenu
(
TPM_RIGHTBUTTON | TPM_LEFTALIGN,
point.x,
point.y,
this
);
}
}
فکر میکنم در مورد کد بالا نیازی به توضیح نباشه. فقط اینکه با استفاده از LPARAM میتونیم
تک تک Event های
Mouse رو handle کنیم. که در کد بالا برای پیغام right-click آماده شده.
ما نیاز داریم تا هر وقت MYNOTIFY_MESSAGE در صف پیغامهای برنامه ما قرار گرفت تابع
MyNotify رو فعال کنیم. این کار با استفاده از این ماکرو انجام میشه:
الان کافیه این کد رو به برنامه اضافه کنین:
کد:
BEGIN_MESSAGE_MAP(CMFC_TrayDlg, CDialog)
//{{AFX_MSG_MAP(CMFC_TrayDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(MYNOTIFY_MESSAGE,MyNotify)
END_MESSAGE_MAP()
در آخر هم لازم هست وقتی برنامه بسته میشه Icon ما از Tray خارج بشه که اینکار رو با نوشتن کد
زیر در تابه OnDestroy انجام میدیم:
کد:
void CMFC_TrayDlg::OnDestroy()
{
CDialog::OnDestroy();
Shell_NotifyIcon(NIM_DELETE,&myNotify);
}
در مورد هر کدوم از توابع قبلا صحبت شده و اگه نیاز به توضیح بیشتر هست بگید.
موفق باشین.
-
ای ول
تشکر از این مقالاتی که می نویسید
به نظر من بهتره که این مقالاتی رو که تا حالا نوشتید رو به مدیرا بگید که به صورت archive در بیارن که هم باقی باشه رو نت هم برای سرچ توی گوگل راحت تر پیدا بشه.
موفق باشی
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]