我们每次在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 = sizeofNOTIFYICONDATA
nc.hIcon = AfxGetApp->LoadIconIDR_MAINFRAME
nc.hWnd = m_hWnd
lstrcpync.szTip,″hello″
nc.uCallbackMessage = WM_NC//自定义的消息
nc.uID = IDC_NC
nc.uFlags = NIF_TIP | NIF_MESSAGE | NIF_ICON
Shell_NotifyIconNIM_ADD,&nc //在托盘区显示IDR_MAINFRAME对应的图标
ShowWindowfalse//隐藏窗口
然后在NetTimerDlg.cpp的文件头部写入
#define WM_NC 1001
#define IDC_NC 1002
以上代码中关键的函数是Shell_NotifyIcon,第一个参数表示你要增加、修改还是删除图标;第二个参数是一个NOTIFYICONDATA结构变量对应的地址,它的主要作用是提供必要的信息,使托盘区图标能够正常工作。需要注意的一点是一定要把原先默认的CButtonOnOk语句从函数里删除否则
程序会在每次按下回车之后就自动退出。
下面代码是双击图标时的响应函数
void CNetTimerDlgOnNcWPARAM wParam,LPARAM lParam
switchlParam
case WM_LBUTTONDBLCLK//如果是双击图标
ShowWindowtrue//显示窗口
break
case WM_MOUSEMOVE//如果鼠标移动到了图标对应的矩形区域
NOTIFYICONDATA nc //以下代码用来显示当前连接时间和上网费用,如果没有连接则显示“未连接”
nc.cbSize = sizeofNOTIFYICONDATA
nc.hIcon = AfxGetApp->LoadIconIDR_MAINFRAME
nc.hWnd = m_hWnd
nc.uCallbackMessage = WM_NC
nc.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON
nc.uID = IDC_NC
ifm_bConnected
lstrcpync.szTip,m_strTime + ″\n″ + m_strFee
else
lstrcpync.szTip,″未连接″
Shell_NotifyIconNIM_MODIFY,&nc
break
别忘了在NetTimerDlg.h里定义函数:
afx_msg void OnNcWPARAM wParam ,LPARAM lParam
同时在NetTimerDlg.cpp的BEGIN_MESSAGE_MAPCNe