pull/4/head
zoeda 1 year ago
parent c2c055de4b
commit 4db5af56f6

@ -1,106 +0,0 @@
##### 说明
硬盘上的一份截图代码,作者是[sudami](https://bbs.pediy.com/thread-54302.htm)。
提取了里面的3个类CatchScreenDlg、MyTracker.hMyEdit自己在实现下。
双缓冲,完美无闪烁。
##### 截图
![snatshot.png](snatshot.png)
##### 说明
1、重写了MyEdit的绘制避免闪烁。
2、修改CCatchScreenDlg中部分逻辑避免闪烁
3、增加ToolBar控件仿QQ截图界面。按钮实际功能未开发。
4、实现截图飞选中区域暗色处理
##### ToolBar控件消息处理
```c++
BOOL CCatchScreenDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
bool bHandle = true;
HWND hWnd = m_toolBar.GetHWND();
if(lParam == (LPARAM)m_toolBar.GetHWND())
{
int wmId = LOWORD(wParam);
switch(wmId)
{
case MyToolBar_ID:
AfxMessageBox(_T("矩形"));
break;
case MyToolBar_ID+1:
AfxMessageBox(_T("圆形"));
break;
case MyToolBar_ID +2:
AfxMessageBox(_T("画笔"));
break;
case MyToolBar_ID +3:
AfxMessageBox(_T("马赛克"));
break;
case MyToolBar_ID +4:
AfxMessageBox(_T("文字"));
break;
case MyToolBar_ID +5:
AfxMessageBox(_T("撤销"));
break;
case MyToolBar_ID +6:
CopyScreenToBitmap(m_rectTracker.m_rect, TRUE);
PostQuitMessage(0);
break;
case MyToolBar_ID +7:
PostQuitMessage(0);
break;
case MyToolBar_ID +8:
CopyScreenToBitmap(m_rectTracker.m_rect, TRUE);
PostQuitMessage(0);
break;
default:
bHandle = false;
break;
}
::SetFocus(hWnd);
}
if (bHandle == false)
{
return CDialog::OnCommand(wParam,lParam);
}
}
```
##### 神奇的非选中区域暗色处理算法
```c++
Gdiplus::Graphics graphics(dcCompatible);
HRGN hgn1 = CreateRectRgn(m_rectTracker.m_rect.left,m_rectTracker.m_rect.top,
m_rectTracker.m_rect.right,m_rectTracker.m_rect.bottom);
Region region1(hgn1);
HRGN hgn2 = CreateRectRgn(rect.left,rect.top,
rect.right,rect.bottom);
Region region2(hgn2);
region2.Exclude(&region1);
SolidBrush solidBrush(Color(100, 128, 128, 128));
graphics.FillRegion(&solidBrush,&region2);
DeleteObject(hgn1);
DeleteObject(hgn2);
```

Binary file not shown.

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Screenshot", "Screenshot\Screenshot.vcproj", "{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Debug|Win32.ActiveCfg = Debug|Win32
{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Debug|Win32.Build.0 = Debug|Win32
{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Release|Win32.ActiveCfg = Release|Win32
{24E39ACB-AB81-485D-8D36-749B3F5EC1E8}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

@ -0,0 +1,35 @@
[config]
transparency=100
always_on_top=0
lock_window_pos=0
show_notify_icon=1
show_cpu_memory=1
mouse_penetrate=0
show_task_bar_wnd=1
position_x=1420
position_y=900
text_color=14547455
hide_main_window=0
skin_selected=\皮肤07
font_name=微软雅黑
font_size=10
swap_up_down=0
hide_main_wnd_when_fullscreen=1
up_string=上传: $
down_string=下载: $
cpu_string=CPU: $
memory_string=内存: $
[connection]
auto_select=1
connection_name=Intel(R) Wi-Fi 6 AX200 160MHz-WFP Native MAC Layer LightWeight Filter-0000
[task_bar]
task_bar_back_color=0
task_bar_text_color=16777215
tack_bar_show_cpu_memory=1
tack_bar_font_name=微软雅黑
tack_bar_font_size=9
task_bar_swap_up_down=0
up_string=↑: $
down_string=↓: $
cpu_string=CPU: $
memory_string=内存: $

@ -0,0 +1,4 @@
[ViewState]
Mode=
Vid=
FolderType=Generic

@ -0,0 +1,9 @@
2023/11/06 5
2017/11/16 35534
2017/11/15 105882
2017/11/14 152433
2017/10/23 11649
2017/07/28 7405
2017/07/05 47
2017/07/04 984
2017/06/25 133

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=16384
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=3803808
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=9844741
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=16777215
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=16777215
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=335674
skin_author=zy_

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=16773870
skin_author=zy

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -0,0 +1,3 @@
[skin]
text_color=14547455
skin_author=zy

@ -0,0 +1,28 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TrafficMonitor", "TrafficMonitor\TrafficMonitor.vcxproj", "{09483BED-B1E9-4827-8120-A18302C84AA8}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{09483BED-B1E9-4827-8120-A18302C84AA8}.Debug|x64.ActiveCfg = Debug|x64
{09483BED-B1E9-4827-8120-A18302C84AA8}.Debug|x64.Build.0 = Debug|x64
{09483BED-B1E9-4827-8120-A18302C84AA8}.Debug|x86.ActiveCfg = Debug|Win32
{09483BED-B1E9-4827-8120-A18302C84AA8}.Debug|x86.Build.0 = Debug|Win32
{09483BED-B1E9-4827-8120-A18302C84AA8}.Release|x64.ActiveCfg = Release|x64
{09483BED-B1E9-4827-8120-A18302C84AA8}.Release|x64.Build.0 = Release|x64
{09483BED-B1E9-4827-8120-A18302C84AA8}.Release|x86.ActiveCfg = Release|Win32
{09483BED-B1E9-4827-8120-A18302C84AA8}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

@ -0,0 +1,334 @@
#include "stdafx.h"
#include "Common.h"
CCommon::CCommon()
{
}
CCommon::~CCommon()
{
}
wstring CCommon::StrToUnicode(const char* str)
{
wstring result;
int size;
size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
if (size <= 0) return wstring();
wchar_t* str_unicode = new wchar_t[size + 1];
MultiByteToWideChar(CP_ACP, 0, str, -1, str_unicode, size);
result.assign(str_unicode);
delete[] str_unicode;
return result;
}
string CCommon::UnicodeToStr(const wchar_t * wstr)
{
string result;
int size{ 0 };
size = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
if (size <= 0) return string();
char* str = new char[size + 1];
WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, size, NULL, NULL);
result.assign(str);
delete[] str;
return result;
}
bool CCommon::WritePrivateProfileIntW(const wchar_t * AppName, const wchar_t * KeyName, int value, const wchar_t * Path)
{
wchar_t buff[11];
_itow_s(value, buff, 10);
return (WritePrivateProfileStringW(AppName, KeyName, buff, Path) != FALSE);
}
CString CCommon::DataSizeToString(unsigned int size)
{
CString str;
if (size < 1024 * 10) //10KB以下以KB为单位保留2位小数
str.Format(_T("%.2fKB"), size / 1024.0f);
else if (size < 1024 * 1024) //1MB以下以KB为单位保留1位小数
str.Format(_T("%.1fKB"), size / 1024.0f);
else if (size < 1024 * 1024 * 1024) //1GB以下以MB为单位保留2位小数
str.Format(_T("%.2fMB"), size / 1024.0f / 1024.0f);
else
str.Format(_T("%.2fGB"), size / 1024.0f / 1024.0f / 1024.0f);
return str;
}
CString CCommon::KBytesToString(unsigned int kb_size)
{
CString k_bytes_str;
if (kb_size < 1024)
k_bytes_str.Format(_T("%dKB"), kb_size);
else if (kb_size < 1024 * 1024)
k_bytes_str.Format(_T("%.2fMB"), kb_size / 1024.0);
else
k_bytes_str.Format(_T("%.2fGB"), kb_size / 1024.0 / 1024.0);
return k_bytes_str;
}
__int64 CCommon::CompareFileTime2(FILETIME time1, FILETIME time2)
{
__int64 a = static_cast<__int64>(time1.dwHighDateTime) << 32 | time1.dwLowDateTime;
__int64 b = static_cast<__int64>(time2.dwHighDateTime) << 32 | time2.dwLowDateTime;
return b - a;
}
void CCommon::WriteLog(const char* str_text, LPCTSTR file_path)
{
SYSTEMTIME cur_time;
GetLocalTime(&cur_time);
char buff[32];
sprintf_s(buff, "%d/%.2d/%.2d %.2d:%.2d:%.2d.%.3d: ", cur_time.wYear, cur_time.wMonth, cur_time.wDay,
cur_time.wHour, cur_time.wMinute, cur_time.wSecond, cur_time.wMilliseconds);
ofstream file{ file_path, std::ios::app }; //以追加的方式打开日志文件
file << buff;
file << str_text << std::endl;
}
BOOL CCommon::CreateFileShortcut(LPCTSTR lpszLnkFileDir, LPCTSTR lpszFileName, LPCTSTR lpszLnkFileName, LPCTSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd)
{
if (lpszLnkFileDir == NULL)
return FALSE;
HRESULT hr;
IShellLink *pLink; //IShellLink对象指针
IPersistFile *ppf; //IPersisFil对象指针
//创建IShellLink对象
hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink);
if (FAILED(hr))
return FALSE;
//从IShellLink对象中获取IPersistFile接口
hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf);
if (FAILED(hr))
{
pLink->Release();
return FALSE;
}
TCHAR file_path[MAX_PATH];
GetModuleFileName(NULL, file_path, MAX_PATH);
//目标
if (lpszFileName == NULL)
pLink->SetPath(file_path);
else
pLink->SetPath(lpszFileName);
//工作目录
if (lpszWorkDir != NULL)
{
pLink->SetWorkingDirectory(lpszWorkDir);
}
else
{
//设置工作目录为快捷方式目标所在位置
TCHAR workDirBuf[MAX_PATH];
if (lpszFileName == NULL)
wcscpy_s(workDirBuf, file_path);
else
wcscpy_s(workDirBuf, lpszFileName);
LPTSTR pstr = wcsrchr(workDirBuf, _T('\\'));
*pstr = _T('\0');
pLink->SetWorkingDirectory(workDirBuf);
}
//快捷键
if (wHotkey != 0)
pLink->SetHotkey(wHotkey);
//备注
if (lpszDescription != NULL)
pLink->SetDescription(lpszDescription);
//显示方式
pLink->SetShowCmd(iShowCmd);
//快捷方式的路径 + 名称
wchar_t szBuffer[MAX_PATH];
if (lpszLnkFileName != NULL) //指定了快捷方式的名称
swprintf_s(szBuffer, L"%s\\%s", lpszLnkFileDir, lpszLnkFileName);
else
{
//没有指定名称,就从取指定文件的文件名作为快捷方式名称。
const wchar_t *pstr;
if (lpszFileName != NULL)
pstr = wcsrchr(lpszFileName, L'\\');
else
pstr = wcsrchr(file_path, L'\\');
if (pstr == NULL)
{
ppf->Release();
pLink->Release();
return FALSE;
}
//注意后缀名要从.exe改为.lnk
swprintf_s(szBuffer, L"%s\\%s", lpszLnkFileDir, pstr);
int nLen = wcslen(szBuffer);
szBuffer[nLen - 3] = L'l';
szBuffer[nLen - 2] = L'n';
szBuffer[nLen - 1] = L'k';
}
//保存快捷方式到指定目录下
//WCHAR wsz[MAX_PATH]; //定义Unicode字符串
//MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH);
hr = ppf->Save(szBuffer, TRUE);
ppf->Release();
pLink->Release();
return SUCCEEDED(hr);
}
wstring CCommon::GetStartUpPath()
{
LPITEMIDLIST ppidl;
TCHAR pszStartUpPath[MAX_PATH];
if (SHGetSpecialFolderLocation(NULL, CSIDL_STARTUP, &ppidl) == S_OK)
{
SHGetPathFromIDList(ppidl, pszStartUpPath);
CoTaskMemFree(ppidl);
}
return wstring(pszStartUpPath);
}
void CCommon::GetFiles(const wchar_t* path, vector<wstring>& files)
{
//文件句柄
int hFile = 0;
//文件信息用Unicode保存使用_wfinddata_t多字节字符集使用_finddata_t
_wfinddata_t fileinfo;
wstring file_name;
if ((hFile = _wfindfirst(wstring(path).append(L"\\*").c_str(), &fileinfo)) != -1)
{
do
{
file_name.assign(fileinfo.name);
if (file_name != L"." && file_name != L"..")
//files.push_back(wstring(path) + L"\\" + file_name); //将文件名保存(忽略"."和"..")
files.push_back(L"\\" + file_name); //将文件名保存(忽略"."和"..")
} while (_wfindnext(hFile, &fileinfo) == 0);
}
_findclose(hFile);
}
bool CCommon::FileExist(LPCTSTR file_name)
{
_wfinddata_t fileinfo;
return (_wfindfirst(file_name, &fileinfo) != -1);
}
SYSTEMTIME CCommon::CompareSystemTime(SYSTEMTIME a, SYSTEMTIME b)
{
SYSTEMTIME result{};
short hour = a.wHour - b.wHour;
short minute = a.wMinute - b.wMinute;
short second = a.wSecond - b.wSecond;
if (second < 0)
{
second += 60;
minute--;
}
if (minute < 0)
{
minute += 60;
hour--;
}
if (hour < 0)
{
hour += 24;
}
result.wHour = hour;
result.wMinute = minute;
result.wSecond = second;
return result;
}
wstring CCommon::GetExePath()
{
wchar_t path[MAX_PATH];
GetModuleFileNameW(NULL, path, MAX_PATH);
size_t index;
wstring current_path{ path };
index = current_path.find_last_of(L'\\');
current_path = current_path.substr(0, index + 1);
return current_path;
}
void CCommon::DrawWindowText(CDC * pDC, CRect rect, LPCTSTR lpszString, COLORREF color, COLORREF back_color)
{
pDC->SetTextColor(color);
//m_pDC->SetBkMode(TRANSPARENT);
//用背景色填充矩形区域
pDC->FillSolidRect(rect, back_color);
pDC->DrawText(lpszString, rect, DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
}
void CCommon::FillStaticColor(CStatic & static_ctr, COLORREF color)
{
CDC* pDC = static_ctr.GetDC();
CRect rect;
static_ctr.GetClientRect(&rect);
pDC->FillSolidRect(rect, color);
}
bool CCommon::IsForegroundFullscreen()
{
bool bFullscreen{ false }; //用于指示前台窗口是否是全屏
HWND hWnd;
RECT rcApp;
RECT rcDesk;
hWnd = GetForegroundWindow(); //获取当前正在与用户交互的前台窗口句柄
TCHAR buff[256];
GetClassName(hWnd, buff, 256); //获取前台窗口的类名
CString class_name{ buff };
if (hWnd != GetDesktopWindow() && class_name!=_T("WorkerW") && hWnd != GetShellWindow())//如果前台窗口不是桌面窗口,也不是控制台窗口
{
GetWindowRect(hWnd, &rcApp); //获取前台窗口的坐标
GetWindowRect(GetDesktopWindow(), &rcDesk); //根据桌面窗口句柄,获取整个屏幕的坐标
if (rcApp.left <= rcDesk.left && //如果前台窗口的坐标完全覆盖住桌面窗口,就表示前台窗口是全屏的
rcApp.top <= rcDesk.top &&
rcApp.right >= rcDesk.right &&
rcApp.bottom >= rcDesk.bottom)
{
bFullscreen = true;
}
}//如果前台窗口是桌面窗口,或者是控制台窗口,就直接返回不是全屏
return bFullscreen;
}
bool CCommon::CopyStringToClipboard(const wstring & str)
{
if (OpenClipboard(NULL))
{
HGLOBAL clipbuffer;
EmptyClipboard();
size_t size = (str.size() + 1) * 2;
clipbuffer = GlobalAlloc(GMEM_DDESHARE, size);
memcpy_s(GlobalLock(clipbuffer), size, str.c_str(), size);
GlobalUnlock(clipbuffer);
if (SetClipboardData(CF_UNICODETEXT, clipbuffer) == NULL)
return false;
CloseClipboard();
return true;
}
else return false;
}
bool CCommon::WhenStart()
{
int tick_count = GetTickCount();
return (tick_count < 60000);
}

@ -0,0 +1,105 @@
#pragma once
//储存某一天的历史流量
struct HistoryTraffic
{
int year;
int month;
int day;
unsigned kBytes; //当天使用的流量以KB为单位
//比较两个HistoryTraffic对象的日期如果a的时间大于b则返回true
static bool DateGreater(const HistoryTraffic& a, const HistoryTraffic& b)
{
if (a.year != b.year)
return a.year > b.year;
else if (a.month != b.month)
return a.month > b.month;
else if (a.day != b.day)
return a.day > b.day;
else
return false;
}
//判断两个HistoryTraffic对象的日期是否相等
static bool DateEqual(const HistoryTraffic& a, const HistoryTraffic& b)
{
return a.year == b.year && a.month == b.month && a.day == b.day;
}
};
class CCommon
{
public:
CCommon();
~CCommon();
//将const char*字符串转换成宽字符字符串
static wstring StrToUnicode(const char* str);
static string UnicodeToStr(const wchar_t* wstr);
//将一个int类型数据写入ini文件如果成功则返回true
static bool WritePrivateProfileIntW(const wchar_t * AppName, const wchar_t * KeyName, int value, const wchar_t * Path);
//根据数据在大小转换成以KB、MB、GB为单位的字符串
static CString DataSizeToString(unsigned int size);
static CString KBytesToString(unsigned int kb_size);
//返回两个FILETIME结构的时间差
static __int64 CompareFileTime2(FILETIME time1, FILETIME time2);
//将一个日志信息str_text写入到file_path文件中
static void WriteLog(const char* str_text, LPCTSTR file_path);
/*
lpszLnkFileDir NULL
lpszFileName NULLEXE
lpszLnkFileName NULLEXE
wHotkey 0
pszDescription
iShowCmd
*/
static BOOL CreateFileShortcut(LPCTSTR lpszLnkFileDir, LPCTSTR lpszFileName = NULL, LPCTSTR lpszLnkFileName = NULL, LPCTSTR lpszWorkDir = NULL, WORD wHotkey = 0, LPCTSTR lpszDescription = NULL, int iShowCmd = SW_SHOWNORMAL);
//获取开始菜单“所有程序”中的“启动”目录的路径
static wstring GetStartUpPath();
//获取path路径下的文件或文件夹并将文件或文件夹名称保存在files容器中。
static void GetFiles(const wchar_t* path, vector<wstring>& files);
//判断一个文件是否存在
static bool FileExist(LPCTSTR file_name);
//计算两个SYSTEMTIME结构时间的差a-b只保留时、分、秒
static SYSTEMTIME CompareSystemTime(SYSTEMTIME a, SYSTEMTIME b);
static wstring GetExePath();
//在指定位置绘制文本
static void DrawWindowText(CDC* pDC, CRect rect, LPCTSTR lpszString, COLORREF color, COLORREF back_color);
//为一个Static控件填充指定的颜色
static void FillStaticColor(CStatic& static_ctr, COLORREF color);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* IsForegroundFullscreen
*
*
* true
false
* 线
* IsForegroundFullscreen ()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static bool IsForegroundFullscreen();
//将一个字符串保存到剪贴板
static bool CopyStringToClipboard(const wstring& str);
//判断现在是否刚开机在刚开机1分钟内返回true否则返回false
static bool WhenStart();
};

@ -0,0 +1,52 @@
// DonateDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "DonateDlg.h"
#include "afxdialogex.h"
// CDonateDlg 对话框
IMPLEMENT_DYNAMIC(CDonateDlg, CDialog)
CDonateDlg::CDonateDlg(CWnd* pParent /*=NULL*/)
: CDialog(IDD_DONATE_DIALOG, pParent)
{
}
CDonateDlg::~CDonateDlg()
{
}
void CDonateDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_DONATE_PIC, m_donate_pic);
}
BEGIN_MESSAGE_MAP(CDonateDlg, CDialog)
END_MESSAGE_MAP()
// CDonateDlg 消息处理程序
BOOL CDonateDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
CWindowDC dc(this);
HDC hDC = dc.GetSafeHdc();
int dpi = GetDeviceCaps(hDC, LOGPIXELSY);
int side = 304 * dpi / 96;
m_donate_pic.SetWindowPos(&CWnd::wndTop, 0, 0, side, side, SWP_NOMOVE); //更改控件的宽和高
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

