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泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- pyqt5的代码
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...
- JAVA-JSP动作
动作元素基本上是预定义的功能.下表列出了可用的JSP动作 - 编号 动作 描述 1 jsp:include 在请求页面时包含一个文件. 2 jsp:useBean 查找或实例化一个JavaBean. ...
- Codeforces刷题计划
Codeforces刷题计划 已完成:-- / -- [Codeforces370E]370E - Summer Reading:构造:(给定某些数,在空白处填数,要求不下降,并且相邻差值<=1 ...
- Eclipse配置C++环境
由于实在不想用(界面太丑,超级强迫症),前段时间JAVA一直用eclipse,感觉这个IDE非常友好,看上去很舒服,下载的时候发现有C++版本,于是折腾了一会儿,谷歌上发现好多教程,但是大部分比较老, ...
- sql server中的日期函数
DATEADD 在向指定日期加上一段时间的基础上,返回新的 datetime 值. 语法 DATEADD ( datepart , number, date ) 参数 (1) ...
- 为什么使用do{}while(0)来进行宏定义
最近发现很多代码在进行宏定义的时候使用喜欢使用 #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避 ...
- Linux USB驱动学习总结(三)---- USB鼠标的加载、初始化和通信过程
1.usbmouse的定义:usb鼠标既包含usb设备(usb_device)的属性也包含input输入设备(input_dev)的属性 struct usb_mouse { ];///USB鼠标设备 ...
- python+selenium第一步 - 环境搭建
刚开始学习一门技术,肯定是要从环境搭建开始的,我也不例外. 首先选择需要安装的版本,我使用的是mac自带的2.7版本. selenium2,和火狐浏览器 为求稳定不会出现未知问题,我选择了seleni ...