日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个托盘程序演示 -闹钟 Alert

發布時間:2023/12/9 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个托盘程序演示 -闹钟 Alert 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

From:?http://www.vckbase.com/document/viewdoc/?id=996

下載源代碼

關鍵字:托盤 Tray

  想必大家都看見過那些在系統托盤(Tray)中的程序吧,本文就演示了如何創建一個這樣的托盤程序Alert。Alert是一個運行在系統托盤中的小鬧鐘,它在設定的時間后觸發,運行屏幕保護程序并播放一首歌曲。這個程序是很久以前寫的了,而我現在沒有安裝VC++了,所以本文的截圖都是朋友Leoyin幫我做出來后傳給我的(好麻煩,呵呵),在此也對他表示感謝!
  建立一個托盤程序的關鍵在于Windows API-Shell_NotifyIcon()的使用,這個API的聲明包含在ShellAPI.H文件中。請在StdAfx.h中使用“#include <ShellAPI.H>”將其引入工程,別象我當時那么傻-在工程管理器里引入了該文件,導致現在你們在類視圖中看見了許多不希望看到的東西。我現在也沒有VC++ IDE來修改它了,就這樣吧。
  首先,給大家介紹一下相關的函數和結構:Shell_NotifyIcon()的原型和說明(最新版)如下:

BOOL Shell_NotifyIcon(DWORD dwMessage,PNOTIFYICONDATA lpdata); 參數及返回值說明:
dwMessage :[輸入參數] 說明要執行的動作。動作的可選值如下:
  • NIM_ADD 增加一個圖標到托盤區
  • NIM_DELETE 從托盤區刪除一個圖標
  • NIM_MODIFY 修改圖標
  • NIM_SETFOCUS 將焦點(Focus)返回托盤區。這個消息通常在托盤區圖標完成了用戶界面下的操作后發出。比如一個托盤圖標顯示了一個快捷菜單,然后用戶按下ESC鍵了操作,這時使用NIM_SETFOCUS將焦點繼續保留在托盤區。該項僅在系統外殼與常用控制DLL( Shlwapi.dll與Comctl32.dll)5.0以上版本才可用。
  • NIM_SETVERSION 指定使用特定版本的系統外殼與常用控制DLL。缺省值為0,表示使用Win95方式。該項僅在系統外殼與常用控制DLL 5.0以上版本才可用。
lpdata: [輸入參數] 一個指向NOTIFYICONDATA結構的指針。
返回值: 成功時函數返回TRUE,否則FALSE。

NOTIFYICONDATA ?結構的說明(最新版)如下:
typedef struct _NOTIFYICONDATA {DWORD cbSize;HWND hWnd;UINT uID;UINT uFlags;UINT uCallbackMessage;HICON hIcon;TCHAR szTip[64];DWORD dwState;DWORD dwStateMask;TCHAR szInfo[256];union {UINT uTimeout;UINT uVersion;};TCHAR szInfoTitle[64];DWORD dwInfoFlags;GUID guidItem; } NOTIFYICONDATA, *PNOTIFYICONDATA;
cbSize以字節計的結構大小,以適應不同版本。
hWnd接收Windows消息的窗口句柄。
uID托盤圖標的ID。
uFlags指示結構中的哪些成員包含有效數據,可選值:NIF_ICON, NIF_MESSAGE,NIF_TIP,NIF_STATE,NIF_INFO,NIF_GUID。
uCallbackMessage回調消息ID,由用戶自定義。與一個自定義的消息處理函數關聯。
hIcon托盤圖標的句柄。
szTip托盤圖標的提示字符串。
注意:以下數據成員僅限系統外殼與常用控制DLL?5.0及以上版本才有效!
dwState圖標的狀態:NIS_HIDDEN-隱藏,或NIS_SHAREDICON-可視。
dwStateMask圖標狀態掩碼,用以設置dwState
szInfo氣球型提示(Balloon ToolTip)的字符串。
uTimeout以毫秒計的提示顯示時間
uVersion確定所依賴的版本。0-Win95,NOTIFYICON_VERSION-Win2000
szInfoTitle氣球型提示的標題
dwInfoFlags

設置氣球型提示所用的圖標(類似MessageBox中所使用的圖標):

  • NIIF_ERROR   錯誤
  • NIIF_INFO    信息
  • NIIF_NONE    沒有圖標
  • NIIF_WARNING  警告
  • NIIF_ICON_MASK 6.0版本保留
  • NIIF_NOSOUND  限6.0版本,不播放對應的聲音
guidItem6.0版本保留

接下來,讓我們開始實現這個Alert吧。Alert是一個基于對話框的Win32應用程序,利用AppWizard 創建它吧。然后設計一下這個對話框如圖:

?