@ -0,0 +1,28 @@
#pragma once
#include "afxwin.h"
// CDonateDlg 对话框
class CDonateDlg : public CDialog
{
DECLARE_DYNAMIC(CDonateDlg)
public:
CDonateDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CDonateDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DONATE_DIALOG };
#endif
protected:
CStatic m_donate_pic;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
};

@ -0,0 +1,78 @@
// HistoryTrafficDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "HistoryTrafficDlg.h"
#include "afxdialogex.h"
// CHistoryTrafficDlg 对话框
IMPLEMENT_DYNAMIC(CHistoryTrafficDlg, CDialog)
CHistoryTrafficDlg::CHistoryTrafficDlg(deque<HistoryTraffic>& history_traffics, CWnd* pParent /*=NULL*/)
: CDialog(IDD_HISTORY_TRAFFIC_DIALOG, pParent), m_history_traffics(history_traffics)
{
}
CHistoryTrafficDlg::~CHistoryTrafficDlg()
{
}
void CHistoryTrafficDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_HISTORY_INFO_LIST, m_history_list);
}
BEGIN_MESSAGE_MAP(CHistoryTrafficDlg, CDialog)
END_MESSAGE_MAP()
// CHistoryTrafficDlg 消息处理程序
BOOL CHistoryTrafficDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
//获取dpi设置
CWindowDC dc(this);
HDC hDC = dc.GetSafeHdc();
int dpi = GetDeviceCaps(hDC, LOGPIXELSY);
//初始化列表控件
CRect rect;
m_history_list.GetClientRect(rect);
m_history_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
int width0, width1;
width0 = rect.Width() / 5 * 2;
width1 = rect.Width() - width0 - 21 * dpi / 96;
m_history_list.InsertColumn(0, _T("日期"), LVCFMT_LEFT, width0); //插入第0列
m_history_list.InsertColumn(1, _T("使用的流量(上传+下载)"), LVCFMT_LEFT, width1); //插入第1列
for (int i{}; i<m_history_traffics.size(); i++)
{
CString date_str;
CString k_bytes_str;
date_str.Format(_T("%.4d/%.2d/%.2d"), m_history_traffics[i].year, m_history_traffics[i].month, m_history_traffics[i].day);
if (m_history_traffics[i].kBytes < 1024)
k_bytes_str.Format(_T("%dKB"), m_history_traffics[i].kBytes);
else if (m_history_traffics[i].kBytes < 1024*1024)
k_bytes_str.Format(_T("%.2fMB"), m_history_traffics[i].kBytes / 1024.0);
else
k_bytes_str.Format(_T("%.2fGB"), m_history_traffics[i].kBytes / 1024.0 / 1024.0);
m_history_list.InsertItem(i, date_str);
m_history_list.SetItemText(i, 1, k_bytes_str);
}
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

@ -0,0 +1,29 @@
#pragma once
#include "afxcmn.h"
#include "Common.h"
// CHistoryTrafficDlg 对话框
class CHistoryTrafficDlg : public CDialog
{
DECLARE_DYNAMIC(CHistoryTrafficDlg)
public:
CHistoryTrafficDlg(deque<HistoryTraffic>& history_traffics, CWnd* pParent = NULL); // 标准构造函数
virtual ~CHistoryTrafficDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_HISTORY_TRAFFIC_DIALOG };
#endif
protected:
CListCtrl m_history_list;
deque<HistoryTraffic>& m_history_traffics;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
};

@ -0,0 +1,215 @@
// MainWndSettingsDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "MainWndSettingsDlg.h"
#include "afxdialogex.h"
// CMainWndSettingsDlg 对话框
IMPLEMENT_DYNAMIC(CMainWndSettingsDlg, CDialogEx)
CMainWndSettingsDlg::CMainWndSettingsDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_MAIN_WND_SETTINGS_DIALOG, pParent)
{
}
CMainWndSettingsDlg::~CMainWndSettingsDlg()
{
}
void CMainWndSettingsDlg::DrawStaticColor()
{
CCommon::FillStaticColor(m_color_static, m_text_color);
}
void CMainWndSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_TEXT_COLOR_STATIC, m_color_static);
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMainWndSettingsDlg, CDialogEx)
ON_EN_CHANGE(IDC_UPLOAD_EDIT, &CMainWndSettingsDlg::OnEnChangeUploadEdit)
ON_EN_CHANGE(IDC_DOWNLOAD_EDIT, &CMainWndSettingsDlg::OnEnChangeDownloadEdit)
ON_EN_CHANGE(IDC_CPU_EDIT, &CMainWndSettingsDlg::OnEnChangeCpuEdit)
ON_EN_CHANGE(IDC_MEMORY_EDIT, &CMainWndSettingsDlg::OnEnChangeMemoryEdit)
//ON_WM_TIMER()
//ON_STN_CLICKED(IDC_TEXT_COLOR_STATIC, &CMainWndSettingsDlg::OnStnClickedTextColorStatic)
ON_BN_CLICKED(IDC_SET_COLOR_BUTTON1, &CMainWndSettingsDlg::OnBnClickedSetColorButton1)
ON_BN_CLICKED(IDC_SET_DEFAULT_BUTTON, &CMainWndSettingsDlg::OnBnClickedSetDefaultButton)
ON_BN_CLICKED(IDC_SET_FONT_BUTTON, &CMainWndSettingsDlg::OnBnClickedSetFontButton)
ON_BN_CLICKED(IDC_SWITCH_UP_DOWN_CHECK, &CMainWndSettingsDlg::OnBnClickedSwitchUpDownCheck)
ON_BN_CLICKED(IDC_FULLSCREEN_HIDE_CHECK, &CMainWndSettingsDlg::OnBnClickedFullscreenHideCheck)
END_MESSAGE_MAP()
// CMainWndSettingsDlg 消息处理程序
BOOL CMainWndSettingsDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
SetBackgroundColor(RGB(255, 255, 255));
//初始化各控件状态
SetDlgItemText(IDC_FONT_NAME_EDIT, m_font_name);
wchar_t buff[16];
swprintf_s(buff, L"%d", m_font_size);
SetDlgItemText(IDC_FONT_SIZE_EDIT, buff);
SetDlgItemText(IDC_UPLOAD_EDIT, m_up_string.c_str());
SetDlgItemText(IDC_DOWNLOAD_EDIT, m_down_string.c_str());
SetDlgItemText(IDC_CPU_EDIT, m_cpu_string.c_str());
SetDlgItemText(IDC_MEMORY_EDIT, m_memory_string.c_str());
((CButton*)GetDlgItem(IDC_SWITCH_UP_DOWN_CHECK))->SetCheck(m_swap_up_down);
((CButton*)GetDlgItem(IDC_FULLSCREEN_HIDE_CHECK))->SetCheck(m_hide_main_wnd_when_fullscreen);
//SetTimer(11, 50, NULL);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CMainWndSettingsDlg::OnEnChangeUploadEdit()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_UPLOAD_EDIT, tmp);
m_up_string = tmp;
}
void CMainWndSettingsDlg::OnEnChangeDownloadEdit()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_DOWNLOAD_EDIT, tmp);
m_down_string = tmp;
}
void CMainWndSettingsDlg::OnEnChangeCpuEdit()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_CPU_EDIT, tmp);
m_cpu_string = tmp;
}
void CMainWndSettingsDlg::OnEnChangeMemoryEdit()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_MEMORY_EDIT, tmp);
m_memory_string = tmp;
}
//void CMainWndSettingsDlg::OnTimer(UINT_PTR nIDEvent)
//{
// // TODO: 在此添加消息处理程序代码和/或调用默认值
// if (nIDEvent == 11)
// {
// CCommon::FillStaticColor(m_color_static, m_text_color);
// KillTimer(11);
// }
// CDialogEx::OnTimer(nIDEvent);
//}
//void CMainWndSettingsDlg::OnStnClickedTextColorStatic()
//{
// // TODO: 在此添加控件通知处理程序代码
//}
void CMainWndSettingsDlg::OnBnClickedSetColorButton1()
{
// TODO: 在此添加控件通知处理程序代码
CColorDialog colorDlg(m_text_color, 0, this);
if (colorDlg.DoModal() == IDOK)
{
m_text_color = colorDlg.GetColor();
DrawStaticColor();
}
}
void CMainWndSettingsDlg::OnBnClickedSetDefaultButton()
{
// TODO: 在此添加控件通知处理程序代码
m_up_string = L"上传: ";
m_down_string = L"下载: ";
m_cpu_string = L"CPU: ";
m_memory_string = L"内存: ";
SetDlgItemText(IDC_UPLOAD_EDIT, m_up_string.c_str());
SetDlgItemText(IDC_DOWNLOAD_EDIT, m_down_string.c_str());
SetDlgItemText(IDC_CPU_EDIT, m_cpu_string.c_str());
SetDlgItemText(IDC_MEMORY_EDIT, m_memory_string.c_str());
}
void CMainWndSettingsDlg::OnBnClickedSetFontButton()
{
// TODO: 在此添加控件通知处理程序代码
CFont font;
font.CreatePointFont(m_font_size * 10, m_font_name);
LOGFONT lf{}; //LOGFONT变量
font.GetLogFont(&lf);
CFontDialog fontDlg(&lf); //构造字体对话框,初始选择字体为之前字体
if (IDOK == fontDlg.DoModal()) // 显示字体对话框
{
//获取字体信息
m_font_name = fontDlg.GetFaceName();
m_font_size = fontDlg.GetSize() / 10;
//将字体信息显示出来
SetDlgItemText(IDC_FONT_NAME_EDIT, m_font_name);
wchar_t buff[16];
swprintf_s(buff, L"%d", m_font_size);
SetDlgItemText(IDC_FONT_SIZE_EDIT, buff);
}
}
void CMainWndSettingsDlg::OnBnClickedSwitchUpDownCheck()
{
// TODO: 在此添加控件通知处理程序代码
m_swap_up_down = (((CButton*)GetDlgItem(IDC_SWITCH_UP_DOWN_CHECK))->GetCheck() != 0);
}
void CMainWndSettingsDlg::OnBnClickedFullscreenHideCheck()
{
// TODO: 在此添加控件通知处理程序代码
m_hide_main_wnd_when_fullscreen = (((CButton*)GetDlgItem(IDC_FULLSCREEN_HIDE_CHECK))->GetCheck() != 0);
}

@ -0,0 +1,51 @@
#pragma once
// CMainWndSettingsDlg 对话框
class CMainWndSettingsDlg : public CDialogEx
{
DECLARE_DYNAMIC(CMainWndSettingsDlg)
public:
CMainWndSettingsDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CMainWndSettingsDlg();
//选项设置数据
CString m_font_name;
int m_font_size;
COLORREF m_text_color;
wstring m_up_string; //默认为“上传: ”
wstring m_down_string; //默认为“下载: ”
wstring m_cpu_string; //默认为“CPU: ”
wstring m_memory_string; //默认为“内存: ”
bool m_swap_up_down; //是否交换上传和下载的位置
bool m_hide_main_wnd_when_fullscreen; //有程序全屏运行时隐藏悬浮窗
void DrawStaticColor();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MAIN_WND_SETTINGS_DIALOG };
#endif
protected:
CStatic m_color_static;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnEnChangeUploadEdit();
afx_msg void OnEnChangeDownloadEdit();
afx_msg void OnEnChangeCpuEdit();
afx_msg void OnEnChangeMemoryEdit();
// afx_msg void OnTimer(UINT_PTR nIDEvent);
// afx_msg void OnStnClickedTextColorStatic();
afx_msg void OnBnClickedSetColorButton1();
afx_msg void OnBnClickedSetDefaultButton();
afx_msg void OnBnClickedSetFontButton();
afx_msg void OnBnClickedSwitchUpDownCheck();
afx_msg void OnBnClickedFullscreenHideCheck();
};

