选择新建->项目->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()函数中,添加如下代码:

     m_list1.SetExtendedStyle(m_list1.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);// 为列表视图控件添加全行选中和栅格风格
m_list1.InsertColumn(,_T("序号"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("时间"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("源MAC地址"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("目的MAC地址"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("长度"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("协议"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("源IP地址"),LVCFMT_CENTER,);
m_list1.InsertColumn(,_T("目的IP地址"),LVCFMT_CENTER,);

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

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

     m_list1.SetExtendedStyle(m_list1.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_list1.InsertColumn(,_T("设备名"),LVCFMT_LEFT,);
m_list1.InsertColumn(,_T("设备描述"),LVCFMT_LEFT,);

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

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

     m_tcp.SetCheck();
m_udp.SetCheck();
m_arp.SetCheck();
m_rarp.SetCheck();
m_icmp.SetCheck();
m_igmp.SetCheck();

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

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

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

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

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

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

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

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

MFC+WinPcap编写一个嗅探器之二(界面)的更多相关文章

  1. MFC+WinPcap编写一个嗅探器之零(目录)

    零零散散写了三天,完成了编写嗅探器的文章,旨在让自己加深印象,是初学者少走一些弯路.因为先前未接触MFC,之后也不打算精通,完全是0基础,所以文章技术含量不高,但难点基本上都都包括了,凑合这看吧,接下 ...

  2. MFC+WinPcap编写一个嗅探器之一(准备)

    知识准备: MFC:http://www.jizhuomi.com/software/257.html WinPcap:http://www.ferrisxu.com/WinPcap/html/ind ...

  3. MFC+WinPcap编写一个嗅探器之六(分析模块)

    这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...

  4. MFC+WinPcap编写一个嗅探器之三(WinPcap)

    介绍程序模块前,这一节再复习一下WinPcap WinPcap开发一个嗅探器的主要步骤如下: (1)获取嗅探设备 WinPcap提供了pcap_findalldevs_ex() 函数来实现这个功能: ...

  5. MFC+WinPcap编写一个嗅探器之五(过滤模块)

    这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...

  6. MFC+WinPcap编写一个嗅探器之四(获取模块)

    这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...

  7. MFC+WinPcap编写一个嗅探器之七(协议)

    这一节是本系列教程的结尾了,内容也比较简单,主要是对网络协议进行分析,其实学过计算机网络的同学完全可以略过 在整个项目中需要有一个头文件存放各层协议的头部定义,我把它们放在了head.h中,这个头文件 ...

  8. 二、Django用Eclipse编写一个登录界面

    一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...

  9. 一、Django用Eclipse编写一个登录界面

    一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 Eclipse安装Python插件和Django的步骤直接省略. 创建de ...

随机推荐

  1. Java HashMap源码分析

    貌似HashMap跟ConcurrentHashMap是面试经常考的东西,抽空来简单分析下它的源码 构造函数 /** * Constructs an empty <tt>HashMap&l ...

  2. Spring Boot 使用IntelliJ IDEA创建一个web开发实例(五)

    使用application.ym进行多环境配置 1.配置激活选项 spring: profiles: active: dev 2.在配置文件添加若干个英文状态下的短横线即可区分 spring: pro ...

  3. GTD实践2周年后一些体会

    从2011年7月1日算起,实践GTD已经有2年多了,在GTD一周年时写了<用iPhone打造GTD实践1周年的心得体会>这篇文章,随着实践的深入,如今又有了一些新的认识,2013年初制定的 ...

  4. javamail模拟邮箱功能--邮件回复-中级实战篇【邮件回复方法】(javamail API电子邮件实例)

    引言: JavaMai下载地址l jar包:http://java.sun.com/products/javamail/downloads/index.html 此篇是紧随上篇文章而封装出来的,阅读本 ...

  5. 谁说码农不懂浪漫?js写的'老婆生日快乐'特效

    一直被老婆抱怨不懂浪漫,老婆的生日又来了,老婆指着闺蜜空间上贴的老公做的胡萝卜心形浪漫晚餐告诉我:必须送她一份用心的礼物.我绞尽脑汁想出这么一法子,还是得用我们码农的独特方式,经过一天多的努力,终于做 ...

  6. SQL Server 数据库备份失败解决方法

    问题:System.Data.SqlClient.SqlError: 无法使用备份文件 'D:\20160512.bak',因为原先格式化该文件时所用扇区大小为 512,而目前所在设备的扇区大小为 4 ...

  7. datagrid时间插件

    jquery easyui日期控件中,在页面里用JS拿到设立的日期值的方法 链接:http://blog.csdn.net/liweibin_/article/details/13509917 jqu ...

  8. python调用百度语音识别接口实时识别

    1.本文直接上干货 奉献代码:https://github.com/wuzaipei/audio_discern/tree/master/%E8%AF%AD%E9%9F%B3%E8%AF%86%E5% ...

  9. python 操作 Redis

    目录 Redis 模块基本介绍 参考 redis redis-py 的 API 连接 redis 普通连接 连接池 redis 字符串操作 单次设置key-value 批量设置key-value re ...

  10. yii验证系统学习记录,基于yiicms(二)

    /** * Validates the specified object. * @param \yii\base\Model $model the data model being validated ...