用VC++编写 网络计时计费工具(上)

发表于:2007-07-04来源:作者:点击数: 标签:
用VC++编写 网络 计时计费工具(上) [返回] 电脑报2000年第49期 用VC++编写 网络计时计费工具(上) 我们每次在 Windows 中拨号上网之后?拨号程序都会最小化到系统托盘区里面。当我们把鼠标移到它的图标上时,就会显示出接收和发送的数据流量,但我们最
用VC++编写 网络计时计费工具(上)

[返回]
电脑报2000年第49期

用VC++编写 网络计时计费工具(上)

 

  我们每次在Windows中拨号上网之后?拨号程序都会最小化到系统托盘区里面。当我们把鼠标移到它的图标上时,就会显示出接收和发送的数据流量,但我们最关心的往往是我们已经上网有多长时间了以及上网费用。下面笔者将向你介绍如何用VC++编写一个有这些功能的软件,希望能对你有所帮助。

我们的程序界面,当按下确定时,它会最小化到系统托盘区。将鼠标移到它的图标上,如果你已经连到了网上,就会显示连网的时间和费用? 如果你没有连网,那么就显示“未连接”。图中的三个编辑框分别显示连接时间,上网方式?有拨号上网、局域上网等?和即时费用。按下设置键,会弹出一个对话框,要求你输入每小时的费率。

下面我们来一步一步实现这个程序的各项功能。

用AppWizard建立一个基于对话框的MFC应用程序NetTimer。我们先将程序外观和变量定义的工作做完。

在资源编辑区内编辑对话框,最终结果如图1。设置三个静态文本的ID分别为IDC_STATIC_SHOWTIME,IDC_STATIC_METHOD和IDC_STATIC_FEE,三个编辑框的ID分别为IDC_EDIT_SHOWTIME,IDC_EDIT_METHOD和IDC_EDIT_FEE?“确定”按钮的ID是IDOK,“设置”按钮是IDC_BUTTON_SETUP。添加一个新的对话框IDD_DIALOG1,编辑框的ID号是IDC_EDIT_YUAN.

在NetTimerDlg.h的protected区添加如下变量?
CString m_strFee?
CString m_strTime?
int m_iTime?
BOOL m_bConnected?
LPDWORD flags?
在它的构造函数里分别初始化如下?
m_bConnected = FALSE?
m_iTime = 0?
m_strTime = ″″?
flags = new DWORD?
m_strFee = ″″?
首先实现程序最小化时在系统区显示图标的功能。为“确定”按钮对应的OnOk事件响应函数写入如下代码?
NOTIFYICONDATA nc?
nc.cbSize = sizeof?NOTIFYICONDATA??
nc.hIcon = AfxGetApp??->LoadIcon?IDR_MAINFRAME??
nc.hWnd = m_hWnd?
lstrcpy?nc.szTip,″hello″??
nc.uCallbackMessage = WM_NC?//自定义的消息
nc.uID = IDC_NC?
nc.uFlags = NIF_TIP | NIF_MESSAGE | NIF_ICON?
Shell_NotifyIcon?NIM_ADD,&nc?? //在托盘区显示IDR_MAINFRAME对应的图标
ShowWindow?false??//隐藏窗口
然后在NetTimerDlg.cpp的文件头部写入?
#define WM_NC 1001
#define IDC_NC 1002

以上代码中关键的函数是Shell_NotifyIcon,第一个参数表示你要增加、修改还是删除图标;第二个参数是一个NOTIFYICONDATA结构变量对应的地址,它的主要作用是提供必要的信息,使托盘区图标能够正常工作。需要注意的一点是一定要把原先默认的CButton?OnOk?语句从函数里删除?否则程序会在每次按下回车之后就自动退出。
下面代码是双击图标时的响应函数

void CNetTimerDlg??OnNc?WPARAM wParam,LPARAM lParam?
? switch?lParam?
? case WM_LBUTTONDBLCLK?//如果是双击图标
ShowWindow?true??//显示窗口
break?
case WM_MOUSEMOVE?//如果鼠标移动到了图标对应的矩形区域
NOTIFYICONDATA nc? //以下代码用来显示当前连接时间和上网费用,如果没有连接则显示“未连接”
nc.cbSize = sizeof?NOTIFYICONDATA??
nc.hIcon = AfxGetApp??->LoadIcon?IDR_MAINFRAME??
nc.hWnd = m_hWnd?
nc.uCallbackMessage = WM_NC?
nc.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON?
nc.uID = IDC_NC?
if?m_bConnected?
lstrcpy?nc.szTip,m_strTime + ″\n″ + m_strFee??
else
lstrcpy?nc.szTip,″未连接″??
Shell_NotifyIcon?NIM_MODIFY,&nc??
break

别忘了在NetTimerDlg.h里定义函数:

afx_msg void OnNc?WPARAM wParam ,LPARAM lParam

同时在NetTimerDlg.cpp的BEGIN_MESSAGE_MAP?CNetTimerDlg,CDialog?和BEGIN_MESSAGE_MAP?CNetTimerDlg,CDialog?之间插入ON_MESSAGE?WM_NC,OnNc?,用来申明对该消息的响应函数为OnNc。


原文转自:http://www.ltesting.net