@ -0,0 +1,251 @@
// CNetworkInfoDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "NetworkInfoDlg.h"
#include "afxdialogex.h"
// CNetworkInfoDlg 对话框
IMPLEMENT_DYNAMIC(CNetworkInfoDlg, CDialog)
CNetworkInfoDlg::CNetworkInfoDlg(MIB_IFROW network_info, CWnd* pParent /*=NULL*/)
: CDialog(IDD_NETWORK_INFO_DIALOG, pParent), m_network_info(network_info)
{
}
CNetworkInfoDlg::~CNetworkInfoDlg()
{
}
void CNetworkInfoDlg::GetIPAddress()
{
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //PIP_ADAPTER_INFO结构体指针存储本机网卡信息
unsigned long stSize = sizeof(IP_ADAPTER_INFO); //得到结构体大小,用于GetAdaptersInfo参数
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
delete pIpAdapterInfo; //释放原来的内存空间
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //重新申请内存空间用来存储所有网卡信息
nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize); //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
}
PIP_ADAPTER_INFO pIpAdapterInfoHead = pIpAdapterInfo; //保存pIpAdapterInfo链表中第一个元素的地址
if (ERROR_SUCCESS == nRel)
{
string current_network_descr{ (const char*)m_network_info.bDescr }; //MIB_IFROW结构中的当前选中的网络连接的描述
//获取网卡信息
//可能有多网卡,因此通过循环来查找当前要显示的网卡
while (pIpAdapterInfo)
{
if(current_network_descr.find(pIpAdapterInfo->Description) != string::npos)
{
m_ip_address = CCommon::StrToUnicode(pIpAdapterInfo->IpAddressList.IpAddress.String);
m_subnet_mask = CCommon::StrToUnicode(pIpAdapterInfo->IpAddressList.IpMask.String);
m_default_gateway = CCommon::StrToUnicode(pIpAdapterInfo->GatewayList.IpAddress.String);
break;
}
pIpAdapterInfo = pIpAdapterInfo->Next;
}
}
//释放内存空间
if (pIpAdapterInfoHead)
{
delete pIpAdapterInfoHead;
}
}
void CNetworkInfoDlg::ShowInfo()
{
CString temp;
m_info_list.InsertItem(0, _T("接口名"));
m_info_list.SetItemText(0, 1, m_network_info.wszName);
m_info_list.InsertItem(1, _T("接口描述"));
m_info_list.SetItemText(1, 1, CCommon::StrToUnicode((const char*)m_network_info.bDescr).c_str());
m_info_list.InsertItem(2, _T("连接类型"));
switch (m_network_info.dwType)
{
case IF_TYPE_OTHER: temp = _T("其他类型网络"); break;
case IF_TYPE_ETHERNET_CSMACD: temp = _T("以太网网络"); break;
case IF_TYPE_ISO88025_TOKENRING: temp = _T("令牌环网络"); break;
case IF_TYPE_FDDI: temp = _T("光纤分布式数据接口 (FDDI) 网络"); break;
case IF_TYPE_PPP: temp = _T("PPP 网络"); break;
case IF_TYPE_SOFTWARE_LOOPBACK: temp = _T("软件环回网络"); break;
case IF_TYPE_ATM: temp = _T("ATM 网络"); break;
case IF_TYPE_IEEE80211: temp = _T("IEEE 802.11 无线网络"); break;
case IF_TYPE_TUNNEL: temp = _T("隧道类型封装网络"); break;
case IF_TYPE_IEEE1394: temp = _T("IEEE 1394 (Firewire) 高性能串行总线网络"); break;
case IF_TYPE_IEEE80216_WMAN: temp = _T("对于 WiMax 设备的移动宽带"); break;
case IF_TYPE_WWANPP: temp = _T("基于 GSM 网络设备的移动宽带"); break;
case IF_TYPE_WWANPP2: temp = _T("基于 CDMA 的设备移动宽带"); break;
default: temp = _T("未知网络"); break;
}
m_info_list.SetItemText(2, 1, temp);
//m_info_list.InsertItem(3, _T("最大传输单位大小"));
//temp.Format(_T("%u"), m_network_info.dwMtu);
//m_info_list.SetItemText(3, 1, temp);
m_info_list.InsertItem(3, _T("速度"));
temp.Format(_T("%dMbps"), m_network_info.dwSpeed / 1000000);
m_info_list.SetItemText(3, 1, temp);
m_info_list.InsertItem(4, _T("适配器物理地址"));
temp = _T("");
char buff[3];
for (int i{}; i < m_network_info.dwPhysAddrLen; i++)
{
//_itoa_s(m_network_info.bPhysAddr[i], buff, 16);
sprintf_s(buff, "%.2x", m_network_info.bPhysAddr[i]);
temp += buff;
if (i != m_network_info.dwPhysAddrLen - 1)
temp += _T('-');
}
m_info_list.SetItemText(4, 1, temp);
m_info_list.InsertItem(5, _T("IP地址"));
m_info_list.SetItemText(5, 1, m_ip_address.c_str());
m_info_list.InsertItem(6, _T("子网掩码"));
m_info_list.SetItemText(6, 1, m_subnet_mask.c_str());
m_info_list.InsertItem(7, _T("默认网关"));
m_info_list.SetItemText(7, 1, m_default_gateway.c_str());
////temp.Format(_T("物理地址长度:%d\r\n"), m_network_info.dwPhysAddrLen);
////out_info += temp;
////temp = _T("适配器物理地址:");
////temp += StrToUnicode((const char*)m_network_info.bPhysAddr).c_str();
////out_info += temp;
////out_info += _T("\r\n");
//m_info_list.InsertItem(5, _T("管理员状态"));
//m_info_list.SetItemText(5, 1, m_network_info.dwAdminStatus ? _T("启用") : _T("禁用"));
m_info_list.InsertItem(8, _T("连接状态"));
switch (m_network_info.dwOperStatus)
{
case IF_OPER_STATUS_NON_OPERATIONAL: temp = _T("LAN 适配器已被禁用"); break;
case IF_OPER_STATUS_UNREACHABLE: temp = _T("WAN 适配器未连接"); break;
case IF_OPER_STATUS_DISCONNECTED: temp = _T("网络电缆断开连接或无载体"); break;
case IF_OPER_STATUS_CONNECTING: temp = _T("WAN 适配器正在连接"); break;
case IF_OPER_STATUS_CONNECTED: temp = _T("WAN 适配器连接到远程对等方"); break;
case IF_OPER_STATUS_OPERATIONAL: temp = _T("LAN 适配器已连接"); break;
default: temp = _T("未知状态"); break;
}
m_info_list.SetItemText(8, 1, temp);
m_info_list.InsertItem(9, _T("已接收字节数"));
temp.Format(_T("%u (%s)"), m_network_info.dwInOctets, CCommon::DataSizeToString(m_network_info.dwInOctets));
m_info_list.SetItemText(9, 1, temp);
m_info_list.InsertItem(10, _T("已发送字节数"));
temp.Format(_T("%u (%s)"), m_network_info.dwOutOctets, CCommon::DataSizeToString(m_network_info.dwOutOctets));
m_info_list.SetItemText(10, 1, temp);
m_info_list.InsertItem(11, _T("自程序启动以来已接收字节数"));
temp.Format(_T("%u (%s)"), m_in_bytes, CCommon::DataSizeToString(m_in_bytes));
m_info_list.SetItemText(11, 1, temp);
m_info_list.InsertItem(12, _T("自程序启动以来已发送字节数"));
temp.Format(_T("%u (%s)"), m_out_bytes, CCommon::DataSizeToString(m_out_bytes));
m_info_list.SetItemText(12, 1, temp);
m_info_list.InsertItem(13, _T("程序已运行时间"));
SYSTEMTIME current_time, time;
GetLocalTime(&current_time);
time = CCommon::CompareSystemTime(current_time, m_start_time);
temp.Format(_T("%d小时%d分%d秒"), time.wHour, time.wMinute, time.wSecond);
m_info_list.SetItemText(13, 1, temp);
}
void CNetworkInfoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_INFO_LIST1, m_info_list);
}
BEGIN_MESSAGE_MAP(CNetworkInfoDlg, CDialog)
ON_COMMAND(ID_COPY_TEXT, &CNetworkInfoDlg::OnCopyText)
ON_NOTIFY(NM_RCLICK, IDC_INFO_LIST1, &CNetworkInfoDlg::OnNMRClickInfoList1)
END_MESSAGE_MAP()
// CNetworkInfoDlg 消息处理程序
BOOL CNetworkInfoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
//获取dpi设置
CWindowDC dc(this);
HDC hDC = dc.GetSafeHdc();
int dpi = GetDeviceCaps(hDC, LOGPIXELSY);
//获取IP地址
GetIPAddress();
//初始化列表控件
CRect rect;
m_info_list.GetClientRect(rect);
m_info_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_LABELTIP);
int width0, width1;
width0 = rect.Width() / 4;
width1 = rect.Width() - width0 - 21 * dpi / 96;
m_info_list.InsertColumn(0, _T("项目"), LVCFMT_LEFT, width0); //插入第0列
m_info_list.InsertColumn(1, _T(""), LVCFMT_LEFT, width1); //插入第1列
//显示列表中的信息
ShowInfo();
//SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //取消置顶
m_info_list.GetToolTips()->SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
m_menu.LoadMenu(IDR_INFO_MENU); //装载右键菜单
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CNetworkInfoDlg::OnCopyText()
{
// TODO: 在此添加命令处理程序代码
if (!CCommon::CopyStringToClipboard(wstring(m_selected_string)))
MessageBox(_T("复制到剪贴板失败!"), NULL, MB_ICONWARNING);
}
void CNetworkInfoDlg::OnNMRClickInfoList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
//获取鼠标点击处的文本
int item, sub_item;
item = pNMItemActivate->iItem;
sub_item = pNMItemActivate->iSubItem;
m_selected_string = m_info_list.GetItemText(item, sub_item);
//弹出右键菜单
CMenu* pContextMenu = m_menu.GetSubMenu(0); //获取第一个弹出菜单
CPoint point1; //定义一个用于确定光标位置的位置
GetCursorPos(&point1); //获取当前光标的位置,以便使得菜单可以跟随光标
pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //在指定位置显示弹出菜单
*pResult = 0;
}

@ -0,0 +1,48 @@
#pragma once
#include"Common.h"
#include "afxcmn.h"
// CNetworkInfoDlg 对话框
class CNetworkInfoDlg : public CDialog
{
DECLARE_DYNAMIC(CNetworkInfoDlg)
public:
CNetworkInfoDlg(MIB_IFROW network_info ,CWnd* pParent = NULL); // 标准构造函数
virtual ~CNetworkInfoDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_NETWORK_INFO_DIALOG };
#endif
unsigned int m_in_bytes; //当前查看的网络自启动以来已接收字节数
unsigned int m_out_bytes; //当前查看的网络自启动以来已发送字节数
SYSTEMTIME m_start_time; //程序启动的时间
protected:
MIB_IFROW m_network_info; //当前查看的网络连接信息
wstring m_ip_address{ L"-.-.-.-" }; //IP地址
wstring m_subnet_mask{ L"-.-.-.-" }; //子网掩码
wstring m_default_gateway{ L"-.-.-.-" }; //默认网关
CListCtrl m_info_list;
CMenu m_menu;
CString m_selected_string;
void GetIPAddress(); //获取IP地址
void ShowInfo();
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
virtual BOOL OnInitDialog();
public:
afx_msg void OnCopyText();
afx_msg void OnNMRClickInfoList1(NMHDR *pNMHDR, LRESULT *pResult);
};

@ -0,0 +1,121 @@
// OptionsDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "OptionsDlg.h"
#include "afxdialogex.h"
// COptionsDlg 对话框
IMPLEMENT_DYNAMIC(COptionsDlg, CDialog)
COptionsDlg::COptionsDlg(int tab, CWnd* pParent /*=NULL*/)
: CDialog(IDD_OPTIONS_DIALOG, pParent), m_tab_selected{ tab }
{
}
COptionsDlg::~COptionsDlg()
{
}
void COptionsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TAB1, m_tab);
}
BEGIN_MESSAGE_MAP(COptionsDlg, CDialog)
ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &COptionsDlg::OnTcnSelchangeTab1)
ON_WM_TIMER()
END_MESSAGE_MAP()
// COptionsDlg 消息处理程序
BOOL COptionsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
//插入标签
m_tab.InsertItem(0, _T("主窗口设置"));
m_tab.InsertItem(1, _T("任务栏窗口设置"));
//创建子对话框
m_tab1_dlg.Create(IDD_MAIN_WND_SETTINGS_DIALOG, &m_tab);
m_tab2_dlg.Create(IDD_TASKBAR_SETTINGS_DIALOG, &m_tab);
//调整子对话框的大小和位置
CRect rect;
m_tab.GetClientRect(rect);
CRect rcTabItem;
m_tab.GetItemRect(0, rcTabItem);
rect.top += rcTabItem.Height() + 4;
rect.left += 4;
rect.bottom -= 4;
rect.right -= 4;
m_tab1_dlg.MoveWindow(&rect);
m_tab2_dlg.MoveWindow(&rect);
//设置默认选中的标签
switch (m_tab_selected)
{
case 0:
m_tab1_dlg.ShowWindow(SW_SHOW);
SetTimer(TIMER_ID1, 50, NULL);
break;
case 1:
m_tab2_dlg.ShowWindow(SW_SHOW);
SetTimer(TIMER_ID2, 50, NULL);
break;
}
m_tab.SetCurFocus(m_tab_selected);
//m_tab.SetCurSel(m_tab_selected);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void COptionsDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
m_tab_selected = m_tab.GetCurSel();
switch (m_tab_selected)
{
case 0:
m_tab1_dlg.ShowWindow(SW_SHOW);
m_tab2_dlg.ShowWindow(SW_HIDE);
m_tab1_dlg.SetFocus();
SetTimer(TIMER_ID1, 50, NULL); //点击了第1个选项卡后延迟30毫秒绘制颜色控件
break;
case 1:
m_tab2_dlg.ShowWindow(SW_SHOW);
m_tab1_dlg.ShowWindow(SW_HIDE);
m_tab2_dlg.SetFocus();
SetTimer(TIMER_ID2, 50, NULL); //点击了第2个选项卡后延迟30毫秒绘制颜色控件
break;
}
*pResult = 0;
}
void COptionsDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent == TIMER_ID1)
{
m_tab1_dlg.DrawStaticColor();
KillTimer(TIMER_ID1);
}
if (nIDEvent == TIMER_ID2)
{
m_tab2_dlg.DrawStaticColor();
KillTimer(TIMER_ID2);
}
CDialog::OnTimer(nIDEvent);
}

@ -0,0 +1,38 @@
#pragma once
#include "MainWndSettingsDlg.h"
#include "TaskBarSettingsDlg.h"
#include "afxcmn.h"
// COptionsDlg 对话框
#define TIMER_ID1 1120
#define TIMER_ID2 1121
class COptionsDlg : public CDialog
{
DECLARE_DYNAMIC(COptionsDlg)
public:
COptionsDlg(int tab = 0, CWnd* pParent = NULL); // 标准构造函数
virtual ~COptionsDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_OPTIONS_DIALOG };
#endif
CMainWndSettingsDlg m_tab1_dlg;
CTaskBarSettingsDlg m_tab2_dlg;
protected:
CTabCtrl m_tab;
int m_tab_selected;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnTimer(UINT_PTR nIDEvent);
};

