MFC网速及流量监控程序的实现(完)
? ? 要獲得及時的網速和流量信息,歸根到底還是對經過網卡的數據量的處理。而經過網卡的數據可以根據方向分為兩類,一類是進來的,另一類是出去的,確切地說就是上傳和下載。
? ? 網速是單位時間內的數據量,本質其實還是流量。
? ? 上文提到的那個類MFNetTraffic中功能很完整,不經能獲得流量信息,還轉化為了網速,只要在程序中調用即可了。另外,由于那個類不是自己寫的,也就沒有做出任何修改,所以其中的某些函數對于本程序來所可能是從未調用的。
? ? 說了這么多,其實監控網速和流量最關鍵的問題已經解決了,那就是如何獲取當前的網速即流量信息,接下去的目標只是將它們合理顯示出來。
? ? 現在流行的做法是,做一個小的矩形懸浮窗口,動態顯示網速即流量信息,類似360和金山的那種。而這種方法也確實很經典,所以本程序也采用這種顯示方式。
? ? 小窗口即是一個無標題欄的對話框,在對話框屬性中取消勾選標題欄就行了。另外,顯示信息就采用Text控件。
具體的流程是:啟動程序->彈出小窗口->獲取信息->顯示信息。
因為要動態的顯示信息,所以設置一個計時器函數,每隔一段時間獲取一次信息并顯示到小窗口上。
另外,一些追加的細節:
1、小窗口是始終置頂的,這里就沒有添加取消置頂的功能,一來是因為小窗口很小,二來我為其添加了調整透明度的功能,如果實在不想看到小窗口,將其透明度設為最小值即可。
2、透明度的設置函數:
參數就一個byte,取值0-255,即為透明度的范圍,0為完全透明,255為不透明。(因為實在vc6.0上,所以比較復雜,高版本上直接調用SetLayeredWindowAttributes函數即可)
/************************************************************************/ /* 設置窗體透明 */ /************************************************************************/ BOOL CTraffic_MonitoringDlg::SetWindowTransparency(int Byte) {// 設置窗體透明COLORREF maskColor = GetSysColor(COLOR_3DFACE); // 獲取窗體顏色SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE)|0x00080000); HINSTANCE hInst = LoadLibrary(_T("User32.dll")); if (hInst) { typedef BOOL (WINAPI *MyFun)(HWND,COLORREF,BYTE,DWORD); MyFun myfun = NULL; myfun = (MyFun)GetProcAddress(hInst, "SetLayeredWindowAttributes"); if (myfun) {myfun(GetSafeHwnd(),maskColor,Byte,2); // 100是透明度(范圍0-255)}else{FreeLibrary(hInst); return FALSE;}FreeLibrary(hInst); } return TRUE; }
3、取消小窗口任務欄圖標(窗口初始化函數中調用):
// 隱藏任務欄圖標ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW,0);
4、因為要顯示的信息比較多,共有六項,分別是:下載網速、上傳網速、下載流量、上傳流量、總網速、總流量。
所以同時顯示太占空間,所以決定默認只顯示兩項,即上傳和下載的網速。其他信息則影藏起來,若用戶需要查看,鼠標左鍵雙擊小窗口,會彈出一個擴展窗口,顯示剩下的四項信息。
窗口擴展與收縮功能的實現函數:
/************************************************************************/ /* 展開、收縮對話框 */ /************************************************************************/ void CTraffic_MonitoringDlg::ExtendDlg(int nResourceID, BOOL bExpand) {// nResourceID為分割控件的ID(此處為picture控件)// 如果bExpand==TRUE,則擴展對話框為最大;// 否則縮小對話框,新的對話框的底部為資源nResourceID控件分割static CRect rcLarge;static CRect rcSmall;// 在開始時,保存對話框的最大和最小尺寸if(rcLarge.IsRectNull()){CRect rcLandmark;// 得到分割條的指針CWnd* pWndLandmark=GetDlgItem(nResourceID);ASSERT(pWndLandmark);// 得到對話框的尺寸GetWindowRect(rcLarge);// 得到分割條在對話框中的位置pWndLandmark->GetWindowRect(rcLandmark);rcSmall=rcLarge;rcSmall.bottom=rcLandmark.top;}if(bExpand){// 擴展對話框:重新設置對話框到其原始(最大)尺寸(rcLarge)SetWindowPos(NULL,0,0,rcLarge.Width(),rcLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);}else{// 縮小對話框:重新設置對話框到其最小尺寸(rcSmall)SetWindowPos(NULL,0,0,rcSmall.Width(),rcSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);} }
5、為了操作方便,為程序添加了一個托盤,右鍵響應一個窗口的彈出,這個窗口用于設置網口、透明度等信息。
具體如何實現托盤:http://blog.csdn.net/wwkaven/article/details/30487699
6、為了程序盡可能簡單,添加一個刪除托盤圖標的功能,這樣要退出程序通過右擊小窗口實現。
7、最后一點,資源管理器重啟后,托盤圖標丟失的問題:
http://blog.csdn.net/wwkaven/article/details/32108845
程序:http://download.csdn.net/detail/wwkaven/7515523
完整源代碼:http://download.csdn.net/detail/wwkaven/7515507
總結
以上是生活随笔為你收集整理的MFC网速及流量监控程序的实现(完)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3D立体影像拍摄手法和技巧
- 下一篇: 我的软件工程之路(三)