選擇新建->項目->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 }
至此程序界面部分設計完成,某些函數在之后還會進行修改,但變動不大