@ -0,0 +1,67 @@
================================================================================
MICROSOFT 基础类库 : TrafficMonitor 项目概述
===============================================================================
应用程序向导已为您创建了此 TrafficMonitor 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写应用程序的起点。
本文件概要介绍组成 TrafficMonitor 应用程序的每个文件的内容。
TrafficMonitor.vcxproj
这是使用应用程序向导生成的 VC++ 项目的主项目文件,其中包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
TrafficMonitor.vcxproj.filters
这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。它包含有关项目文件与筛选器之间的关联信息。在 IDE 中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。
TrafficMonitor.h
这是应用程序的主头文件。
其中包括其他项目特定的标头(包括 Resource.h并声明 CTrafficMonitorApp 应用程序类。
TrafficMonitor.cpp
这是包含应用程序类 CTrafficMonitorApp 的主应用程序源文件。
TrafficMonitor.rc
这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。项目资源包含在 2052 中。
res\TrafficMonitor.ico
这是用作应用程序图标的图标文件。此图标包括在主资源文件 TrafficMonitor.rc 中。
res\TrafficMonitor.rc2
此文件包含不在 Microsoft Visual C++ 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
/////////////////////////////////////////////////////////////////////////////
应用程序向导创建一个对话框类:
TrafficMonitorDlg.h、TrafficMonitorDlg.cpp - 对话框
这些文件包含 CTrafficMonitorDlg 类。此类定义应用程序的主对话框的行为。对话框模板包含在 TrafficMonitor.rc 中,该文件可以在 Microsoft Visual C++ 中编辑。
/////////////////////////////////////////////////////////////////////////////
其他功能:
ActiveX 控件
该应用程序包含对使用 ActiveX 控件的支持。
/////////////////////////////////////////////////////////////////////////////
其他标准文件:
StdAfx.h, StdAfx.cpp
这些文件用于生成名为 TrafficMonitor.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
Resource.h
这是标准头文件,可用于定义新的资源 ID。Microsoft Visual C++ 将读取并更新此文件。
TrafficMonitor.manifest
Windows XP 使用应用程序清单文件来描述特定版本的并行程序集的应用程序依赖项。加载程序使用这些信息来从程序集缓存中加载相应的程序集,并保护其不被应用程序访问。应用程序清单可能会包含在内,以作为与应用程序可执行文件安装在同一文件夹中的外部 .manifest 文件进行重新分发,它还可能以资源的形式包含在可执行文件中。
/////////////////////////////////////////////////////////////////////////////
其他注释:
应用程序向导使用“TODO:”来指示应添加或自定义的源代码部分。
如果应用程序使用共享 DLL 中的 MFC您将需要重新分发 MFC DLL。如果应用程序所使用的语言与操作系统的区域设置不同则还需要重新分发相应的本地化资源 mfc110XXX.DLL。
有关上述话题的更多信息,请参见 MSDN 文档中有关重新分发 Visual C++ 应用程序的部分。
/////////////////////////////////////////////////////////////////////////////

@ -0,0 +1,119 @@
// SkinDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "SkinDlg.h"
#include "afxdialogex.h"
// CSkinDlg 对话框
IMPLEMENT_DYNAMIC(CSkinDlg, CDialogEx)
CSkinDlg::CSkinDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_SKIN_DIALOG, pParent)
{
}
CSkinDlg::~CSkinDlg()
{
}
void CSkinDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_select_box);
DDX_Control(pDX, IDC_STATIC_SKIN_S, m_skin_preview_s);
DDX_Control(pDX, IDC_STATIC_SKIN_L, m_skin_preview_l);
// DDX_Control(pDX, IDC_STATIC_TEXT1, m_preview_text_s);
// DDX_Control(pDX, IDC_STATIC_TEXT2, m_preview_text_l);
}
void CSkinDlg::ShowPreview()
{
//显示小尺寸的预览图
m_skin_preview_s.SetWindowPos(&CWnd::wndTop, 0, 0, m_skin_width, m_skin_height_s, SWP_NOMOVE); //更改控件的宽和高
m_image = (HBITMAP)LoadImage(NULL, (theApp.m_skin_path + m_skins[m_skin_selected]+ L"\\background.bmp").c_str(), IMAGE_BITMAP, m_skin_width, m_skin_height_s, LR_LOADFROMFILE);
m_skin_preview_s.SetBitmap(m_image); //为CStatic控件设置图片
//显示大尺寸的预览图
m_skin_preview_l.SetWindowPos(&CWnd::wndTop, 0, 0, m_skin_width, m_skin_height_l, SWP_NOMOVE);
m_image = (HBITMAP)LoadImage(NULL, (theApp.m_skin_path + m_skins[m_skin_selected] + L"\\background_l.bmp").c_str(), IMAGE_BITMAP, m_skin_width, m_skin_height_l, LR_LOADFROMFILE);
m_skin_preview_l.SetBitmap(m_image);
//获取当前皮肤的文字颜色
m_text_color = GetPrivateProfileInt(_T("skin"), _T("text_color"), 0, (theApp.m_skin_path + m_skins[m_skin_selected] + L"\\skin.ini").c_str());
//获取皮肤作者
wchar_t buff[64];
GetPrivateProfileString(_T("skin"), _T("skin_author"), _T("unknow"), buff, 64, (theApp.m_skin_path + m_skins[m_skin_selected] + L"\\skin.ini").c_str());
SetDlgItemText(IDC_SKIN_INFO, (wstring(L"皮肤作者:") + buff).c_str());
}
void CSkinDlg::SetPreviewText(CStatic& static_preview)
{
CDC* pDC = static_preview.GetDC();
pDC->SetTextColor(m_text_color);
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(this->GetFont());
CRect rect;
static_preview.GetClientRect(&rect);
rect.left += 10;
DrawThemeParentBackground(m_hWnd, pDC->GetSafeHdc(), &rect); //重绘控件区域以解决文字重叠的问题
pDC->DrawText(_T("示例文本1234ABCD"), rect, DT_VCENTER | DT_SINGLELINE);
ReleaseDC(pDC);
}
BEGIN_MESSAGE_MAP(CSkinDlg, CDialogEx)
ON_CBN_SELCHANGE(IDC_COMBO1, &CSkinDlg::OnCbnSelchangeCombo1)
ON_WM_TIMER()
END_MESSAGE_MAP()
// CSkinDlg 消息处理程序
BOOL CSkinDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
//初始化选择框
for (const auto& skin_path : m_skins)
{
wstring skin_name;
size_t index = skin_path.find_last_of(L'\\');
skin_name = skin_path.substr(index + 1);
m_select_box.AddString(skin_name.c_str());
}
m_select_box.SetCurSel(m_skin_selected);
//显示预览图片
ShowPreview();
SetTimer(2345, 100, NULL);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CSkinDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
m_skin_selected = m_select_box.GetCurSel();
ShowPreview();
//显示示例文本
SetPreviewText(m_skin_preview_s);
SetPreviewText(m_skin_preview_l);
}
void CSkinDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SetPreviewText(m_skin_preview_s);
SetPreviewText(m_skin_preview_l);
KillTimer(2345); //定时器响应一次后就将其销毁
CDialogEx::OnTimer(nIDEvent);
}

@ -0,0 +1,49 @@
#pragma once
#include "afxwin.h"
#include"StaticEx.h"
// CSkinDlg 对话框
class CSkinDlg : public CDialogEx
{
DECLARE_DYNAMIC(CSkinDlg)
public:
CSkinDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CSkinDlg();
vector<wstring> m_skins; //皮肤文件的路径
int m_skin_selected; //选择的皮肤
int m_skin_width; //预览图宽度
int m_skin_height_s; //预览图高度(小)
int m_skin_height_l; //预览图高度(大)
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SKIN_DIALOG };
#endif
COLORREF GetTextColor() const
{
return m_text_color;
}
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
COLORREF m_text_color; //当前皮肤的文本颜色
CComboBox m_select_box; //选择框
CStatic m_skin_preview_s; //显示大预览图的控件
CStatic m_skin_preview_l; //显示小预览图的控件
HBITMAP m_image; //图片句柄
//wstring m_skin_author; //皮肤作者
void ShowPreview(); //显示皮肤预览
void SetPreviewText(CStatic& static_preview); //设置预览文字
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnCbnSelchangeCombo1();
afx_msg void OnTimer(UINT_PTR nIDEvent);
};

@ -0,0 +1,210 @@
#include "stdafx.h"
#include "StaticEx.h"
CStaticEx::CStaticEx()
{
}
CStaticEx::CStaticEx(bool is_hyperlink)
{
m_isHyperLink = is_hyperlink;
}
CStaticEx::~CStaticEx()
{
}
void CStaticEx::SetWindowTextEx(LPCTSTR lpszString)
{
CDC* pDC = GetDC();
pDC->SetTextColor(m_TextColor);
pDC->SetBkMode(TRANSPARENT);
pDC->SelectObject(this->GetFont());
//int nTextLeft = 0, nTextTop = 0; //文字输出的位置
CRect rect;
this->GetClientRect(&rect);
DrawThemeParentBackground(m_hWnd, pDC->GetSafeHdc(), &rect); //重绘控件区域以解决文字重叠的问题
pDC->DrawText(lpszString, rect, DT_VCENTER | DT_SINGLELINE);
ReleaseDC(pDC);
m_text = lpszString;
}
void CStaticEx::SetTextColor(COLORREF textColor)
{
m_TextColor = textColor;
SetWindowTextEx(m_text);
}
CString CStaticEx::GetString() const
{
return m_text;
}
void CStaticEx::SetURL(CString strURL)
{
m_strURL = strURL;
}
CString CStaticEx::GetURL() const
{
return m_strURL;
}
LRESULT CStaticEx::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
if (message == WM_SETTEXT)
{
CRect rect;
CDC* pDC = GetDC();
GetClientRect(rect);
DrawThemeParentBackground(m_hWnd, pDC->GetSafeHdc(), &rect);
ReleaseDC(pDC);
}
return CStatic::DefWindowProc(message, wParam, lParam);
}
BEGIN_MESSAGE_MAP(CStaticEx, CStatic)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_WM_MOUSEHOVER()
ON_WM_MOUSELEAVE()
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
void CStaticEx::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_isHyperLink)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
_TrackMouseEvent(&tme);
}
else
{
CStatic::OnMouseMove(nFlags, point);
}
}
void CStaticEx::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_isHyperLink)
{
if (m_strURL.IsEmpty())
{
m_strURL = m_text;
}
ShellExecute(NULL, _T("open"), m_strURL, NULL, NULL, SW_SHOW); //打开超链接
}
else
{
CStatic::OnLButtonUp(nFlags, point);
}
}
void CStaticEx::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CStatic::OnPaint()
if (m_isHyperLink)
{
CFont* pFont = GetFont();
CFont m_Font;
if (pFont != NULL)
{
LOGFONT lf;
pFont->GetLogFont(&lf);
lf.lfUnderline = m_bHot;
if (m_Font.CreateFontIndirect(&lf))
dc.SelectObject(m_Font);
}
dc.SetTextColor(RGB(0, 0, 255));
dc.SetBkMode(TRANSPARENT);
///准备工作
CRect rect;
CBrush BGBrush, *pOldBrush;
this->GetClientRect(&rect);
//画背景
COLORREF backColor = GetSysColor(COLOR_BTNFACE);
BGBrush.CreateSolidBrush(backColor);
pOldBrush = dc.SelectObject(&BGBrush);
dc.FillRect(&rect, &BGBrush);
dc.SelectObject(pOldBrush);
BGBrush.DeleteObject();
///输出文字
if (m_text.GetLength()>0)
{
dc.DrawText(m_text, rect, DT_VCENTER | DT_SINGLELINE);
}
m_Font.DeleteObject();
}
}
void CStaticEx::OnMouseHover(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_isHyperLink && !m_bHot)
{
m_bHot = true;
Invalidate();
}
else
{
CStatic::OnMouseHover(nFlags, point);
}
}
void CStaticEx::OnMouseLeave()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_isHyperLink)
{
m_bHot = false;
Invalidate();
}
else
{
CStatic::OnMouseLeave();
}
}
BOOL CStaticEx::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (m_isHyperLink && m_bHot)
{
::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(32649)));
return TRUE;
}
return CStatic::OnSetCursor(pWnd, nHitTest, message);
}
void CStaticEx::PreSubclassWindow()
{
// TODO: 在此添加专用代码和/或调用基类
if (m_isHyperLink)
{
DWORD dwStyle = GetStyle();
::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
}
GetWindowText(m_text);
CStatic::PreSubclassWindow();
}

@ -0,0 +1,38 @@
//CStatic类的派生类用于实现设置Static控件文字颜色
//以及解决设置了窗口背景图片时控件文字重叠的问题。
#pragma once
#include "afxwin.h"
class CStaticEx :
public CStatic
{
public:
CStaticEx();
CStaticEx(bool is_hyperlink); //构造函数,设置文件控件文本是否为超链接
~CStaticEx();
void SetWindowTextEx(LPCTSTR lpszString); //为控件设置有颜色的文本需要配合SetTextColor使用
void SetTextColor(COLORREF textColor); //设置控件文本颜色
CString GetString() const; //获取控件文本
void SetURL(CString strURL); //设置超链接
CString GetURL() const; //获取超链接字符串
protected:
COLORREF m_TextColor; //控件文字颜色
CString m_text; //控件上的文本
bool m_isHyperLink{ false }; //如果要将控件作为超链接则为true
bool m_bHot{ false }; //当鼠标指向超链接时则为true
CString m_strURL; //超链接字符串
virtual LRESULT DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam);
public:
DECLARE_MESSAGE_MAP()
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg void OnMouseHover(UINT nFlags, CPoint point);
afx_msg void OnMouseLeave();
afx_msg BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
virtual void PreSubclassWindow();
};

