VC編制系統托盤的一種實現方法[習作]

mantian發表於2005-09-22

關鍵字:VC 系統托盤 Shell_NotifyIcon NOTIFYICONDATA

參考文獻:MSDN

其實有人已經把這些東西寫得很好,就是覺得自己再寫一遍,能夠加深自己的印象。

[@more@]

首先還是簡單介紹一下Windows托盤區程式設計。只有Shell_NotifyIcon一個函式可用。他的功能就是Sends a message to the taskbar's status area. Shell_NotifyIcon的結構

BOOL Shell_NotifyIcon(

DWORD dwMessage,

PNOTIFYICONDATA lpdata

);

dwMessage可以取如下值(我只把需要的列出來,嘿,其他的看MSDN

NIM_ADD 新增圖示

NIM_DELETE 刪除圖表

Lpdata 是一個指向NOTIFYICONDATA結構的指標。該結構包括處理圖示的資訊,回撥函式,把滑鼠放在上面能顯示的提示資訊等等。

具體操作的時候,只需要先定義NOTIFYICONDATA nc,然後把nc的結構填充滿了。呼叫Shell_NotifyIcon就可以了。

好了,介紹完畢,下面是具體的詳細步驟,我已經力圖把它敘述得很清楚,如果你覺得我的步驟還比較不清楚,也可以向我索要全部程式碼。

1.首先建立一個但文件的工程。我的叫MyTest。在出現的對話方塊中右擊-property –style,並把其中的maxmize boxminimize box勾上。

2.CMyTestDlg的標頭檔案中(MyTestDlg.h)加入以下兩個變數的宣告:

BOOL m_bIsMinimized;

BOOL m_bIsFirstMinimized;

並且在建構函式中初始化

m_bIsMinimized = FALSE;

m_bIsFirstMinimized = FALSE;

3.在資源中新增一個選單,ID為預設的就成

4.在Class Wizzard 中新增OnDestroy()訊息對映函式。接下來我們需要重寫他。

void CMyTestDlg::OnDestroy()

{

CDialog::OnDestroy();

NOTIFYICONDATA nc;

nc.cbSize = sizeof(NOTIFYICONDATA);

nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

nc.hWnd = m_hWnd;

nc.uCallbackMessage = WM_NOTIFYICON;

nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

nc.uID = IDC_NOTIFYICON;

Shell_NotifyIcon(NIM_DELETE , &nc);

}

5.自己需要手工新增兩個訊息對映函式

定義訊息

#define WM_NOTIFYICON (WM_USER+101)

#define IDC_NOTIFYICON (WM_USER+102)

#define WM_MINIMIZE (WM_USER+103)

CMyTestDlg的標頭檔案中

//{{AFX_MSG(CMyTestDlg)

//以下兩個需要手動新增

afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM lParam);

afx_msg void OnMyMinimize();

//}}AFX_MSG

CMyTestDlg的實現檔案中(CMyTestDlg.cpp

BEGIN_MESSAGE_MAP END_MESSAGE_MAP()中新增。

ON_MESSAGE(WM_MINIMIZE, OnMyMinimize)

ON_MESSAGE(WM_NOTIFYICON,OnNotifyIcon)

實現這兩個函式就成了。

void CMyTestDlg::OnNotifyIcon(WPARAM wParam,LPARAM lParam)

{

UINT nID = (UINT)wParam;

UINT uMouseMsg = (UINT)lParam;

switch(uMouseMsg)

{

case WM_LBUTTONDBLCLK:

if(m_bIsMinimized = TRUE)

{

ShowWindow(SW_SHOW);

m_bIsMinimized = !m_bIsMinimized;

}

break;

case WM_RBUTTONDOWN:

CMenu menu;

CPoint curpos;

GetCursorPos(&curpos);

if(menu.LoadMenu(IDR_MENU1))

{

CMenu* pPopup;

pPopup = menu.GetSubMenu(0);

ASSERT(pPopup != NULL);

SetForegroundWindow();

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,

curpos.x,curpos.y,AfxGetMainWnd());

}

}

}

void CMyTestDlg::OnMyMinimize()

{

if(m_bIsFirstMinimized == FALSE)

{

NOTIFYICONDATA nc;

nc.cbSize = sizeof(NOTIFYICONDATA);

nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

nc.hWnd = m_hWnd;

lstrcpy(nc.szTip,"最小化");

nc.uCallbackMessage = WM_NOTIFYICON;

nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;

nc.uID = IDC_NOTIFYICON;

Shell_NotifyIcon(NIM_ADD , &nc);

m_bIsFirstMinimized = TRUE;

}

ShowWindow(SW_HIDE);

m_bIsMinimized = TRUE;

}

6.將

void CMyTestDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

if(nID == SC_MINIMIZE)

OnMyMinimize();

else

CDialog::OnSysCommand(nID, lParam);

}

}

修改成這個模樣。

這些就是如何實現啦,還有可以在選單中實現退出,顯示程式,以及加上個定時器,進而可以實現托盤的動畫實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/559014/viewspace-806886/,如需轉載,請註明出處,否則將追究法律責任。

相關文章