VC編制系統托盤的一種實現方法[習作]
關鍵字: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 box和minimize 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Qt開發】實現系統托盤,托盤選單,托盤訊息QT
- Avalonia 實現動態托盤
- Java中如何使用系統托盤Java
- 系統托盤中的快捷圖示(轉)
- 從U盤執行Linux作業系統的三種方法Linux作業系統
- win7系統隱藏NVIDIA托盤圖示的操作方法Win7
- 開發作業系統的各種方法作業系統
- Winform設定托盤程式,托盤顯示ORM
- win10系統U盤製作方法_製作win10系統u盤步驟Win10
- 如何讓java程式最小化至系統托盤Java
- u盤製作系統盤
- 基於前端技術實現的全面預算編制系統前端
- Windows10系統怎麼隱藏托盤圖示Windows
- 解密《一個作業系統的實現》這本書解密作業系統
- SNMP用VC++6.0實現的方法 (轉)C++
- 製作Linux啟動盤的四種方法(轉)Linux
- JAVA托盤程式SystemTray的心得Java
- swt 簡單的托盤程式
- 在 Linux 上為你的任務建立一個自定義的系統托盤指示器Linux
- go語言實現的一款簡單的網盤系統Go
- 作業系統學習(六)—— 執行緒概念及特點,作業系統的併發機制作業系統執行緒
- 基於Duilib的win32程式實現最小化到托盤UIWin32
- Aero:用rust編寫的新現代作業系統Rust作業系統
- 一種子圖佈局方法的實現
- 區塊鏈支付系統開發的各種製作方法區塊鏈
- UNIX作業系統正確的五種關機方法(轉)作業系統
- 【轉載】SAP 系統中STO+VC 技術實現
- win10系統隨身碟製作方法_製作win10系統u盤步驟Win10
- 04.Django實現完整登入系統的兩種方法(cookie and session)DjangoCookieSession
- VC啟動一個新執行緒的三種方法執行緒
- 配置《Orange's一個作業系統的實現》環境心得作業系統
- 製作一個移動Ubuntu系統,可以做到即插即用(U盤系統,非啟動盤)Ubuntu
- U盤裝CENTOS作業系統CentOS作業系統
- windows10系統盤製作Windows
- 作業系統之“實驗一”作業系統
- PHP外掛系統的實現(四):實現註冊動作PHP
- 寫作業系統之實現程式作業系統
- 作業系統(3)程式及其實現作業系統