@ -0,0 +1,450 @@
// TaskBarDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "TaskBarDlg.h"
#include "afxdialogex.h"
// CTaskBarDlg 对话框
IMPLEMENT_DYNAMIC(CTaskBarDlg, CDialogEx)
CTaskBarDlg::CTaskBarDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_TASK_BAR_DIALOG, pParent)
{
}
CTaskBarDlg::~CTaskBarDlg()
{
}
void CTaskBarDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTaskBarDlg, CDialogEx)
ON_WM_RBUTTONUP()
ON_WM_INITMENU()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
// CTaskBarDlg 消息处理程序
void CTaskBarDlg::ShowInfo()
{
if (this->m_hWnd == NULL || m_pDC == nullptr) return;
CString str;
CString in_speed = CCommon::DataSizeToString(theApp.m_in_speed);
CString out_speed = CCommon::DataSizeToString(theApp.m_out_speed);
//设置缓冲的DC
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
int draw_width = (theApp.m_tbar_show_cpu_memory ? m_window_width : m_window_width_s);
MemBitmap.CreateCompatibleBitmap(m_pDC, draw_width, m_rect.Height());
MemDC.SelectObject(&MemBitmap);
//绘图
CRect tmp{ m_rect };
tmp.MoveToXY(0, 0);
MemDC.FillSolidRect(tmp, theApp.m_tbar_back_color); //填充背景色
MemDC.SelectObject(&m_font);
//绘制上传速度
tmp.bottom = m_window_height / 2;
tmp.right = tmp.left + m_window_width_s;
if (!theApp.m_tbar_swap_up_down)
str.Format(_T("%s%s/s"), theApp.m_tbar_up_string.c_str(), out_speed.GetString());
else
str.Format(_T("%s%s/s"), theApp.m_tbar_down_string.c_str(), in_speed.GetString());
CCommon::DrawWindowText(&MemDC, tmp, str, theApp.m_tbar_text_color, theApp.m_tbar_back_color);
//绘制下载速度
tmp.MoveToY(tmp.bottom);
if (!theApp.m_tbar_swap_up_down)
str.Format(_T("%s%s/s"), theApp.m_tbar_down_string.c_str(), in_speed.GetString());
else
str.Format(_T("%s%s/s"), theApp.m_tbar_up_string.c_str(), out_speed.GetString());
CCommon::DrawWindowText(&MemDC, tmp, str, theApp.m_tbar_text_color, theApp.m_tbar_back_color);
if (theApp.m_tbar_show_cpu_memory)
{
//绘制CPU利用率
if (m_taskbar_on_top_or_bottom)
{
tmp.MoveToXY(m_window_width_s, 0);
tmp.right = tmp.left + (m_window_width - m_window_width_s);
}
else
{
tmp.MoveToY(m_window_height);
tmp.right = tmp.left + (m_window_width - m_window_width_s);
}
str.Format(_T("%s%d%%"), theApp.m_tbar_cpu_string.c_str(), theApp.m_cpu_usage);
CCommon::DrawWindowText(&MemDC, tmp, str, theApp.m_tbar_text_color, theApp.m_tbar_back_color);
//绘制内存利用率
tmp.MoveToY(tmp.bottom);
str.Format(_T("%s%d%%"), theApp.m_tbar_memory_string.c_str(), theApp.m_memory_usage);
CCommon::DrawWindowText(&MemDC, tmp, str, theApp.m_tbar_text_color, theApp.m_tbar_back_color);
}
//将缓冲区DC中的图像拷贝到屏幕中显示
m_pDC->BitBlt(0,0, draw_width, m_rect.Height(), &MemDC, 0, 0, SRCCOPY);
MemBitmap.DeleteObject();
MemDC.DeleteDC();
}
bool CTaskBarDlg::AdjustWindowPos()
{
if (this->m_hWnd == NULL)
return false;
CRect rcMin;
::GetWindowRect(m_hMin, rcMin); //获得最小化窗口的区域
m_taskbar_on_top_or_bottom = IsTaskbarOnTopOrBottom();
if (m_taskbar_on_top_or_bottom) //当任务栏在桌面顶部或底部时
{
//设置窗口大小
m_rect.right = m_rect.left + (theApp.m_tbar_show_cpu_memory ? m_window_width : m_window_width_s);
m_rect.bottom = m_rect.top + m_window_height;
if (rcMin.Width() != m_min_bar_width) //如果最小化窗口的宽度改变了,重新设置任务栏窗口的位置
{
m_rcMin = rcMin;
m_min_bar_width = m_rcMin.Width() - m_rect.Width(); //保存最小化窗口宽度
::MoveWindow(m_hMin, 0, 0, m_rcMin.Width() - m_rect.Width(), m_rcMin.Height(), TRUE); //设置最小化窗口的位置
::MoveWindow(this->m_hWnd, m_rcMin.Width() - m_rect.Width() + 2, (m_rcMin.Height() - m_rect.Height()) / 2, \
m_rect.Width(), m_rect.Height(), TRUE); //设置任务栏窗口的位置
CRect rect;
GetWindowRect(rect); //获取当前窗口的绝对位置
//如果窗口没有被成功嵌入到任务栏,窗口移动到了基于屏幕左上角的绝对位置,则修正窗口的位置
if (rect.left == m_rcMin.Width() - m_rect.Width() + 2 && rect.top == (m_rcMin.Height() - m_rect.Height()) / 2)
{
rect.MoveToXY(rect.left + m_rcBar.left, rect.top + m_rcBar.top);
this->MoveWindow(rect);
}
}
}
else //当任务栏在屏幕在左侧或右侧时
{
//设置窗口大小
m_rect.right = m_rect.left + m_window_width_s;
m_rect.bottom = m_rect.top + (theApp.m_tbar_show_cpu_memory ? (2 * m_window_height) : m_window_height);
if (rcMin.Height() != m_min_bar_height) //如果最小化窗口的高度改变了,重新设置任务栏窗口的位置
{
m_rcMin = rcMin;
m_min_bar_height = m_rcMin.Height() - m_rect.Height(); //保存最小化窗口高度
::MoveWindow(m_hMin, 0, 0, m_rcMin.Width(), m_rcMin.Height() - m_rect.Height(), TRUE); //设置最小化窗口的位置
int left_pos = (m_rcMin.Width() - m_window_width_s) / 2;
if (left_pos < 0) left_pos = 0;
::MoveWindow(this->m_hWnd, left_pos, m_rcMin.Height() - m_rect.Height() + 2, \
m_rect.Width(), m_rect.Height(), TRUE); //设置任务栏窗口的位置
CRect rect;
GetWindowRect(rect); //获取当前窗口的绝对位置
//如果窗口没有被成功嵌入到任务栏,窗口移动到了基于屏幕左上角的绝对位置,则修正窗口的位置
if (rect.left == left_pos && rect.top == m_rcMin.Height() - m_rect.Height() + 2)
{
rect.MoveToXY(rect.left + m_rcBar.left, rect.top + m_rcBar.top);
this->MoveWindow(rect);
}
}
}
if (m_connot_insert_to_task_bar && ::GetForegroundWindow() == m_hTaskbar) //在窗口无法嵌入任务栏时,如果焦点设置在了任务栏上,则让窗口置顶
{
SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //设置置顶
}
return true;
}
bool CTaskBarDlg::IsTaskbarOnTopOrBottom()
{
CRect rect;
if (m_hTaskbar != 0)
{
::GetWindowRect(m_hTaskbar, rect); //获取任务栏的矩形区域
return (rect.Width()>=rect.Height()); //如果任务栏的宽度大于高度,则任务在屏幕的顶部或底部
}
else
{
return true;
}
}
void CTaskBarDlg::SaveConfig()
{
CCommon::WritePrivateProfileIntW(L"task_bar", L"task_bar_back_color", theApp.m_tbar_back_color, theApp.m_config_path.c_str());
CCommon::WritePrivateProfileIntW(L"task_bar", L"task_bar_text_color", theApp.m_tbar_text_color, theApp.m_config_path.c_str());
CCommon::WritePrivateProfileIntW(L"task_bar", L"tack_bar_show_cpu_memory", theApp.m_tbar_show_cpu_memory, theApp.m_config_path.c_str());
WritePrivateProfileString(_T("task_bar"), _T("tack_bar_font_name"), theApp.m_tbar_font_name, theApp.m_config_path.c_str());
CCommon::WritePrivateProfileIntW(L"task_bar", L"tack_bar_font_size", theApp.m_tbar_font_size, theApp.m_config_path.c_str());
CCommon::WritePrivateProfileIntW(L"task_bar", L"task_bar_swap_up_down", theApp.m_tbar_swap_up_down, theApp.m_config_path.c_str());
WritePrivateProfileString(_T("task_bar"), _T("up_string"), (theApp.m_tbar_up_string + L'$').c_str(), theApp.m_config_path.c_str());
WritePrivateProfileString(_T("task_bar"), _T("down_string"), (theApp.m_tbar_down_string + L'$').c_str(), theApp.m_config_path.c_str());
WritePrivateProfileString(_T("task_bar"), _T("cpu_string"), (theApp.m_tbar_cpu_string + L'$').c_str(), theApp.m_config_path.c_str());
WritePrivateProfileString(_T("task_bar"), _T("memory_string"), (theApp.m_tbar_memory_string + L'$').c_str(), theApp.m_config_path.c_str());
}
void CTaskBarDlg::LoadConfig()
{
theApp.m_tbar_back_color = GetPrivateProfileInt(_T("task_bar"), _T("task_bar_back_color"), 0, theApp.m_config_path.c_str());
theApp.m_tbar_text_color = GetPrivateProfileInt(_T("task_bar"), _T("task_bar_text_color"), 0x00ffffffU, theApp.m_config_path.c_str());
theApp.m_tbar_show_cpu_memory = (GetPrivateProfileInt(_T("task_bar"), _T("tack_bar_show_cpu_memory"), 1, theApp.m_config_path.c_str()) != 0);
theApp.m_tbar_swap_up_down = (GetPrivateProfileInt(_T("task_bar"), _T("task_bar_swap_up_down"), 0, theApp.m_config_path.c_str()) != 0);
GetPrivateProfileString(_T("task_bar"), _T("tack_bar_font_name"), _T("微软雅黑"), theApp.m_tbar_font_name.GetBuffer(32), 32, theApp.m_config_path.c_str());
theApp.m_tbar_font_size = GetPrivateProfileInt(_T("task_bar"), _T("tack_bar_font_size"), 9, theApp.m_config_path.c_str());
wchar_t buff[256];
GetPrivateProfileStringW(L"task_bar", L"up_string", L"↑:", buff, 256, theApp.m_config_path.c_str());
theApp.m_tbar_up_string = buff;
if (!theApp.m_tbar_up_string.empty() && theApp.m_tbar_up_string.back() == L'$') //如果读取的字符串末尾有'$'则把它删除用于解决读取ini文件保存的字符串时无法赢取末尾的空格的问题此时只要在末尾加上'$'即可
theApp.m_tbar_up_string.pop_back();
GetPrivateProfileStringW(L"task_bar", L"down_string", L"↓:", buff, 256, theApp.m_config_path.c_str());
theApp.m_tbar_down_string = buff;
if (!theApp.m_tbar_down_string.empty() && theApp.m_tbar_down_string.back() == L'$')
theApp.m_tbar_down_string.pop_back();
GetPrivateProfileStringW(L"task_bar", L"cpu_string", L"CPU:", buff, 256, theApp.m_config_path.c_str());
theApp.m_tbar_cpu_string = buff;
if (!theApp.m_tbar_cpu_string.empty() && theApp.m_tbar_cpu_string.back() == L'$')
theApp.m_tbar_cpu_string.pop_back();
GetPrivateProfileStringW(L"task_bar", L"memory_string", L"内存:", buff, 256, theApp.m_config_path.c_str());
theApp.m_tbar_memory_string = buff;
if (!theApp.m_tbar_memory_string.empty() && theApp.m_tbar_memory_string.back() == L'$')
theApp.m_tbar_memory_string.pop_back();
}
void CTaskBarDlg::ApplySettings()
{
//如果m_font已经关联了一个字体资源对象则释放它
if (m_font.m_hObject)
{
m_font.DeleteObject();
}
//创建新的字体
m_font.CreatePointFont(theApp.m_tbar_font_size * 10, theApp.m_tbar_font_name);
CalculateWindowWidth();
}
void CTaskBarDlg::CalculateWindowWidth()
{
//计算显示上传下载部分所需要的宽度
CString str1, str2;
int width1, width2;
str1.Format(_T("%s8888.8KB/s"), theApp.m_tbar_up_string.c_str());
str2.Format(_T("%s8888.8KB/s"), theApp.m_tbar_down_string.c_str());
width1= m_pDC->GetTextExtent(str1).cx; //计算使用当前字体显示文本需要的宽度值
width2= m_pDC->GetTextExtent(str2).cx;
m_window_width_s = max(width1, width2);
//计算显示CPU、内存部分所需要的宽度
int width_cpu_memory;
str1.Format(_T("%s100%%"), theApp.m_tbar_cpu_string.c_str());
str2.Format(_T("%s100%%"), theApp.m_tbar_memory_string.c_str());
width1 = m_pDC->GetTextExtent(str1).cx;
width2 = m_pDC->GetTextExtent(str2).cx;
width_cpu_memory = max(width1, width2);
m_window_width = m_window_width_s + width_cpu_memory;
}
void CTaskBarDlg::SetToolTipsTopMost()
{
m_tool_tips.SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
}
BOOL CTaskBarDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
//设置隐藏任务栏图标
ModifyStyleEx(0, WS_EX_TOOLWINDOW);
LoadConfig();
m_pDC = GetDC();
//设置字体
m_font.CreatePointFont(theApp.m_tbar_font_size * 10, theApp.m_tbar_font_name);
m_pDC->SelectObject(&m_font);
this->GetWindowRect(m_rect);
//m_window_width = m_rect.Width();
//m_window_width_s = static_cast<int>(m_rect.Width()*0.566f + 0.5f);
CalculateWindowWidth();
m_window_height = m_rect.Height();
if (!theApp.m_tbar_show_cpu_memory)
m_rect.right = m_rect.left + m_window_width_s;
else
m_rect.right = m_rect.left + m_window_width;
m_hTaskbar = ::FindWindow(L"Shell_TrayWnd", NULL); //寻找类名是Shell_TrayWnd的窗口句柄
m_hBar = ::FindWindowEx(m_hTaskbar, 0, L"ReBarWindow32", NULL); //寻找二级容器的句柄
m_hMin = ::FindWindowEx(m_hBar, 0, L"MSTaskSwWClass", NULL); //寻找最小化窗口的句柄
::GetWindowRect(m_hMin, m_rcMin); //获得最小化窗口的区域
::GetWindowRect(m_hBar, m_rcBar); //获得二级容器的区域
m_taskbar_on_top_or_bottom = IsTaskbarOnTopOrBottom();
if (m_taskbar_on_top_or_bottom) //如果任务栏在桌面顶部或底部
{
m_min_bar_width = m_rcMin.Width() - m_rect.Width(); //保存最小化窗口宽度
//通过用MoveWindow函数来改变小化窗口的宽度
::MoveWindow(m_hMin, 0, 0, m_rcMin.Width() - m_rect.Width(), m_rcMin.Height(), TRUE);
::SetParent(this->m_hWnd, m_hBar); //把程序窗口设置成任务栏的子窗口
//调整程序窗口的大小和位置
//注当把当前窗口设置为任务栏的子窗口后MoveWindow函数移动的位置是基于任务栏的相对位置
//在某些情况下,如被安全软件阻止时,窗口无法嵌入任务栏,窗口会移动到基于屏幕左上角的绝对位置。
::MoveWindow(this->m_hWnd, m_rcMin.Width() - m_rect.Width() + 2, (m_rcBar.Height() - m_rect.Height()) / 2, \
m_rect.Width(), m_rect.Height(), TRUE);
CRect rect;
GetWindowRect(rect); //获取当前窗口的绝对位置
//如果窗口没有被成功嵌入到任务栏,窗口移动到了基于屏幕左上角的绝对位置,则修正窗口的位置
if (rect.left == m_rcMin.Width() - m_rect.Width() + 2 && rect.top == (m_rcBar.Height() - m_rect.Height()) / 2)
{
rect.MoveToXY(rect.left + m_rcBar.left, rect.top + m_rcBar.top);
this->MoveWindow(rect);
m_connot_insert_to_task_bar = true;
MessageBox(_T("警告:窗口没有成功嵌入任务栏,可能已被安全软件阻止!"), NULL, MB_ICONWARNING);
}
}
else //当任务栏在桌面左侧或右侧时
{
int left_pos = (m_rcMin.Width() - m_window_width_s) / 2;
if (left_pos < 0) left_pos = 0;
if (theApp.m_tbar_show_cpu_memory) //将CPU和内存利用率放到网速的下面
{
m_rect.right = m_rect.left + m_window_width_s;
m_rect.bottom = m_rect.top + m_rect.Height() * 2;
}
m_min_bar_height = m_rcMin.Height() - m_rect.Height(); //保存最小化窗口高度
//通过用MoveWindow函数来改变小化窗口的高度
::MoveWindow(m_hMin, 0, 0, m_rcMin.Width(), m_rcMin.Height() - m_rect.Height(), TRUE);
::SetParent(this->m_hWnd, m_hBar); //把程序窗口设置成任务栏的子窗口
//调整程序窗口的大小和位置
//注当把当前窗口设置为任务栏的子窗口后MoveWindow函数移动的位置是基于任务栏的相对位置
//在某些情况下,如被安全软件阻止时,窗口无法嵌入任务栏,窗口会移动到基于屏幕左上角的绝对位置。
::MoveWindow(this->m_hWnd, left_pos, m_rcMin.Height() - m_rect.Height() + 2, \
m_rect.Width(), m_rect.Height(), TRUE);
CRect rect;
GetWindowRect(rect); //获取当前窗口的绝对位置
//如果窗口没有被成功嵌入到任务栏,窗口移动到了基于屏幕左上角的绝对位置,则修正窗口的位置
if (rect.left == left_pos && rect.top == m_rcMin.Height() - m_rect.Height() + 2)
{
rect.MoveToXY(rect.left + m_rcBar.left, rect.top + m_rcBar.top);
this->MoveWindow(rect);
m_connot_insert_to_task_bar = true;
MessageBox(_T("警告:窗口没有成功嵌入任务栏,可能已被安全软件阻止!"), NULL, MB_ICONWARNING);
}
}
m_menu.LoadMenu(IDR_TASK_BAR_MENU);
SetBackgroundColor(theApp.m_tbar_back_color);
m_tool_tips.Create(this, TTS_ALWAYSTIP);
SetToolTipsTopMost(); //设置提示信息总是置顶
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CTaskBarDlg::OnCancel()
{
// TODO: 在此添加专用代码和/或调用基类
SaveConfig();
DestroyWindow();
//程序关闭的时候把最小化窗口的width恢复回去
::MoveWindow(m_hMin, 0, 0, m_rcMin.Width(), m_rcMin.Height(), TRUE);
//CDialogEx::OnCancel();
}
void CTaskBarDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CPoint point1; //定义一个用于确定光标位置的位置
GetCursorPos(&point1); //获取当前光标的位置,以便使得菜单可以跟随光标
m_menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //在指定位置显示弹出菜单
CDialogEx::OnRButtonUp(nFlags, point1);
}
void CTaskBarDlg::OnInitMenu(CMenu* pMenu)
{
CDialogEx::OnInitMenu(pMenu);
// TODO: 在此处添加消息处理程序代码
pMenu->CheckMenuItem(ID_SHOW_CPU_MEMORY2, MF_BYCOMMAND | (theApp.m_tbar_show_cpu_memory ? MF_CHECKED : MF_UNCHECKED));
pMenu->CheckMenuItem(ID_HIDE_MAIN_WND, MF_BYCOMMAND | (theApp.m_hide_main_window ? MF_CHECKED : MF_UNCHECKED));
pMenu->CheckMenuItem(ID_SHOW_NOTIFY_ICON, MF_BYCOMMAND | (theApp.m_show_notify_icon ? MF_CHECKED : MF_UNCHECKED));
pMenu->SetDefaultItem(ID_NETWORK_INFO);
}
BOOL CTaskBarDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
//屏蔽按回车键和ESC键退出
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) return TRUE;
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) return TRUE;
if (m_tool_tips.GetSafeHwnd() && (pMsg->message == WM_LBUTTONDOWN ||
pMsg->message == WM_LBUTTONUP ||
pMsg->message == WM_MOUSEMOVE))
{
m_tool_tips.RelayEvent(pMsg);
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CTaskBarDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_tool_tips.SetMaxTipWidth(600);
CString tip_info;
if (theApp.m_tbar_show_cpu_memory)
{
tip_info.Format(_T("今日已使用流量:%s\r\n内存使用:%s/%s"), CCommon::KBytesToString(static_cast<unsigned int>(theApp.m_today_traffic / 1024)),
CCommon::KBytesToString(theApp.m_used_memory), CCommon::KBytesToString(theApp.m_total_memory));
}
else
{
tip_info.Format(_T("今日已使用流量:%s\r\nCPU使用%d%%\r\n内存使用:%s/%s (%d%%)"), CCommon::KBytesToString(static_cast<unsigned int>(theApp.m_today_traffic / 1024)),
theApp.m_cpu_usage,
CCommon::KBytesToString(theApp.m_used_memory), CCommon::KBytesToString(theApp.m_total_memory),
theApp.m_memory_usage);
}
m_tool_tips.AddTool(this, tip_info);
//m_tool_tips.SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); //设置提示信息总是置顶
CDialogEx::OnMouseMove(nFlags, point);
}
void CTaskBarDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
SendMessage(WM_COMMAND,ID_NETWORK_INFO); //双击后弹出“连接详情”对话框
CDialogEx::OnLButtonDblClk(nFlags, point);
}

@ -0,0 +1,87 @@
#pragma once
#include "Common.h"
#include "afxwin.h"
//#include "StaticEx.h"
// CTaskBarDlg 对话框
class CTaskBarDlg : public CDialogEx
{
DECLARE_DYNAMIC(CTaskBarDlg)
public:
CTaskBarDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CTaskBarDlg();
CToolTipCtrl m_tool_tips;
//窗口中显示的4个项目的前导字符串
//wstring m_up_string; //默认为“↑:”
//wstring m_down_string; //默认为“↓:”
//wstring m_cpu_string; //默认为“CPU:”
//wstring m_memory_string; //默认为“内存:”
void ShowInfo(); //将信息显示到控件上
bool AdjustWindowPos(); //设置窗口在任务栏中的位置
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_TASK_BAR_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
HWND m_hTaskbar; //任务栏窗口句柄
HWND m_hBar; //任务栏窗口二级容器的句柄
HWND m_hMin; //最小化窗口的句柄
CRect m_rcBar; //任务栏窗口的矩形区域
CRect m_rcMin; //最小化窗口的矩形区域
CRect m_rect; //当前窗口的矩形区域
int m_window_width; //窗口宽度
int m_window_width_s; //不显示CPU和内存利用率时的窗口宽度
int m_window_height;
int m_min_bar_width; //最小化窗口缩小宽度后的宽度
int m_min_bar_height; //最小化窗口缩小高度后的高度(用于任务栏在屏幕左侧或右侧时)
bool m_connot_insert_to_task_bar{ false }; //如果窗口无法嵌入任务栏则为true
bool m_taskbar_on_top_or_bottom{ true }; //如果任务栏在屏幕顶部或底部则为ture
CMenu m_menu; //右键菜单
//COLORREF m_back_color{ RGB(0,0,0) }; //背景颜色
//COLORREF m_text_color{ RGB(255,255,255) }; //文字颜色
CFont m_font; //字体
//CString m_font_name; //字体名称
//int m_font_size; //字体大小
//bool m_swap_up_down{ false }; //交换上传和下载显示的位置
CDC* m_pDC{};
bool IsTaskbarOnTopOrBottom(); //判断任务栏是否在屏幕的顶部或底部如果是则返回false如果任务栏在屏幕两侧则返回false
public:
static void SaveConfig(); //保存设置到ini文件
static void LoadConfig(); //从ini文件载入设置
void ApplySettings();
void CalculateWindowWidth(); //计算窗口需要的宽度
void SetToolTipsTopMost(); //设置鼠标提示置顶
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
virtual void OnCancel();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
//afx_msg void OnSetBackgroundColor();
//afx_msg void OnSetTextColor();
afx_msg void OnInitMenu(CMenu* pMenu);
virtual BOOL PreTranslateMessage(MSG* pMsg);
//afx_msg void OnSetFont();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};

@ -0,0 +1,203 @@
// TaskBarSettingsDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "TaskBarSettingsDlg.h"
#include "afxdialogex.h"
// CTaskBarSettingsDlg 对话框
IMPLEMENT_DYNAMIC(CTaskBarSettingsDlg, CDialogEx)
CTaskBarSettingsDlg::CTaskBarSettingsDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_TASKBAR_SETTINGS_DIALOG, pParent)
{
}
CTaskBarSettingsDlg::~CTaskBarSettingsDlg()
{
}
void CTaskBarSettingsDlg::DrawStaticColor()
{
CCommon::FillStaticColor(m_text_color_static, m_text_color);
CCommon::FillStaticColor(m_back_color_static, m_back_color);
}
void CTaskBarSettingsDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_TEXT_COLOR_STATIC1, m_text_color_static);
DDX_Control(pDX, IDC_TEXT_COLOR_STATIC2, m_back_color_static);
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTaskBarSettingsDlg, CDialogEx)
ON_BN_CLICKED(IDC_SET_FONT_BUTTON1, &CTaskBarSettingsDlg::OnBnClickedSetFontButton1)
ON_BN_CLICKED(IDC_SET_COLOR_BUTTON2, &CTaskBarSettingsDlg::OnBnClickedSetColorButton2)
ON_BN_CLICKED(IDC_SET_COLOR_BUTTON3, &CTaskBarSettingsDlg::OnBnClickedSetColorButton3)
ON_EN_CHANGE(IDC_UPLOAD_EDIT1, &CTaskBarSettingsDlg::OnEnChangeUploadEdit1)
ON_EN_CHANGE(IDC_DOWNLOAD_EDIT1, &CTaskBarSettingsDlg::OnEnChangeDownloadEdit1)
ON_EN_CHANGE(IDC_CPU_EDIT1, &CTaskBarSettingsDlg::OnEnChangeCpuEdit1)
ON_EN_CHANGE(IDC_MEMORY_EDIT1, &CTaskBarSettingsDlg::OnEnChangeMemoryEdit1)
ON_BN_CLICKED(IDC_SET_DEFAULT_BUTTON1, &CTaskBarSettingsDlg::OnBnClickedSetDefaultButton1)
ON_BN_CLICKED(IDC_SWITCH_UP_DOWN_CHECK1, &CTaskBarSettingsDlg::OnBnClickedSwitchUpDownCheck1)
END_MESSAGE_MAP()
// CTaskBarSettingsDlg 消息处理程序
BOOL CTaskBarSettingsDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 在此添加额外的初始化
SetBackgroundColor(RGB(255, 255, 255));
//初始化各控件状态
SetDlgItemText(IDC_FONT_NAME_EDIT1, m_font_name);
wchar_t buff[16];
swprintf_s(buff, L"%d", m_font_size);
SetDlgItemText(IDC_FONT_SIZE_EDIT1, buff);
SetDlgItemText(IDC_UPLOAD_EDIT1, m_up_string.c_str());
SetDlgItemText(IDC_DOWNLOAD_EDIT1, m_down_string.c_str());
SetDlgItemText(IDC_CPU_EDIT1, m_cpu_string.c_str());
SetDlgItemText(IDC_MEMORY_EDIT1, m_memory_string.c_str());
((CButton*)GetDlgItem(IDC_SWITCH_UP_DOWN_CHECK1))->SetCheck(m_swap_up_down);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CTaskBarSettingsDlg::OnBnClickedSetFontButton1()
{
// TODO: 在此添加控件通知处理程序代码
CFont font;
font.CreatePointFont(m_font_size * 10, m_font_name);
LOGFONT lf{}; //LOGFONT变量
font.GetLogFont(&lf);
CFontDialog fontDlg(&lf); //构造字体对话框,初始选择字体为之前字体
if (IDOK == fontDlg.DoModal()) // 显示字体对话框
{
//获取字体信息
m_font_name = fontDlg.GetFaceName();
m_font_size = fontDlg.GetSize() / 10;
//将字体信息显示出来
SetDlgItemText(IDC_FONT_NAME_EDIT1, m_font_name);
wchar_t buff[16];
swprintf_s(buff, L"%d", m_font_size);
SetDlgItemText(IDC_FONT_SIZE_EDIT1, buff);
}
}
//设置文本颜色
void CTaskBarSettingsDlg::OnBnClickedSetColorButton2()
{
// TODO: 在此添加控件通知处理程序代码
CColorDialog colorDlg(m_text_color, 0, this);
if (colorDlg.DoModal() == IDOK)
{
m_text_color = colorDlg.GetColor();
if (m_back_color == m_text_color)
MessageBox(_T("警告:文字颜色和背景色相同!"), NULL, MB_ICONWARNING);
DrawStaticColor();
}
}
//设置背景颜色
void CTaskBarSettingsDlg::OnBnClickedSetColorButton3()
{
// TODO: 在此添加控件通知处理程序代码
CColorDialog colorDlg(m_back_color, 0, this);
if (colorDlg.DoModal() == IDOK)
{
m_back_color = colorDlg.GetColor();
if (m_back_color == m_text_color)
MessageBox(_T("警告:背景色和文字颜色相同!"), NULL, MB_ICONWARNING);
DrawStaticColor();
}
}
void CTaskBarSettingsDlg::OnEnChangeUploadEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_UPLOAD_EDIT1, tmp);
m_up_string = tmp;
}
void CTaskBarSettingsDlg::OnEnChangeDownloadEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_DOWNLOAD_EDIT1, tmp);
m_down_string = tmp;
}
void CTaskBarSettingsDlg::OnEnChangeCpuEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_CPU_EDIT1, tmp);
m_cpu_string = tmp;
}
void CTaskBarSettingsDlg::OnEnChangeMemoryEdit1()
{
// TODO: 如果该控件是 RICHEDIT 控件,它将不
// 发送此通知,除非重写 CDialogEx::OnInitDialog()
// 函数并调用 CRichEditCtrl().SetEventMask()
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
// TODO: 在此添加控件通知处理程序代码
CString tmp;
GetDlgItemText(IDC_MEMORY_EDIT1, tmp);
m_memory_string = tmp;
}
void CTaskBarSettingsDlg::OnBnClickedSetDefaultButton1()
{
// TODO: 在此添加控件通知处理程序代码
m_up_string = L"↑:";
m_down_string = L"↓:";
m_cpu_string = L"CPU:";
m_memory_string = L"内存:";
SetDlgItemText(IDC_UPLOAD_EDIT1, m_up_string.c_str());
SetDlgItemText(IDC_DOWNLOAD_EDIT1, m_down_string.c_str());
SetDlgItemText(IDC_CPU_EDIT1, m_cpu_string.c_str());
SetDlgItemText(IDC_MEMORY_EDIT1, m_memory_string.c_str());
}
void CTaskBarSettingsDlg::OnBnClickedSwitchUpDownCheck1()
{
// TODO: 在此添加控件通知处理程序代码
m_swap_up_down = (((CButton*)GetDlgItem(IDC_SWITCH_UP_DOWN_CHECK1))->GetCheck() != 0);
}

@ -0,0 +1,50 @@
#pragma once
// CTaskBarSettingsDlg 对话框
class CTaskBarSettingsDlg : public CDialogEx
{
DECLARE_DYNAMIC(CTaskBarSettingsDlg)
public:
CTaskBarSettingsDlg(CWnd* pParent = NULL); // 标准构造函数
virtual ~CTaskBarSettingsDlg();
//选项设置数据
CString m_font_name;
int m_font_size;
COLORREF m_text_color;
COLORREF m_back_color;
wstring m_up_string; //默认为“上传: ”
wstring m_down_string; //默认为“下载: ”
wstring m_cpu_string; //默认为“CPU: ”
wstring m_memory_string; //默认为“内存: ”
bool m_swap_up_down; //是否交换上传和下载的位置
void DrawStaticColor();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_TASKBAR_SETTINGS_DIALOG };
#endif
protected:
CStatic m_text_color_static;
CStatic m_back_color_static;
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedSetFontButton1();
afx_msg void OnBnClickedSetColorButton2();
afx_msg void OnBnClickedSetColorButton3();
afx_msg void OnEnChangeUploadEdit1();
afx_msg void OnEnChangeDownloadEdit1();
afx_msg void OnEnChangeCpuEdit1();
afx_msg void OnEnChangeMemoryEdit1();
afx_msg void OnBnClickedSetDefaultButton1();
afx_msg void OnBnClickedSwitchUpDownCheck1();
};

@ -0,0 +1,181 @@
// TrafficMonitor.cpp : 定义应用程序的类行为。
//
#include "stdafx.h"
#include "TrafficMonitor.h"
#include "TrafficMonitorDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CTrafficMonitorApp
BEGIN_MESSAGE_MAP(CTrafficMonitorApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CTrafficMonitorApp 构造
CTrafficMonitorApp::CTrafficMonitorApp()
{
// 支持重新启动管理器
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
//void CTrafficMonitorApp::_OnOptions(int tab)
//{
// COptionsDlg optionsDlg(tab);
// //将选项设置数据传递给选项设置对话框
// optionsDlg.m_tab1_dlg.m_font_name = theApp.m_font_name;
// optionsDlg.m_tab1_dlg.m_font_size = theApp.m_font_size;
// optionsDlg.m_tab1_dlg.m_text_color = theApp.m_text_color;
// optionsDlg.m_tab1_dlg.m_up_string = theApp.m_up_string;
// optionsDlg.m_tab1_dlg.m_down_string = theApp.m_down_string;
// optionsDlg.m_tab1_dlg.m_cpu_string = theApp.m_cpu_string;
// optionsDlg.m_tab1_dlg.m_memory_string = theApp.m_memory_string;
// optionsDlg.m_tab1_dlg.m_swap_up_down = theApp.m_swap_up_down;
//
// optionsDlg.m_tab2_dlg.m_font_name = theApp.m_tbar_font_name;
// optionsDlg.m_tab2_dlg.m_font_size = theApp.m_tbar_font_size;
// optionsDlg.m_tab2_dlg.m_text_color = theApp.m_tbar_text_color;
// optionsDlg.m_tab2_dlg.m_back_color = theApp.m_tbar_back_color;
// optionsDlg.m_tab2_dlg.m_up_string = theApp.m_tbar_up_string;
// optionsDlg.m_tab2_dlg.m_down_string = theApp.m_tbar_down_string;
// optionsDlg.m_tab2_dlg.m_cpu_string = theApp.m_tbar_cpu_string;
// optionsDlg.m_tab2_dlg.m_memory_string = theApp.m_tbar_memory_string;
// optionsDlg.m_tab2_dlg.m_swap_up_down = theApp.m_tbar_swap_up_down;
//
// if (optionsDlg.DoModal() == IDOK)
// {
// theApp.m_font_name = optionsDlg.m_tab1_dlg.m_font_name;
// theApp.m_font_size = optionsDlg.m_tab1_dlg.m_font_size;
// theApp.m_text_color = optionsDlg.m_tab1_dlg.m_text_color;
// theApp.m_up_string = optionsDlg.m_tab1_dlg.m_up_string;
// theApp.m_down_string = optionsDlg.m_tab1_dlg.m_down_string;
// theApp.m_cpu_string = optionsDlg.m_tab1_dlg.m_cpu_string;
// theApp.m_memory_string = optionsDlg.m_tab1_dlg.m_memory_string;
// theApp.m_swap_up_down = optionsDlg.m_tab1_dlg.m_swap_up_down;
//
// theApp.m_tbar_font_name = optionsDlg.m_tab2_dlg.m_font_name;
// theApp.m_tbar_font_size = optionsDlg.m_tab2_dlg.m_font_size;
// theApp.m_tbar_text_color = optionsDlg.m_tab2_dlg.m_text_color;
// theApp.m_tbar_back_color = optionsDlg.m_tab2_dlg.m_back_color;
// theApp.m_tbar_up_string = optionsDlg.m_tab2_dlg.m_up_string;
// theApp.m_tbar_down_string = optionsDlg.m_tab2_dlg.m_down_string;
// theApp.m_tbar_cpu_string = optionsDlg.m_tab2_dlg.m_cpu_string;
// theApp.m_tbar_memory_string = optionsDlg.m_tab2_dlg.m_memory_string;
// theApp.m_tbar_swap_up_down = optionsDlg.m_tab2_dlg.m_swap_up_down;
// }
//}
// 唯一的一个 CTrafficMonitorApp 对象
CTrafficMonitorApp theApp;
// CTrafficMonitorApp 初始化
BOOL CTrafficMonitorApp::InitInstance()
{
#ifndef _DEBUG
wstring cmd_line{ m_lpCmdLine };
bool is_restart{ cmd_line.find(L"RestartByRestartManager") != wstring::npos }; //如果命令行参数中含有字符串“RestartByRestartManager”则说明程序是被Windows重新启动的
if (is_restart && CCommon::WhenStart()) //如果在开机时程序被重新启动,则直接退出程序
{
//AfxMessageBox(_T("调试信息程序已被Windows的重启管理器重新启动。"));
return FALSE;
}
//检查是否已有实例正在运行
HANDLE hMutex = ::CreateMutex(NULL, TRUE, _T("FirstName"));
if (hMutex != NULL)
{
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
if (!is_restart)
AfxMessageBox(_T("已经有一个程序正在运行。"));
return FALSE;
}
}
#endif
//设置配置文件的路径
wstring exe_path{ CCommon::GetExePath() };
m_config_path = exe_path + L"config.ini";
m_history_traffic_path = exe_path + L"history_traffic.dat";
m_log_path = exe_path + L"error.log";
m_skin_path = exe_path + L"skins";
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
AfxEnableControlContainer();
// 创建 shell 管理器,以防对话框包含
// 任何 shell 树视图控件或 shell 列表视图控件。
CShellManager *pShellManager = new CShellManager;
// 激活“Windows Native”视觉管理器以便在 MFC 控件中启用主题
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CTrafficMonitorDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
}
// 删除上面创建的 shell 管理器。
if (pShellManager != NULL)
{
delete pShellManager;
}
#ifndef _AFXDLL
ControlBarCleanUp();
#endif
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}

