⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drawtreeview.cpp

📁 组播密钥的批次更新算法
💻 CPP
字号:
// DrawTreeView.cpp : CDrawTreeView 类的实现
//

#include "stdafx.h"
#include "DrawTree.h"

#include "DrawTreeDoc.h"
#include "DrawTreeView.h"
#include "DeleteDialog.h"
#include "MainFrm.h"
#include ".\drawtreeview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CDrawTreeView

IMPLEMENT_DYNCREATE(CDrawTreeView, CScrollView)

BEGIN_MESSAGE_MAP(CDrawTreeView, CScrollView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_INSERT, OnInsert)
	ON_COMMAND(ID_DELETE, OnDelete)
	ON_COMMAND(ID_RESPONSE, OnResponse)
	ON_COMMAND(ID_AUTOMATIC, OnAutomatic)
	ON_UPDATE_COMMAND_UI(ID_INSERT, OnUpdateInsert)
	ON_UPDATE_COMMAND_UI(ID_DELETE, OnUpdateDelete)
	ON_UPDATE_COMMAND_UI(ID_RESPONSE, OnUpdateResponse)
	ON_UPDATE_COMMAND_UI(ID_AUTOMATIC, OnUpdateAutomatic)
	ON_WM_TIMER()
	ON_WM_DESTROY()
END_MESSAGE_MAP()

// CDrawTreeView 构造/析构

CDrawTreeView::CDrawTreeView():
m_globalManager(m_tree,m_randomKeyGenerator,m_doubleEncryptor),m_randomPicker(m_tree)
, m_option(0)
{
	// TODO: 在此处添加构造代码
}

CDrawTreeView::~CDrawTreeView()
{
}

BOOL CDrawTreeView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CScrollView::PreCreateWindow(cs);
}

// CDrawTreeView 绘制

void CDrawTreeView::OnDraw(CDC* pDC)
{
	CDrawTreeDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	
	// TODO: 在此处为本机数据添加绘制代码
	
	//绘制树
	m_treePainter.PaintTree(m_tree,pDC);
}

void CDrawTreeView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	// TODO: 计算此视图的合计大小
	CSize viewSize;
	m_treePainter.GetViewSize(m_tree,viewSize);
	SetScrollSizes(MM_TEXT, viewSize);
}


// CDrawTreeView 打印

BOOL CDrawTreeView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CDrawTreeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印前添加额外的初始化
}

void CDrawTreeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 打印后添加清除过程
}


// CDrawTreeView 诊断

#ifdef _DEBUG
void CDrawTreeView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CDrawTreeView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CDrawTreeDoc* CDrawTreeView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawTreeDoc)));
	return (CDrawTreeDoc*)m_pDocument;
}
#endif //_DEBUG


// CDrawTreeView 消息处理程序

void CDrawTreeView::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此处添加消息处理程序代码
	CMenu popupMenu;
	popupMenu.LoadMenu(IDR_POPUP);
	CMenu* pContextMenu=popupMenu.GetSubMenu(0);
	pContextMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,AfxGetMainWnd());
}

void CDrawTreeView::OnInsert()
{
	// TODO: 在此添加命令处理程序代码
	m_globalManager.AddMember();
}

void CDrawTreeView::OnDelete()
{
	// TODO: 在此添加命令处理程序代码
	int nodeID=m_randomPicker.GetRandomLeafID();
	m_globalManager.RemoveMember(nodeID);
}

void CDrawTreeView::OnResponse()
{
	//准备处理本次响应。首先应该重置统计器,为本次统计做好准备
	m_globalManager.ResetStatist();

	//响应加入请求和离开请求
	m_globalManager.Respond();
	
	//更新状态栏
	UpdateStatusBar();

	CSize viewSize;
	CPoint originPos=m_treePainter.GetViewSize(m_tree,viewSize);
	SetScrollSizes(MM_TEXT, viewSize);
	m_treePainter.SetOriginPoint(originPos);
	
	Invalidate();
}

void CDrawTreeView::UpdateStatusBar(void)
{
	CString message;
	CMainFrame *frm=(CMainFrame*)AfxGetMainWnd();
	
	message.Format("总计平均响应时间: %.2f 秒",m_globalManager.GetTotalAverageWaitedTime()/1000);
	frm->m_wndStatusBar.SetPaneText(0,(LPCTSTR)message);
	
	message.Format("本周期内平均响应时间: %.2f 秒",m_globalManager.GetAverageWaitedTime()/1000);
	frm->m_wndStatusBar.SetPaneText(1,(LPCTSTR)message);

	message.Format("平均加密次数: %.2f 次    总共处理请求数: %d个",m_globalManager.GetAverageEncrypedTimes(),m_globalManager.GetTotalRespondCounts());
	frm->m_wndStatusBar.SetPaneText(2,(LPCTSTR)message);
}

void CDrawTreeView::OnAutomatic()
{
	// TODO: 在此添加命令处理程序代码
	m_option=(m_option+1)%2;
	if(m_option==1)
	{
		SetTimer(1,5000,NULL);
	}
	else
	{
		KillTimer(1);

		//此时队列中可能有未被响应的请求,在结束自动模拟时,
		//应先响应队列中的请求,这样手动模拟时,队列就是空的
		OnResponse();
	}
	if(m_option==1)
		AfxGetMainWnd()->SetWindowText("组播密钥管理模拟系统 - 自动模拟状态");
	else
		AfxGetMainWnd()->SetWindowText("组播密钥管理模拟系统 - 手动模拟状态");
}

void CDrawTreeView::OnUpdateInsert(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->Enable(m_option==0);
}

void CDrawTreeView::OnUpdateDelete(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->Enable(m_option==0);
}

void CDrawTreeView::OnUpdateResponse(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->Enable(m_option==0);
}

void CDrawTreeView::OnUpdateAutomatic(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(m_option==1);
}

void CDrawTreeView::OnTimer(UINT nIDEvent)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//响应上个周期内的请求,并绘制树
	OnResponse();

	//随机模拟本周期内得加入请求和离开请求
	int totalAmount=(rand() % 11);
	int T=4000;
	int averageInterval=totalAmount>0 ? (int)(T / totalAmount) : T;
	int dynamicInterval=(int)(averageInterval/4) ;
	int minInterval=averageInterval-dynamicInterval;
	
	DWORD timeNow=GetTickCount();
	for(;totalAmount>0;totalAmount--)
	{
		if((rand()%100) < 50)
			m_globalManager.AddMember(timeNow);
		else
		{
			int nodeID=m_randomPicker.GetRandomLeafID();
			m_globalManager.RemoveMember(nodeID,timeNow);
		}
		timeNow+=(minInterval+(rand() % dynamicInterval));
	}
	CScrollView::OnTimer(nIDEvent);
}

void CDrawTreeView::OnDestroy()
{
	CScrollView::OnDestroy();
	if(m_option==1)
		KillTimer(1);
	// TODO: 在此处添加消息处理程序代码
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -