• 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)

  • 相关阅读:
    pdf在线转换器
    抖音修复老照片动起来笑起来的程序app的下载地址
    FFmpeg.AutoGen Unable to load DLL 'avutil.56' 解决方法
    Array.prototype.fill 填充值被复用的问题
    Recoil Input 光标位置被重置到末尾的问题
    TypeScript 扩展全局 Window 时报错的解决
    Recoil 中默认值的正确处理
    Recoil 中多级数据联动及数据重置的合理做法
    Recoil 默认值及数据级联的使用
    Recoil 的使用
  • 原文地址:https://www.cnblogs.com/raichen/p/4129303.html
Copyright © 2020-2023  润新知