@ -0,0 +1,78 @@
// TrafficMonitor.h : PROJECT_NAME 应用程序的主头文件
//
#pragma once
#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif
#include "resource.h" // 主符号
#include "Common.h"
// CTrafficMonitorApp:
// 有关此类的实现,请参阅 TrafficMonitor.cpp
//
class CTrafficMonitorApp : public CWinApp
{
public:
wstring m_config_path;
wstring m_history_traffic_path;
wstring m_log_path;
wstring m_skin_path;
//以下数据定义为App类中的公共成员以便于在主对话框和任务栏窗口中都能访问
unsigned int m_in_speed{}; //下载速度
unsigned int m_out_speed{}; //上传速度
int m_cpu_usage{}; //CPU利用率
int m_memory_usage{}; //内存利用率
int m_used_memory{}; //可用物理内存单位为KB
int m_total_memory{}; //物理内存总量单位为KB
__int64 m_today_traffic{}; //今天已使用的流量
bool m_hide_main_window; //隐藏主窗口
bool m_show_notify_icon{ true }; //显示通知区域图标
//选项设置数据
//主窗口
COLORREF m_text_color{}; //文字颜色
CString m_font_name; //字体名称
int m_font_size; //字体大小
wstring m_up_string; //默认为“上传: ”
wstring m_down_string; //默认为“下载: ”
wstring m_cpu_string; //默认为“CPU: ”
wstring m_memory_string; //默认为“内存: ”
bool m_swap_up_down{ false }; //交换上传和下载显示的位置
bool m_hide_main_wnd_when_fullscreen; //有程序全屏运行时隐藏悬浮窗
//任务栏窗口
COLORREF m_tbar_back_color{ RGB(0,0,0) }; //背景颜色
COLORREF m_tbar_text_color{ RGB(255,255,255) }; //文字颜色
CString m_tbar_font_name; //字体名称
int m_tbar_font_size; //字体大小
wstring m_tbar_up_string; //默认为“↑:”
wstring m_tbar_down_string; //默认为“↓:”
wstring m_tbar_cpu_string; //默认为“CPU:”
wstring m_tbar_memory_string; //默认为“内存:”
bool m_tbar_swap_up_down{ false }; //交换上传和下载显示的位置
bool m_tbar_show_cpu_memory; //任务栏窗口显示CPU和内存利用率
CTrafficMonitorApp();
//打开“选项”对话框的处理,参数为打开时切换的标签
//void _OnOptions(int tab);
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CTrafficMonitorApp theApp;

@ -0,0 +1,244 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{09483BED-B1E9-4827-8120-A18302C84AA8}</ProjectGuid>
<RootNamespace>TrafficMonitor</RootNamespace>
<WindowsTargetPlatformVersion>10.0.17763.0</WindowsTargetPlatformVersion>
<Keyword>MFCProj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Static</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>Dynamic</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<SDLCheck>true</SDLCheck>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0804</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="Common.h" />
<ClInclude Include="DonateDlg.h" />
<ClInclude Include="HistoryTrafficDlg.h" />
<ClInclude Include="MainWndSettingsDlg.h" />
<ClInclude Include="NetworkInfoDlg.h" />
<ClInclude Include="OptionsDlg.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="SkinDlg.h" />
<ClInclude Include="StaticEx.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="TaskBarDlg.h" />
<ClInclude Include="TaskBarSettingsDlg.h" />
<ClInclude Include="TrafficMonitor.h" />
<ClInclude Include="TrafficMonitorDlg.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="Common.cpp" />
<ClCompile Include="DonateDlg.cpp" />
<ClCompile Include="HistoryTrafficDlg.cpp" />
<ClCompile Include="MainWndSettingsDlg.cpp" />
<ClCompile Include="NetworkInfoDlg.cpp" />
<ClCompile Include="OptionsDlg.cpp" />
<ClCompile Include="SkinDlg.cpp" />
<ClCompile Include="StaticEx.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="TaskBarDlg.cpp" />
<ClCompile Include="TaskBarSettingsDlg.cpp" />
<ClCompile Include="TrafficMonitor.cpp" />
<ClCompile Include="TrafficMonitorDlg.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="TrafficMonitor.rc" />
</ItemGroup>
<ItemGroup>
<None Include="res\TrafficMonitor.rc2" />
</ItemGroup>
<ItemGroup>
<Image Include="res\about_background.bmp" />
<Image Include="res\donate.bmp" />
<Image Include="res\notifyicon.ico" />
<Image Include="res\TrafficMonitor.ico" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="TrafficMonitor.rc" />
</VisualStudio>
</ProjectExtensions>
</Project>

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="源文件">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="头文件">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="资源文件">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="头文件\对话框类">
<UniqueIdentifier>{ab02c896-0397-42e2-b413-ccc7e470ec13}</UniqueIdentifier>
</Filter>
<Filter Include="源文件\对话框类">
<UniqueIdentifier>{296f91e9-59c8-4e1c-9281-b3a5aad240d8}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<Text Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="TrafficMonitor.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="TrafficMonitorDlg.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="Common.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="StaticEx.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="TaskBarDlg.h">
<Filter>头文件</Filter>
</ClInclude>
<ClInclude Include="DonateDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="HistoryTrafficDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="NetworkInfoDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="SkinDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="MainWndSettingsDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="TaskBarSettingsDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
<ClInclude Include="OptionsDlg.h">
<Filter>头文件\对话框类</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="TrafficMonitor.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="TrafficMonitorDlg.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="Common.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="StaticEx.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="TaskBarDlg.cpp">
<Filter>源文件</Filter>
</ClCompile>
<ClCompile Include="DonateDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="HistoryTrafficDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="NetworkInfoDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="SkinDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="OptionsDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="MainWndSettingsDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
<ClCompile Include="TaskBarSettingsDlg.cpp">
<Filter>源文件\对话框类</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="TrafficMonitor.rc">
<Filter>资源文件</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<None Include="res\TrafficMonitor.rc2">
<Filter>资源文件</Filter>
</None>
</ItemGroup>
<ItemGroup>
<Image Include="res\TrafficMonitor.ico">
<Filter>资源文件</Filter>
</Image>
<Image Include="res\about_background.bmp">
<Filter>资源文件</Filter>
</Image>
<Image Include="res\donate.bmp">
<Filter>资源文件</Filter>
</Image>
<Image Include="res\notifyicon.ico">
<Filter>资源文件</Filter>
</Image>
</ItemGroup>
</Project>

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
</Project>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,212 @@
// TrafficMonitorDlg.h : 头文件
//
#pragma once
#pragma comment (lib, "iphlpapi.lib")
#include"NetworkInfoDlg.h"
#include "afxwin.h"
#include "StaticEx.h"
#include "Common.h"
#include "TaskBarDlg.h"
#include "SkinDlg.h"
#include "HistoryTrafficDlg.h"
#include "DonateDlg.h"
#include "OptionsDlg.h"
// CTrafficMonitorDlg 对话框
class CTrafficMonitorDlg : public CDialogEx
{
// 构造
public:
CTrafficMonitorDlg(CWnd* pParent = NULL); // 标准构造函数
~CTrafficMonitorDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_TRAFFICMONITOR_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
CMenu m_menu; //右键菜单对象
CMenu* m_select_connection_menu; //“选择网卡”菜单项
NOTIFYICONDATA m_ntIcon; //通知区域图标
CTaskBarDlg* m_tBarDlg; //任务栏窗口的指针
//嵌套结构体,保存一个网络连接的索引和描述等信息
struct NetWorkConection
{
int index; //网络索引
string description; //网络描述
unsigned int in_bytes; //初始时已接收字节数
unsigned int out_bytes; //初始时已发送字节数
NetWorkConection(int idx, string desc, unsigned int in_bytes, unsigned out_bytes)
: index{ idx }, description{ desc }, in_bytes{ in_bytes }, out_bytes{out_bytes} //构造函数
{}
};
vector<NetWorkConection> m_connections; //保存获取到的要显示到“选择网卡”菜单项中的所有网络连接
MIB_IFTABLE* m_pIfTable;
DWORD m_dwSize{}; //m_pIfTable的大小
int m_connection_selected{ 0 }; //要显示流量的连接的序号
bool m_auto_select{ false }; //自动选择连接
unsigned int m_in_bytes; //当前已接收的字节数
unsigned int m_out_bytes; //当前已发送的字节数
unsigned int m_last_in_bytes{}; //上次已接收的字节数
unsigned int m_last_out_bytes{}; //上次已发送的字节数
string m_connection_name; //当前选择网络的名称
FILETIME m_preidleTime;
FILETIME m_prekernelTime;
FILETIME m_preuserTime;
bool m_always_on_top{ false }; //窗口置顶
int m_transparency{ 100 }; //窗口透明度
bool m_lock_window_pos{ false }; //锁定窗口位置
bool m_show_cpu_memory{ false }; //显示CPU和内存利用率
bool m_mouse_penetrate{ false }; //鼠标穿透
bool m_show_task_bar_wnd{ false }; //显示任务栏窗口
//bool m_swap_up_down{ false }; //交换上传和下载显示的位置
bool m_auto_run; //是否开机自动运行
wstring m_start_up_path; //开始菜单中的“启动”文件夹的路径
bool m_first_start{ true }; //初始时为true在定时器第一次启动后置为flase
int m_position_x; //窗口位置的x坐标
int m_position_y; //窗口位置的y坐标
int m_screen_width; //屏幕宽度
int m_screen_height; //屏幕高度
int m_window_height; //窗口高度
int m_window_height_s; //不显示CPU和内存利用率时的窗口高度
HBITMAP m_back_img; //背景图片
CStaticEx m_disp_up; //显示上传的文本控件
CStaticEx m_disp_down; //显示下载的文本控件
CStaticEx m_disp_cpu; //显示CPU利用率的文本控件
CStaticEx m_disp_memory; //显示内存利用率的文本控件
//COLORREF m_text_color{}; //文字颜色
CFont m_font; //字体
//CString m_font_name; //字体名称
//int m_font_size; //字体大小
int m_restart_cnt{ -1 }; //重新初始化次数
unsigned int m_timer_cnt{}; //定时器触发次数
int m_zero_speed_cnt{}; //如果检测不到网速,该变量就会自加
static unsigned int m_WM_TASKBARCREATED; //任务栏重启消息
vector<wstring> m_skins; //储存皮肤文件的路径
int m_skin_selected{}; //选择的皮肤序号
wstring m_skin_name{}; //选择的皮肤的名称
SYSTEMTIME m_start_time; //程序启动时的时间
deque<HistoryTraffic> m_history_traffics; //储存历史流量
CToolTipCtrl m_tool_tips;
bool m_connection_change_flag{ false }; //如果执行过IniConnection()函数该flag会置为true
bool m_cannot_save_config_warning{ true }; //指示是否会在无法保存设置时弹出提示框
bool m_is_foreground_fullscreen{ false }; //指示前台窗口是否正在全局显示
//窗口中显示的4个项目的前导字符串
//wstring m_up_string; //默认为“上传: ”
//wstring m_down_string; //默认为“下载: ”
//wstring m_cpu_string; //默认为“CPU: ”
//wstring m_memory_string; //默认为“内存: ”
void ShowInfo(); //将上传下载速度信息显示到窗口中
void SetTransparency(); //根据m_transparency的值设置窗口透明度
void SetAlwaysOnTop(); //根据m_always_on_top的值设置窗口置顶
void SetMousePenetrate(); //根据m_mouse_penetrate的值设置是否鼠标穿透
void CheckWindowPos(); //测试窗口的位置,如窗口的位置在屏幕外,则移动窗口使其全部都在屏幕内,并返回新位置
void GetScreenSize(int compensition_value = 23); //获取屏幕的宽度和高度
void LoadConfig(); //载入设置
void SaveConfig(); //保存设置
void AutoSelect(); //自动选择连接
void IniConnection(); //初始化连接
void CloseTaskBarWnd(); //关闭任务栏窗口
void OpenTaskBarWnd(); //打开任务栏窗口
void AddNotifyIcon(); //添加通知区图标
void DeleteNotifyIcon();
void SaveHistoryTraffic();
void LoadHistoryTraffic();
void _OnOptions(int tab); //打开“选项”对话框的处理,参数为打开时切换的标签
public:
void ApplySettings();
protected:
// 生成的消息映射函数
virtual BOOL OnInitDialog();
// afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
// afx_msg LRESULT OnNcHitTest(CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
// afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnNetworkInfo();
afx_msg void OnAlwaysOnTop();
afx_msg void OnUpdateAlwaysOnTop(CCmdUI *pCmdUI);
afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
afx_msg void OnTransparency100();
afx_msg void OnTransparency80();
afx_msg void OnTransparency60();
afx_msg void OnTransparency40();
afx_msg void OnClose();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
afx_msg void OnInitMenu(CMenu* pMenu);
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnLockWindowPos();
afx_msg void OnUpdateLockWindowPos(CCmdUI *pCmdUI);
afx_msg void OnMove(int x, int y);
protected:
afx_msg LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnShowNotifyIcon();
afx_msg void OnUpdateShowNotifyIcon(CCmdUI *pCmdUI);
afx_msg void OnDestroy();
afx_msg void OnShowCpuMemory();
afx_msg void OnUpdateShowCpuMemory(CCmdUI *pCmdUI);
afx_msg void OnMousePenetrate();
afx_msg void OnUpdateMousePenetrate(CCmdUI *pCmdUI);
//afx_msg void OnTextColor();
afx_msg void OnShowTaskBarWnd();
afx_msg void OnUpdateShowTaskBarWnd(CCmdUI *pCmdUI);
afx_msg void OnAppAbout();
afx_msg void OnShowCpuMemory2();
afx_msg void OnAutoRunWhenStart();
afx_msg void OnHideMainWnd();
afx_msg void OnUpdateHideMainWnd(CCmdUI *pCmdUI);
afx_msg void OnChangeSkin();
afx_msg void OnUpdateAutoRunWhenStart(CCmdUI *pCmdUI);
afx_msg LRESULT OnTaskBarCreated(WPARAM wParam, LPARAM lParam);
//afx_msg void OnSetFont();
afx_msg void OnTrafficHistory();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
afx_msg void OnOptions();
afx_msg void OnOptions2();
};

@ -0,0 +1,25 @@
[config]
transparency=80
always_on_top=0
lock_window_pos=0
show_notify_icon=1
show_cpu_memory=1
mouse_penetrate=0
show_task_bar_wnd=1
position_x=1830
position_y=1316
text_color=16384
hide_main_window=0
skin_selected=.\skins\0ĬÈÏƤ·ô
swap_up_down=0
font_name=΢ÈíÑźÚ
font_size=10
[connection]
auto_select=1
connection_name=Marvell AVASTAR Wireless-AC Network Controller-WFP Native MAC Layer LightWeight Filter-0000
[task_bar]
task_bar_back_color=0
task_bar_text_color=16777215
tack_bar_show_cpu_memory=1
tack_bar_font_name=΢ÈíÑźÚ
tack_bar_font_size=9

@ -0,0 +1,181 @@
2017/2/16 18:37:56.822: 可能出现了异常,已重新初始化连接。(已发送字节数2200已接收字节数1824上传速度-3043481下载速度-17311021当前连接(null)已重新初始化0次)
2017/2/16 18:38:3.824: 可能出现了异常,已重新初始化连接。(已发送字节数2200已接收字节数1824上传速度-3046948下载速度-17311690当前连接(null)已重新初始化0次)
2017/2/16 18:40:36.382: 可能出现了异常,已重新初始化连接。(已发送字节数2200已接收字节数1824上传速度-3188902下载速度-17366346当前连接(null)已重新初始化0次)
2017/2/20 22:57:36.253: 可能出现了异常,已重新初始化连接。(已发送字节数3756已接收字节数43上传速度4294099790下载速度4293549490当前连接VMware Virtual Ethernet Adapter for VMnet1已重新初始化1次)
2017/2/20 22:58:35.256: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294058884下载速度4293522289当前连接Microsoft Teredo Tunneling Adapter已重新初始化2次)
2017/2/20 22:58:36.252: 可能出现了异常,已重新初始化连接。(已发送字节数7580已接收字节数3648上传速度4294058884下载速度4293522289当前连接Microsoft Teredo Tunneling Adapter已重新初始化3次)
2017/2/20 22:59:18.252: 可能出现了异常,已重新初始化连接。(已发送字节数2541858已接收字节数0上传速度2532782下载速度4294962888当前连接Bluetooth 设备(个人区域网)已重新初始化1次)
2017/2/20 23:4:51.382: 可能出现了异常,已重新初始化连接。(已发送字节数9214已接收字节数4408上传速度4292203890下载速度4408当前连接Microsoft Teredo Tunneling Adapter已重新初始化1次)
2017/2/20 23:5:3.383: 可能出现了异常,已重新初始化连接。(已发送字节数4132已接收字节数43上传速度4294962214下载速度4294962931当前连接VMware Virtual Ethernet Adapter for VMnet1已重新初始化2次)
2017/2/20 23:5:12.375: 可能出现了异常,已重新初始化连接。(已发送字节数2787898已接收字节数0上传速度2783766下载速度4294967253当前连接Bluetooth 设备(个人区域网)已重新初始化3次)
2017/2/20 23:6:21.381: 可能出现了异常,已重新初始化连接。(已发送字节数4498已接收字节数43上传速度4292085496下载速度43当前连接VMware Virtual Ethernet Adapter for VMnet1已重新初始化4次)
2017/2/20 23:6:26.377: 可能出现了异常,已重新初始化连接。(已发送字节数2886298已接收字节数0上传速度2881800下载速度4294967253当前连接Bluetooth 设备(个人区域网)已重新初始化5次)
2017/2/20 23:6:36.381: 可能出现了异常,已重新初始化连接。(已发送字节数198595已接收字节数987773上传速度4292279593下载速度987773当前连接Marvell AVASTAR Wireless-AC Network Controller已重新初始化6次)
2017/2/20 23:6:47.382: 可能出现了异常,已重新初始化连接。(已发送字节数2886298已接收字节数0上传速度2683046下载速度4293973654当前连接Bluetooth 设备(个人区域网)已重新初始化1次)
2017/2/20 23:12:42.422: 可能出现了异常,已重新初始化连接。(已发送字节数4518已接收字节数45上传速度4294346264下载速度4293725714当前连接VMware Virtual Ethernet Adapter for VMnet1已重新初始化1次)
2017/2/20 23:17:33.49: 可能出现了异常,已重新初始化连接。(已发送字节数3074534已接收字节数0上传速度2134892下载速度4293329376当前连接Bluetooth 设备(个人区域网)已重新初始化1次)
2017/2/20 23:17:48.54: 可能出现了异常,已重新初始化连接。(已发送字节数939642已接收字节数1637920上传速度4292823095下载速度1637920当前连接Marvell AVASTAR Wireless-AC Network Controller已重新初始化1次)
2017/2/20 23:20:58.877: 当前连接已断开,已重新初始化连接。(已重新初始化0次)
2017/2/20 23:20:59.875: 当前连接已断开,已重新初始化连接。(已重新初始化1次)
2017/2/20 23:21:0.881: 当前连接已断开,已重新初始化连接。(已重新初始化2次)
2017/2/20 23:21:1.874: 当前连接已断开,已重新初始化连接。(已重新初始化3次)
2017/2/20 23:21:2.879: 当前连接已断开,已重新初始化连接。(已重新初始化4次)
2017/2/20 23:21:3.874: 当前连接已断开,已重新初始化连接。(已重新初始化5次)
2017/2/20 23:21:4.875: 当前连接已断开,已重新初始化连接。(已重新初始化6次)
2017/2/20 23:21:5.892: 可能出现了异常,已重新初始化连接。(已发送字节数3247889已接收字节数0上传速度2308247下载速度4293329376当前连接Bluetooth 设备(个人区域网)已重新初始化8次)
2017/2/20 23:22:5.882: 当前连接已断开,已重新初始化连接。(已重新初始化8次)
2017/2/20 23:22:6.902: 可能出现了异常,已重新初始化连接。(已发送字节数159277已接收字节数452466上传速度4291810367下载速度452466当前连接Marvell AVASTAR Wireless-AC Network Controller已重新初始化10次)
2017/2/22 19:49:24.337: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化1次)
2017/2/22 19:49:25.322: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化2次)
2017/2/22 19:49:26.347: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化3次)
2017/2/22 19:49:27.322: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化4次)
2017/2/22 19:49:28.331: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化5次)
2017/2/22 19:49:29.323: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化6次)
2017/2/22 19:49:30.326: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化7次)
2017/2/22 19:49:31.324: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化8次)
2017/2/22 19:49:32.327: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化9次)
2017/2/22 19:49:33.321: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化10次)
2017/2/22 19:49:34.322: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4293789522下载速度4291789933当前连接Software Loopback Interface 1已重新初始化11次)
2017/2/22 19:58:51.150: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化1次)
2017/2/22 19:58:52.158: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化2次)
2017/2/22 19:58:53.151: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化3次)
2017/2/22 19:58:54.150: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化4次)
2017/2/22 19:58:55.154: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化5次)
2017/2/22 19:58:56.154: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化6次)
2017/2/22 19:58:57.148: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth Device (RFCOMM Protocol TDI)已重新初始化7次)
2017/2/22 19:58:58.149: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth 设备(个人区域网)已重新初始化8次)
2017/2/22 19:58:59.150: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth 设备(个人区域网)已重新初始化9次)
2017/2/22 19:59:0.155: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth 设备(个人区域网)已重新初始化10次)
2017/2/22 19:59:1.155: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接Bluetooth 设备(个人区域网)已重新初始化11次)
2017/2/22 20:0:46.159: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化1次)
2017/2/22 20:0:47.154: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化2次)
2017/2/22 20:0:48.152: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化3次)
2017/2/22 20:0:49.156: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化4次)
2017/2/22 20:0:50.155: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化5次)
2017/2/22 20:0:51.162: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化6次)
2017/2/22 20:0:52.151: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化7次)
2017/2/22 20:0:53.167: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化8次)
2017/2/22 20:0:54.151: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化9次)
2017/2/22 20:0:55.150: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化10次)
2017/2/22 20:0:56.158: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4291927324下载速度4282481481当前连接WAN Miniport (IP)-QoS Packet Scheduler-0000已重新初始化11次)
2017/2/23 10:35:16.674: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 8:54:55.916: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4287175116下载速度4264872844当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 8:54:56.886: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4287175116下载速度4264872844当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 8:54:57.665: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4287175116下载速度4264872844当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 8:54:59.308: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4287175116下载速度4264872844当前连接WAN Miniport (IPv6)已重新初始化8次)
2017/2/24 8:55:0.851: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4287175116下载速度4264872844当前连接WAN Miniport (IPv6)已重新初始化10次)
2017/2/24 8:56:10.382: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 8:56:11.385: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 8:56:12.403: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化3次)
2017/2/24 8:56:13.416: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 8:56:14.431: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 8:56:15.447: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 8:56:16.464: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化7次)
2017/2/24 8:56:17.471: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化8次)
2017/2/24 8:56:18.490: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化9次)
2017/2/24 8:56:19.496: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化10次)
2017/2/24 8:57:40.489: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 8:57:40.504: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化3次)
2017/2/24 8:57:41.3: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 8:57:42.17: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 8:57:43.31: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 8:57:44.45: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294783399下载速度4294592993当前连接WAN Miniport (IPv6)已重新初始化7次)
2017/2/24 8:58:18.143: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 8:58:20.180: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 8:58:24.523: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化3次)
2017/2/24 8:58:24.539: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 8:58:25.319: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 8:58:26.336: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 8:58:27.350: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化7次)
2017/2/24 8:58:28.364: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化8次)
2017/2/24 9:1:46.830: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 9:1:47.848: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 9:1:48.865: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化3次)
2017/2/24 9:1:49.873: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 9:1:50.887: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 9:1:51.904: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 9:1:52.915: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化7次)
2017/2/24 9:1:53.929: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化8次)
2017/2/24 9:1:54.944: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化9次)
2017/2/24 9:1:55.963: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化10次)
2017/2/24 9:1:56.977: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化11次)
2017/2/24 9:9:59.817: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 9:10:1.128: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化2次)
2017/2/24 9:10:2.406: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化3次)
2017/2/24 9:10:3.627: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化4次)
2017/2/24 9:10:4.918: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 9:10:9.267: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 9:14:33.111: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接WAN Miniport (IPv6)已重新初始化1次)
2017/2/24 9:16:40.93: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度0下载速度0当前连接Intel(R) Ethernet Connection I217-LM-TM NDIS Sample LightWeight Filter-0000已重新初始化3次)
2017/2/24 9:17:3.706: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294828536下载速度4294667153当前连接WAN Miniport (IPv6)已重新初始化5次)
2017/2/24 9:17:11.146: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294828536下载速度4294667153当前连接WAN Miniport (IPv6)已重新初始化6次)
2017/2/24 9:17:28.382: 可能出现了异常,已重新初始化连接。(已发送字节数0已接收字节数0上传速度4294828536下载速度4294667153当前连接Intel(R) Ethernet Connection I217-LM-TM NDIS Sample LightWeight Filter-0000已重新初始化8次)
2017/2/24 9:17:36.778: 可能出现了异常,已重新初始化连接。(已发送字节数8479已接收字节数0上传速度4294828536下载速度4294667153当前连接Intel(R) Ethernet Connection I217-LM-TM NDIS Sample LightWeight Filter-0000已重新初始化9次)
2017/3/1 16:10:37.34: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。
2017/3/1 16:13:4.15: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。
2017/3/1 16:13:12.928: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。
2017/3/1 16:13:57.928: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。
2017/3/1 16:13:58.931: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。
2017/3/1 16:14:19.926: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。
2017/4/23 20:26:13.635: 检测到连接数发生变化已重新获取连接。先前连接数6现在连接数1。(已重新初始化1次)
2017/4/23 20:28:2.97: 检测到连接数发生变化已重新获取连接。先前连接数1现在连接数6。(已重新初始化1次)
2017/4/23 20:28:33.475: 检测到连接数发生变化已重新获取连接。先前连接数6现在连接数1。(已重新初始化2次)
2017/4/23 20:28:44.850: 检测到连接数发生变化已重新获取连接。先前连接数1现在连接数6。(已重新初始化3次)
2017/5/10 20:36:5.182: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化1次)
2017/5/10 20:36:9.182: 检测到连接数发生变化已重新获取连接。先前连接数7现在连接数2。(已重新初始化2次)
2017/5/10 20:36:52.186: 检测到连接数发生变化已重新获取连接。先前连接数2现在连接数7。(已重新初始化3次)
2017/5/19 19:14:7.512: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 19:17:4.412: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数9。(已重新初始化1次)
2017/5/19 19:17:10.327: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 19:17:34.326: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化3次)
2017/5/19 19:17:35.318: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化4次)
2017/5/19 19:17:40.320: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化5次)
2017/5/19 19:17:46.326: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化6次)
2017/5/19 19:17:51.340: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化7次)
2017/5/19 19:31:12.632: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 19:31:20.978: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 19:31:23.630: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化3次)
2017/5/19 19:31:24.637: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数9。(已重新初始化4次)
2017/5/19 19:43:29.346: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化1次)
2017/5/19 19:48:49.208: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化1次)
2017/5/19 19:48:54.218: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 19:48:59.265: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化3次)
2017/5/19 19:49:5.208: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化4次)
2017/5/19 19:55:29.208: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 19:55:30.212: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化2次)
2017/5/19 19:55:35.220: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化3次)
2017/5/19 19:55:47.209: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化4次)
2017/5/19 19:55:52.212: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化5次)
2017/5/19 19:58:26.851: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 19:58:31.844: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 19:58:32.847: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化3次)
2017/5/19 20:2:2.894: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 20:2:3.894: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化2次)
2017/5/19 20:2:9.818: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化3次)
2017/5/19 20:2:9.836: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化4次)
2017/5/19 20:2:10.944: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化5次)
2017/5/19 20:3:40.320: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化1次)
2017/5/19 20:3:41.319: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化2次)
2017/5/19 20:3:45.986: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化3次)
2017/5/19 20:3:46.3: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化4次)
2017/5/19 20:3:47.341: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化5次)
2017/5/19 20:19:6.75: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化1次)
2017/5/19 20:19:10.905: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 20:19:10.921: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化3次)
2017/5/19 20:19:12.188: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化4次)
2017/5/19 20:24:9.238: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化1次)
2017/5/19 20:24:14.234: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 20:25:37.853: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化1次)
2017/5/19 20:25:46.21: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化2次)
2017/5/19 20:26:16.323: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化3次)
2017/5/19 20:26:26.164: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化4次)
2017/5/19 20:26:36.903: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数3。(已重新初始化5次)
2017/5/19 20:26:41.251: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化6次)
2017/5/19 20:26:43.253: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化7次)
2017/5/19 20:26:44.334: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化8次)
2017/5/19 20:26:52.258: 检测到连接数发生变化已重新获取连接。先前连接数9现在连接数4。(已重新初始化9次)
2017/5/19 20:26:53.254: 检测到连接数发生变化已重新获取连接。先前连接数4现在连接数3。(已重新初始化10次)
2017/5/19 20:26:56.253: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化11次)
2017/5/19 20:26:58.734: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化12次)
2017/5/19 20:26:58.740: 可能出现了异常,当前选择的连接和期望的连接不一致,已重新获取连接。(已重新初始化13次)
2017/5/19 20:27:0.261: 检测到连接数发生变化已重新获取连接。先前连接数3现在连接数9。(已重新初始化14次)

