www.pudn.com > zhuabao.rar > MainFrm.cpp


// MainFrm.cpp : implementation of the CMainFrame class 
// 
 
#include "stdafx.h" 
#include "PacketReplay.h" 
#include "MainFrm.h" 
 
#include "PacketReplayDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define ID_MYEDIT 97 
#define ID_MYTREE 98 
#define ID_MYLIST 99 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame 
 
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) 
 
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) 
	//{{AFX_MSG_MAP(CMainFrame) 
	ON_WM_CREATE() 
	ON_COMMAND(ID_SHOWLEFT, OnShowleft) 
	ON_COMMAND(ID_SHOWBOTTOM, OnShowbottom) 
	ON_UPDATE_COMMAND_UI(ID_SHOWBOTTOM, OnUpdateShowbottom) 
	ON_UPDATE_COMMAND_UI(ID_SHOWLEFT, OnUpdateShowleft) 
	//}}AFX_MSG_MAP 
	ON_NOTIFY(NM_CLICK,ID_MYLIST,OnListCtrlClick) 
	ON_CBN_SELCHANGE(ID_CHOOSE, OnSelchangeCombo) 
END_MESSAGE_MAP() 
 
static UINT indicators[] = 
{ 
	ID_SEPARATOR,           // status line indicator 
	ID_INDICATOR_CAPS, 
	ID_INDICATOR_NUM, 
	ID_INDICATOR_SCRL, 
}; 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame construction/destruction 
 
CMainFrame::CMainFrame() 
{ 
	// TODO: add member initialization code here 
	 
} 
 
CMainFrame::~CMainFrame() 
{ 
} 
 
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP 
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) 
	{ 
		TRACE0("Failed to create toolbar\n"); 
		return -1;      // fail to create 
	} 
 
	if (!m_wndStatusBar.Create(this) || 
		!m_wndStatusBar.SetIndicators(indicators, 
		  sizeof(indicators)/sizeof(UINT))) 
	{ 
		TRACE0("Failed to create status bar\n"); 
		return -1;      // fail to create 
	} 
 
	// TODO: Delete these three lines if you don't want the toolbar to 
	//  be dockable 
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
	EnableDocking(CBRS_ALIGN_ANY); 
	DockControlBar(&m_wndToolBar); 
//------------------------------------------------------------------------------------ 
//创建左边的控制条 
	if(!m_wndMyBarLeft.Create(_T("层次视图"),this,123)) 
	{ 
		MessageBox("Fail to Create m_wndMyBarLeft!"); 
		return -1; 
	} 
//创建下面的控制条 
	if(!m_wndMyBarBottom.Create(_T("结果显示"),this,CSize(150,150),TRUE,124))// 
	{ 
		MessageBox("Fail to Create m_wndMyBarBottom!"); 
		return -1; 
	} 
	if(!m_wndMyBarRight.Create(_T("数据包监听"),this,CSize(700,700),TRUE,125))// 
	{ 
		MessageBox("Fail to Create m_wndMyBarRight!"); 
		return -1; 
	} 
//停靠控制 
	m_wndMyBarLeft.SetBarStyle(m_wndMyBarLeft.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
	m_wndMyBarBottom.SetBarStyle(m_wndMyBarBottom.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
	m_wndMyBarRight.SetBarStyle(m_wndMyBarRight.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 
 
	m_wndMyBarLeft.EnableDocking(CBRS_ALIGN_ANY); 
	m_wndMyBarBottom.EnableDocking(CBRS_ALIGN_ANY); 
	//m_wndMyBarRight.EnableDocking(CBRS_ALIGN_ANY); 
 
	DockControlBar(&m_wndMyBarLeft,AFX_IDW_DOCKBAR_LEFT); 
	DockControlBar(&m_wndMyBarBottom,AFX_IDW_DOCKBAR_BOTTOM); 
	//DockControlBar(&m_wndMyBarRight,AFX_IDW_DOCKBAR_RIGHT); 
//----------------------------------------------------------------------------------------- 
	CFont* p_ParentFont = new CFont; 
    p_ParentFont->CreateFont(14,0,0,0,FW_MEDIUM,FALSE,FALSE,0,ANSI_CHARSET, 
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH |  
		FF_SWISS,"宋体"); 
 
	m_wndEdit.Create(WS_VSCROLL|WS_CHILD|WS_VISIBLE|ES_AUTOVSCROLL|ES_READONLY| 
		ES_MULTILINE|ES_WANTRETURN,CRect(0,0,0,0),&m_wndMyBarBottom,97);  
	m_wndEdit.ModifyStyleEx(0,WS_EX_CLIENTEDGE);  
	m_wndEdit.SetFont(p_ParentFont,TRUE); 
 
	m_wndTree.Create(WS_CHILD|WS_VISIBLE|TVS_HASLINES|TVS_HASBUTTONS| 
		TVS_LINESATROOT,CRect(0,0,0,0),&m_wndMyBarLeft,98); 
	m_wndTree.ModifyStyleEx(0,WS_EX_CLIENTEDGE); 
 
	m_wndList.Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_ALIGNLEFT|LVS_SINGLESEL| 
		LVS_SHOWSELALWAYS|LVS_EX_FULLROWSELECT,CRect(0,0,0,0),&m_wndMyBarRight,99); 
	m_wndList.InsertColumn(0,"数据",LVCFMT_LEFT,600); 
	//m_wndList.InsertColumn(0,"紧急指针",LVCFMT_LEFT,70); 
	//m_wndList.InsertColumn(0,"窗口",LVCFMT_LEFT,70); 
	//m_wndList.InsertColumn(0,"FIN",LVCFMT_LEFT,35); 
	//m_wndList.InsertColumn(0,"SYN",LVCFMT_LEFT,35); 
	//m_wndList.InsertColumn(0,"RST",LVCFMT_LEFT,35); 
	//m_wndList.InsertColumn(0,"PSH",LVCFMT_LEFT,35); 
	//m_wndList.InsertColumn(0,"ACK",LVCFMT_LEFT,35); 
	//m_wndList.InsertColumn(0,"URG",LVCFMT_LEFT,35); 
	m_wndList.InsertColumn(0,"确认号",LVCFMT_LEFT,70); 
	m_wndList.InsertColumn(0,"序列号",LVCFMT_LEFT,70); 
	m_wndList.InsertColumn(0,"TCP头长",LVCFMT_LEFT,60); 
	//m_wndList.InsertColumn(0,"TTL",LVCFMT_LEFT,50); 
	m_wndList.InsertColumn(0,"IP头长",LVCFMT_LEFT,55); 
	m_wndList.InsertColumn(0,"包长度",LVCFMT_LEFT,55); 
	m_wndList.InsertColumn(0,"标识",LVCFMT_LEFT,50); 
    m_wndList.InsertColumn(0,"端口",LVCFMT_LEFT,50); 
	m_wndList.InsertColumn(0,"目的地址",LVCFMT_LEFT,120); 
	m_wndList.InsertColumn(0,"端口",LVCFMT_LEFT,50); 
	m_wndList.InsertColumn(0,"源地址",LVCFMT_LEFT,120); 
	m_wndList.InsertColumn(0,"协议",LVCFMT_LEFT,50); 
	m_wndList.InsertColumn(0,"序号",LVCFMT_LEFT,45); 
	//扩展风格  LVS_EX_FULLROWSELECT  可选择整行  LVS_EX_GRIDLINES  出现网格 
	m_wndList.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); 
	m_wndList.ModifyStyleEx(0,WS_EX_CLIENTEDGE);//3D look  
 
//-------------------------------------------------------------------------------------- 
	//创建工具栏上的下拉控件 
	//int index = 0; 
    //while(m_wndToolBar.GetItemID(index)!=ID_CHOOSE)index++; 
		 
	RECT rect; 
	m_wndToolBar.SetButtonInfo(12,ID_CHOOSE,TBBS_SEPARATOR,350); 
	m_wndToolBar.GetItemRect(12,&rect); 
	rect.bottom+=150;//设置组合框被下拉时的高度,如果不加上这语句,在win200下运行时组合框会有问题 
	if(!m_wndToolBar.m_wndComboBox.Create(WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST, 
		rect,(CWnd*)&m_wndToolBar,ID_CHOOSE)) 
	{ 
		TRACE0(" Fail to m_wndToolBar.m_wndComboBox.Create()..\n "); 
		return FALSE; 
	} 
	m_wndToolBar.m_wndComboBox.SetItemHeight(-1,17); 
	m_wndToolBar.m_wndComboBox.ShowWindow(SW_SHOW); 
 
//--------------------------------------------------------------------------------- 
	pcap_if_t * alldevs,*d; 
	char errbuf[PCAP_ERRBUF_SIZE]; 
	if(pcap_findalldevs(&alldevs,errbuf)==-1) 
	{ 
		TRACE0("pcap_findalldevs Error!\n"); 
		return false; 
	} 
	m_wndToolBar.m_wndComboBox.AddString("请选择一个网卡:"); 
	for(d=alldevs;d;d=d->next) 
	{ 
		if(d->description) 
		{ 
			m_wndToolBar.m_wndComboBox.AddString(d->description); 
		} 
	} 
	m_wndToolBar.m_wndComboBox.SetCurSel(0); 
//---------------------------------------------------------------------------------	 
	return 0; 
} 
 
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	if( !CFrameWnd::PreCreateWindow(cs) ) 
		return FALSE; 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame diagnostics 
 
#ifdef _DEBUG 
void CMainFrame::AssertValid() const 
{ 
	CFrameWnd::AssertValid(); 
} 
 
void CMainFrame::Dump(CDumpContext& dc) const 
{ 
	CFrameWnd::Dump(dc); 
} 
 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMainFrame message handlers 
 
CEdit* CMainFrame::GetEdit() 
{ 
	return &m_wndEdit; 
} 
 
CTreeCtrl* CMainFrame::GetTree() 
{ 
	return &m_wndTree; 
} 
 
CListCtrl* CMainFrame::GetList() 
{ 
	return &m_wndList; 
} 
 
CComboBox* CMainFrame::GetComboBox() 
{ 
	CComboBox* p=&(m_wndToolBar.m_wndComboBox); 
	return p; 
} 
 
void CMainFrame::AddToComboBox(CString str) 
{ 
	m_wndToolBar.m_wndComboBox.AddString(str); 
} 
 
void CMainFrame::OnShowleft()  
{ 
	// TODO: Add your command handler code here 
	ShowControlBar(&m_wndMyBarLeft,!m_wndMyBarLeft.IsVisible(),FALSE); 
} 
 
void CMainFrame::OnShowbottom()  
{ 
	// TODO: Add your command handler code here 
	ShowControlBar(&m_wndMyBarBottom,!m_wndMyBarBottom.IsVisible(),FALSE); 
} 
 
void CMainFrame::OnUpdateShowbottom(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_wndMyBarBottom.IsVisible()); 
} 
 
void CMainFrame::OnUpdateShowleft(CCmdUI* pCmdUI)  
{ 
	// TODO: Add your command update UI handler code here 
	pCmdUI->SetCheck(m_wndMyBarLeft.IsVisible()); 
} 
//----------------------------------------------------------------------------------- 
 
//列表框被单击时的响应函数 
//被单击->计算被选中的元素->通知文档类更新树->文档类通知视图类执行真的更新操作 
void CMainFrame::OnListCtrlClick(NMHDR* pNMHDR, LRESULT* pResult) 
{ 
	//MessageBox("CMainFrame::OnListCtrlClick"); 
	POSITION pos; 
	pos=m_wndList.GetFirstSelectedItemPosition(); 
	int index=m_wndList.GetNextSelectedItem(pos); //被选中的行数,从0开始算起 -1表示没有选中 
	if(index==-1) //-1表示没有选中 
		return; 
	ShowControlBar(&m_wndMyBarLeft,TRUE,FALSE); //使数型控件显示 
	ShowControlBar(&m_wndMyBarBottom,TRUE,FALSE); //使编辑控件显示 
 
	//获得文档指针 
	CPacketReplayDoc* pdoc=(CPacketReplayDoc*)this->GetActiveDocument(); 
	pdoc->UpdateTree(index); //更新树形控件 
	pdoc->UpdateEdit(index); //更新编辑控件 
	 
} 
 
//组合框选项改变时的响应函数 
void CMainFrame::OnSelchangeCombo() 
{ 
	CString str,str1; 
	m_wndToolBar.m_wndComboBox.GetWindowText(str1); 
	str.Format("捕获数据的网络设备:%s",str1); 
	if(m_wndToolBar.m_wndComboBox.GetCurSel()!=0) 
	{ 
		m_wndEdit.SetWindowText(str); 
	} 
	else 
	{ 
		m_wndEdit.SetWindowText("还没有选择网络设备!"); 
	} 
}