MFC+WinPcap编写一个嗅探器之二(界面)

选择新建->项目->MFC应用程序->基于对话框完成,这里文件名为sniffer

打开资源视图中的Dialog列表,打开项目总默认创建的话框,将对话框中的所有控件删除,之后按照最终效果一一从工具栏中添加控件:List Control,用于显示数据包概要信息;Tree Control,用于显示数据包详细信息;Edit Control,用于显示数据包具体内容;此外还需要添加各种Static Text和Edit Control用于显示统计量的信息。为了美观请根据情况添加Group Box,这样可以使界面显得更加有条理

添加完这些控件后,需要对空间的属性进行设置,打开属性面板,首先将所有的Edit Control的Multiline设置为true,表示允许多行,Read Only设置为true,因为主对话框中的Edit Control只用来显示统计的数据无需接受输入。将List Control的View设置为Report,也就是报表风格,Single Select属性设置为true,表示每次只允许选择一行。Tree Control没有什么必须要设置的,可以根据自己喜好来改变风格,比如是否在每项旁边加入+—号等。之后在资源视图面板中右键->添加资源,新建一个Menu资源,在视图中对菜单项直接编辑,比如操作中有开始捕获,停止捕获。选项中有选择适配器,设置过滤规则等。再次进入属性面板,选择当前的主对话框,在属性中的Menu加入刚才新建的Menu,这样就把菜单加入到主对话框中了,属性中对主对话框的是设置还有加入最大最小化按钮等,设置完这一些一个主界面的雏形就有了:

这里有个技巧,在对各种控件安放的过程中往往需要精确的对齐,当选中多个控件时在VS的坐上放有几个对齐方式的按钮可以帮助完成这项工作,此外方向键也可以进行细微调整:

 

在对主对话框布局完后需要对控件添加变量,ctrl+shift+x调出MFC类向导,在CsnifferDlg(即项目默认为主对话框创建的类)中,为控件新建变量。对与List Control和Tree Control添加Control类型变量,为Edit Control添加Value变量,所有空间变量如下图所示:

对于List Control,还要对其增加条目将这一部分放入项目默认创建的CSnifferDlg::OnInitDialog()函数中,添加如下代码:

1     m_list1.SetExtendedStyle(m_list1.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);// 为列表视图控件添加全行选中和栅格风格
2     m_list1.InsertColumn(0,_T("序号"),LVCFMT_CENTER,50);
3     m_list1.InsertColumn(1,_T("时间"),LVCFMT_CENTER,120);
4     m_list1.InsertColumn(2,_T("源MAC地址"),LVCFMT_CENTER,120);
5     m_list1.InsertColumn(3,_T("目的MAC地址"),LVCFMT_CENTER,120);
6     m_list1.InsertColumn(4,_T("长度"),LVCFMT_CENTER,50);
7     m_list1.InsertColumn(5,_T("协议"),LVCFMT_CENTER,70);
8     m_list1.InsertColumn(6,_T("源IP地址"),LVCFMT_CENTER,120);
9     m_list1.InsertColumn(7,_T("目的IP地址"),LVCFMT_CENTER,120);

OnInitDialog()这个函数是放一些用于初始化的内容,以后还会用到,至此程序的主界面设计的差不多了,下面设计选择适配器对话框,在资源视图中新建一个对话框,并在新建的对话框右键->添加类,类名一般是大写的C开头,这里命名为CAdpDlg。然后在对话空中插入如下控件:

 在其对应的OnInitDialog()函数中,添加如下代码:

1     m_list1.SetExtendedStyle(m_list1.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
2     m_list1.InsertColumn(0,_T("设备名"),LVCFMT_LEFT,350);
3     m_list1.InsertColumn(1,_T("设备描述"),LVCFMT_LEFT,250);

 下面设计过滤规则对话框,在资源视图中新建一个对话框,并在新建的对话框右键->添加类,类名一般是大写的C开头,这里命名为CFilterDlg。然后在对话空中插入Check Box控件,并对其添加相应变量:

 

在其对应的OnInitDialog()函数中,为了设置复选框默认情况下全部选中,添加如下代码:

1     m_tcp.SetCheck(1);   
2     m_udp.SetCheck(1);   
3     m_arp.SetCheck(1);   
4     m_rarp.SetCheck(1);   
5     m_icmp.SetCheck(1);
6     m_igmp.SetCheck(1);

 之后要我们想要在点开菜单选项时弹出相应的对话框,首先在主对话框对应的SnifferDlg.cpp前加入两个新建的类的头文件

#include "AdpDlg.h"
#include "FilterDlg.h"

之后要添加触发函数,这里注意首先在类视图中选中主对话框对应的类CSnifferDlg,在点击属性面板,点上面的闪电就会出现菜单命令的触发按钮,点击后就会自动跳到相应的触发函数中去

这里要特别注意要首先在类视图中选中主对话框对应的类CSnifferDlg:1是在类试图中选择类而不是在资源视图中选择对话框2是选择添加了Menu的那个类(即主对话框类)而不是你要打开的对话框的类

当跳到触发函数后添加如下代码便可打开相应的对话框:

1 void CSnifferDlg::OnAdp()
2 {
3     // TODO: 在此添加命令处理程序代码
4     CAdpDlg adpdlg;
5     adpdlg.DoModal();
6 }

至此程序界面部分设计完成,某些函数在之后还会进行修改,但变动不大

下一节  MFC+WinPcap编写一个嗅探器之三(WinPcap)

原文地址:https://www.cnblogs.com/raichen/p/4129303.html