在AlertDlg.H中加入: #include < mmsystem.h > //這個頭文件是干什么的記不得了,呵呵#define WM_NOTIFYICON WM_USER+5 //自定義消息的ID #define IDI_ICON 0x0005 //圖標ID #define IDT_APPLY WM_USER+6 //我要使用的定時器Timer的自定義消息ID

  然后為類CAlertDlg添加數據成員m_Interval和自定義成員函數的聲明(怎么添加不用我教了吧?)。最后形成CAlertDlg類的聲明(已去掉了一些注釋)如下:

class CAlertDlg : public CDialog { public:~CAlertDlg();CAlertDlg(CWnd* pParent = NULL);enum { IDD = IDD_ALERT_DIALOG };int m_Interval; //定時間隔,以分鐘為單位protected:virtual void DoDataExchange(CDataExchange* pDX);protected:void ShowMessage(void); //自定義的定時觸發時運行的函數HICON m_hIcon; //圖標句柄virtual BOOL OnInitDialog();afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnClickApply(); //"應用"按鈕的點擊消息處理函數virtual void OnCancel(); //"退出"按鈕的點擊消息處理函數afx_msg void OnTimer(UINT nIDEvent); //定時器消息處理函數afx_msg void OnClickHide(); //"隱藏"按鈕的點擊消息處理函數//自定義WM_NOTIFYICON消息的處理函數afx_msg void OnNotifyIcon(WPARAM wParam, LPARAM lParam); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); //系統消息處理函數afx_msg BOOL OnQueryEndSession(); //Windows關閉消息處理函數DECLARE_MESSAGE_MAP() };

以下是AlertDlg.CPP中相應函數的實現(還是設置點錨點吧):  

BOOL CAlertDlg::OnInitDialog() {SetIcon(m_hIcon, TRUE);SetIcon(m_hIcon, FALSE);// 初始化時間間隔CSpinButtonCtrl * pSpin;pSpin = (CSpinButtonCtrl *) GetDlgItem(IDC_SPIN);pSpin->SetRange(5,150);m_Interval = 30;CDialog::OnInitDialog();// 設置定時器,每秒一次心跳SetTimer(1, 1000, NULL);// 將圖標放入系統托盤NOTIFYICONDATA nd;nd.cbSize = sizeof (NOTIFYICONDATA);nd.hWnd = m_hWnd;nd.uID = IDI_ICON;nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;nd.uCallbackMessage= WM_NOTIFYICON;nd.hIcon = m_hIcon;strcpy(nd.szTip, "我的鬧鐘");Shell_NotifyIcon(NIM_ADD, &nd);return TRUE; }void CAlertDlg::OnClickApply() {// 重置時間間隔UpdateData();OnTimer(IDT_APPLY); }void CAlertDlg::OnCancel() {// 釋放定時器KillTimer(1);// 將圖標從系統托盤中刪除NOTIFYICONDATA nd;nd.cbSize = sizeof (NOTIFYICONDATA);nd.hWnd = m_hWnd;Shell_NotifyIcon(NIM_DELETE, &nd);CDialog::OnCancel(); }void CAlertDlg::OnTimer(UINT nIDEvent) {static CString strTemp;static int Count = 0;COleDateTime dtTime;// 刷新顯示的時間//常在論壇里遇到人問怎么獲得當前時間,這相知道了吧?dtTime = COleDateTime::GetCurrentTime(); strTemp.Format("現在時間 %02i:%02i:%02i ",dtTime.GetHour(),dtTime.GetMinute(),dtTime.GetSecond());GetDlgItem(IDC_CURTIME)->SetWindowText(strTemp);// 刷新剩余時間值if (nIDEvent == IDT_APPLY) Count = 0; //若用戶重新定義了時間間隔,則重新開始計時Count++;int RestTime;RestTime = m_Interval - Count/60;if (RestTime <= 0) {Count = 0;ShowMessage();}strTemp.Format("離下次提醒還差 %i 分鐘", RestTime);GetDlgItem(IDC_RESTTIME)->SetWindowText(strTemp); CDialog::OnTimer(nIDEvent); }//這個ShowMessasge()函數,你們需要自己修改一下,我的代碼太死板了 void CAlertDlg::ShowMessage() {//調用C:\InfoCD\WinaMP\下的WinaMP3播放Music.m3u清單::WinExec("C:\\INFOCD\\WINAMP\\WINAMP.EXE music.m3u",SW_HIDE);MessageBox("您該休息一會兒了......", "休息", MB_SYSTEMMODAL|MB_OK|MB_ICONEXCLAMATION|MB_ICONWARNING);//運行C:\Windows\System下的太空屏保ShellExecute(m_hWnd,"open","C:\\WINDOWS\\SYSTEM\\太空.scr", NULL,NULL,SW_SHOWNORMAL); }afx_msg void CAlertDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam) {// 響應在托盤圖標上的單擊//wParam中是響應消息的圖標ID,lParam中則是Windows的消息if ((wParam == IDI_ICON)&&(lParam == WM_LBUTTONDOWN))ShowWindow(SW_SHOWNORMAL); }void CAlertDlg::OnSysCommand(UINT nID, LPARAM lParam) {// 屏蔽最大化(MFC Bug?),將最小化重定向至隱藏窗口if (nID == SC_MAXIMIZE)return;if (nID == SC_MINIMIZE)ShowWindow(SW_HIDE);elseCWnd::OnSysCommand(nID, lParam); }BOOL CAlertDlg::OnQueryEndSession() {// 在用戶退出Windows時自動退出應用程序CAlertDlg::OnCancel();return TRUE; }void CAlertDlg::OnClickHide() {OnSysCommand(SC_MINIMIZE, 0x0000);return; }
好了,通過閱讀上面這些源代碼,我想大家對托盤程序的創建有了一定的認識了吧,這也是本文的根本目的。 只是這個程序有個Bug:在程序退出后圖標仍在托盤區顯示,要把鼠標在圖標上面過一下才會消失。這個Bug記得有人提出過解決辦法,好象是要釋放圖標句柄什么的??上矣洸坏昧?#xff0c;這個程序也沒有再修改。?


衷心希望大家給我回復,謝謝!

參考文章:
1、MSDN中的相關鏈接: The Taskbar TrayNot Sample
2、VCKBase里也有不少優秀文章(比如NorthTibet編譯的“ 系統托盤編程完全指南 ”)。

在硬盤版的MSDN還會有相應的專題文章,自己搜搜吧。

總結

以上是生活随笔為你收集整理的一个托盘程序演示 -闹钟 Alert的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 无码专区久久综合久中文字幕 | 黄色不打码视频 | 人人爽人人爽人人片 | 国产精品夫妻自拍 | 少妇69xx | 黄色尤物视频 | 91精品欧美一区二区三区 | 一区二区不卡视频在线观看 | 久久久久高清 | 毛片专区 | 久久久久久久久免费视频 | 99久久久国产精品无码性 | 欧美黑人一级片 | 日韩美女视频网站 | 国产欧美一区二区视频 | 亚洲精品国产精品国 | 理论片亚洲 | 午夜成人鲁丝片午夜精品 | 极品美女扒开粉嫩小泬 | 亚洲av无码一区二区三区在线观看 | 一级aaaa毛片 | 国产一级免费在线观看 | 国内自拍2020 | 91国内视频| 成人性视频网 | 成人免费毛片嘿嘿连载视频 | 中文字幕视频网 | 欧美黄色特级片 | 成人午夜sm精品久久久久久久 | 热九九精品 | 不许穿内裤随时挨c调教h苏绵 | av中文字幕观看 | a激情 | 顶级黑人搡bbw搡bbbb搡 | 超碰蜜臀 | 9人人澡人人爽人人精品 | 国产精品亚洲一区二区无码 | 污污视频在线看 | 干干干日日日 | 国产在线一二 | 中文在线观看高清视频 | 免费成人看视频 | 色哟哟视频在线观看 | 久久精品—区二区三区舞蹈 | 中文永久免费观看 | 久久精品国产亚洲AV成人婷婷 | 国产一区二区免费视频 | 久久久综合 | www操 | 一本在线 | 小泽玛利亚一区二区三区 | 欧美一级免费视频 | 超碰狠狠干 | 亚洲免费精品 | 成人激情免费 | 中文字幕在线二区 | 美女搡bbb又爽又猛又黄www | 久草视频在线资源 | 一区二区三区视频免费看 | 色天堂在线视频 | 色窝窝无码一区二区三区 | 免费网站观看www在线观 | 97视频国产 | 青草国产视频 | 动漫精品一区一码二码三码四码 | 亚洲精品视频一区二区三区 | 国产欧美久久久久 | 黄色网页在线播放 | 精品国产乱码久久久久夜深人妻 | 大吊一区二区三区 | 欧美a级黄色 | 免费成人视屏 | 边啃奶头边躁狠狠躁 | 成人h在线观看 | 青青草青青操 | 办公室摸腿吻胸激情视频 | 精品一区二区三区入口 | 日韩在线91 | 美女一区二区三区 | 日日做夜夜爽毛片麻豆 | 欧美国产精品一区二区三区 | 久久99精品久久久久久琪琪 | 九色91popny蝌蚪| 国产精品久久久一区 | 国产一区二区自拍视频 | 十八岁世界在线观看高清免费韩剧 | 爽好多水快深点欧美视频 | 蜜臀久久99精品久久久久久 | 69性视频 | 999色综合 | 国产精品免费视频一区 | 一区在线看| 久久久久亚洲AV成人无码国产 | 国产成人一区二区 | 一区二区日本视频 | 四川黄色一级片 | mm131国产精品 | 女人扒开腿让男人桶爽 | 久草毛片 |