@ -0,0 +1,24 @@
2017/05/29 24958
2017/05/29 2000
2017/05/25 16310
2017/05/25 33
2017/05/21 148
2017/05/20 1182
2017/05/19 777
2017/05/19 11
2017/05/18 6196
2017/05/17 8691
2017/05/16 4263
2017/05/15 4097
2017/05/14 8
2017/05/14 43
2017/05/13 107
2017/05/13 56221
2017/05/11 15722
2017/05/10 6596
2017/05/04 456
2017/05/02 123
2017/05/02 11
2017/04/21 66
2017/03/14 32
2017/03/14 22

@ -0,0 +1,20 @@
2017/06/25 0
2017/06/04 10
2017/05/30 263
2017/05/29 58447
2017/05/25 16343
2017/05/21 148
2017/05/20 1182
2017/05/19 788
2017/05/18 6196
2017/05/17 8691
2017/05/16 4263
2017/05/15 4097
2017/05/14 51
2017/05/13 56328
2017/05/11 15722
2017/05/10 6596
2017/05/04 456
2017/05/02 134
2017/04/21 66
2017/03/14 54

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

@ -0,0 +1,8 @@
// stdafx.cpp : 只包括标准包含文件的源文件
// TrafficMonitor.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"

@ -0,0 +1,72 @@
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include "targetver.h"
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的
// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#include <afxdisp.h> // MFC 自动化类
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持
#include <string>
using std::string;
using std::wstring;
#include <vector>
using std::vector;
#include <deque>
using std::deque;
#include<iostream>
#include<fstream>
using std::ifstream;
using std::ofstream;
#include<io.h>
#include<algorithm>
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
#define MY_WM_NOTIFYICON (WM_USER+1001)
//#define CONFIG_PATH _T(".\\config.ini")
//#define CONFIG_PATHA ".\\config.ini"
//#define LOG_PATH _T(".\\error.log")
//#define HISTORY_TRAFFIC_PATH _T(".\\history_traffic.dat")
#define MAX_RESTART_CNT 10 //最大重新初始化次数
#define MAIN_TIMER 1234 //主定时器的ID
#define DELAY_TIMER 1235 //延时定时器ID

@ -0,0 +1,8 @@
#pragma once
// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。
// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h并将
// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。
#include <SDKDDKVer.h>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Loading…
Cancel
Save