[返回]
电脑报2000年第50期
用VC++编写网络计时计费工具(下)
下面在CNetTimerDlg的OnInitDialog函数后部?return TRUE?语句前?加入?
SetTimer?1 1000 NULL?? //设置一个时钟 编号是1 每过1秒钟响应一次。
用ClassWizard为WM_TIMER加一个响应函数 代码如下?
void CNetTimerDlg??OnTimer?UINT nIDEvent?
? m_bConnected = ??Inte.netGetConnectedState?flags NULL?? //判断是否连网的API
if?m_bConnected? //如果连网
OnConnected???//处理连网情况下的函数
else//如果没有连网
OnDisconnected???//处理未连网情况下的函数
CDialog??OnTimer?nIDEvent
以上代码中的InternetGetConnectedState是一个API函数,用来判断当前是否处于连网状态。它的第一个参数是一个指向DWORD类型的指针,用于接收上网方式的信息。第二个参数由系统保留,指定为NULL。
由于我们用到了有关网络的函数 所以在文件头部得添加一句?
#include ″afxinet.h″
接下去分别定义OnConnected和OnDisconnected函数:
void CNetTimerDlg??OnConnected??
? int hour = 0?//定义小时 分 秒
int minute = 0?
int second = 0?
if ?m_iTime < 60? //如果总的时间小于60秒...
? hour = 0?
minute = 0?
second = m_iTime??
if ?m_iTime >= 60 && m_iTime < 3600?//如果大于等于60小于3600
? hour = 0?
minute = m_iTime / 60?
second = m_iTime - minute ? 60??
if ?m_iTime >= 3600? //如果大于等于3600
? hour = m_iTime / 3600?
minute = ?m_iTime - hour ? 3600? / 60?
second = m_iTime - 60 ? minute - 3600 ? hour??
m_iTime ++?//累加
m_strTime.Format?″%d小时 %d分 %d秒″ hour minute second?? //格式化数据
SetDlgItemText?IDC_EDIT_SHOWTIME m_strTime??//显示连网时间
switch??flags? //判断以什么方式上网
? case INTERNET_CONNECTION_MODEM?//拨号上网
SetDlgItemText?IDC_EDIT_METHOD ″拨号上网″??
break?
case INTERNET_CONNECTION_LAN?//通过局域网上网
SetDlgItemText?IDC_EDIT_METHOD ″通过局域网上网″??
break?
case INTERNET_CONNECTION_PROXY? //通过代理服务器
SetDlgItemText?IDC_EDIT_METHOD ″通过代理服务器上网″??
break?
case INTERNET_CONNECTION_MODEM_BUSY?//Modem忙于其他
SetDlgItemText?IDC_EDIT_METHOD ″Modem正忙 但不是上网″??
break??
double value?//以下用于显示上网费用
m_strFee = AfxGetApp?? ->GetProfileString?″Fee section″ ″fee″ NULL??
//得到保存在文件中的相应数据
value = atof?m_strFee??
//调用atof函数将文字信息转化为double类型
value = value ? m_iTime / 3600?
m_strFee.Format?″%lf元″ value??
SetDlgItemText?IDC_EDIT_FEE m_strFee??
//显示费用?
void CNetTimerDlg??OnDisconnected??
? SetDlgItemText?IDC_EDIT_SHOWTIME ″未连接″??//在编辑框中显示“非连接”
m_iTime = 0??
然后分别在NetTimerDlg.h中定义如下?
public?
void OnDisconnected???
void OnConnected???
下一步为ID号为IDD_DIALOG1的对话框建立一个新类CFeeDlg 并且在NetTimerDlg.cpp头部添加?
#include ″FeeDlg.h″
然后为它的“确定”按钮添加响应函数如下?
void CFeeDlg??OnOK??
? CString text?
GetDlgItemText?IDC_EDIT_YUAN text??//获取编辑框IDC_EDIT_YUAN中的输入:
AfxGetApp?? ->WriteProfileString?″Fee section″ ″fee″ text??//写入文件
CDialog??OnOK????
然后回过头来为CNetTimerDlg的“设置”按钮添加响应函数如下?
void CNetTimerDlg??OnButtonSetup??
? CFeeDlg FeeDlg?
FeeDlg.DoModal
最后 别忘了做一些必要的编译设置? 因为我们用到了wininet.lib库 所以要在“工程/设置”菜单下的link选项卡里将“对象/库模块”一项设为Wininet.lib。
OK 最后到网上下载个漂亮的图标替代VC默认的那个图标 编译工程文件 一个属于你自己的网络计时工具就产生了?以后在上网时使用这个工具 只要输入ISP的每小时收费值,在任何时候,只要用鼠标点出系统托盘区的程序主窗口,就能对自己的上网时间和费用一目了然了。
注:文本程序在Windows 98 Visual C++6.0下通过。