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()函数中,添加如下代码:
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编写一个嗅探器之二(界面)的更多相关文章
- MFC+WinPcap编写一个嗅探器之零(目录)
零零散散写了三天,完成了编写嗅探器的文章,旨在让自己加深印象,是初学者少走一些弯路.因为先前未接触MFC,之后也不打算精通,完全是0基础,所以文章技术含量不高,但难点基本上都都包括了,凑合这看吧,接下 ...
- MFC+WinPcap编写一个嗅探器之一(准备)
知识准备: MFC:http://www.jizhuomi.com/software/257.html WinPcap:http://www.ferrisxu.com/WinPcap/html/ind ...
- MFC+WinPcap编写一个嗅探器之六(分析模块)
这一节是程序的核心,也是最复杂的地方 首先需要明白的一点是,一般对于一个有界面的程序来说,往往需要多线程.本程序中除了界面线程外,抓包需要另外创建一个新的线程.在写抓包函数之前,首先要将前面两个模块的 ...
- MFC+WinPcap编写一个嗅探器之三(WinPcap)
介绍程序模块前,这一节再复习一下WinPcap WinPcap开发一个嗅探器的主要步骤如下: (1)获取嗅探设备 WinPcap提供了pcap_findalldevs_ex() 函数来实现这个功能: ...
- MFC+WinPcap编写一个嗅探器之五(过滤模块)
这一节主要介绍如何获设置捕获过滤,这里的过滤是指在捕获前过滤 设置捕获过滤主要是在CFilterDlg中完成,也就是对应之前创建的设置过滤规则对话框,如图: 首先要根据用户的选择来生成一个合法的过滤规 ...
- MFC+WinPcap编写一个嗅探器之四(获取模块)
这一节主要介绍如何获取设备列表,比较简单 获取设备列表主要是在CAdpDlg中完成,也就是对应之前创建的选择适配器模块,如图: 当打开选择适配器对话框后,在列表视图控件中显示当前主机所有适配器及适配器 ...
- MFC+WinPcap编写一个嗅探器之七(协议)
这一节是本系列教程的结尾了,内容也比较简单,主要是对网络协议进行分析,其实学过计算机网络的同学完全可以略过 在整个项目中需要有一个头文件存放各层协议的头部定义,我把它们放在了head.h中,这个头文件 ...
- 二、Django用Eclipse编写一个登录界面
一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 各软件版本:Python 2.7.14,django 1.6.11 原来已 ...
- 一、Django用Eclipse编写一个登录界面
一.Django用Eclipse编写一个登录界面 二.Django用Eclipse编写一个登录界面Ajax和Django交互 Eclipse安装Python插件和Django的步骤直接省略. 创建de ...
随机推荐
- java基础-Map集合
java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ...
- Spring @Transactional注解不回滚不起作用无效
原文地址:http://www.cnblogs.com/wuxiaofeng/p/6819209.html 这几天在项目里面发现我使用@Transactional之后,抛了异常居然不回滚.后来终于 ...
- codevs 3152 装箱问题3
装箱问题3 http://codevs.cn/problem/3152/ 题目描述 Description 设有n种物品,记作A1.A2.….An,对应于每个Ai(1<=i<=n)都有一个 ...
- MySQL学习(二)——MySQL多表
分页操作:使用limit(参数1,参数2) 起始位置(参数1))*每页显示的条数(参数2) .分类表 create table category( cid ) primary key, cname ) ...
- Tomcat设置编码问题
为了解决编码问题,在tomcat的server.xml文件中添加了useBodyEncodingForURI="true"配置,如下 <Connector port=&quo ...
- 《PHP和MySQL Web开发》读书笔记(上篇)
最近过得太浮躁了,实在自己都看不下去了,看了PHP圣经之后,觉得非常有必要要总结一下. Chapter1.快速入门 ·PHP标记:总共有三种风格,常用的还是XML风格为主 <?php echo ...
- Request爬取网站(seo.chinaz.com)百度权重的查询结果
一:脚本需求 利用Python3查询网站权重并自动存储在本地数据库(Mysql数据库)中,同时导出一份网站权重查询结果的EXCEL表格 数据库类型:MySql 数据库表单名称:website_weig ...
- Python概念-Item系列(林海峰教的)
这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...
- C - A Plug for UNIX (又是建图坑)
题目链接:https://cn.vjudge.net/contest/68128#problem/C 没理解好题意真的麻烦,一上午就这么过去了..... 具体思路:按照 源点 ->插座-> ...
- jQuery Validate自定义金钱验证,是否为金额格式,保留两位小数,并支持千分制货币格式
//自定义函数实现 isMoney: function (value, element){ // return this.optional(element) || /(^[1-9]([0-9]+)?( ...