📄 drawtreeview.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 + -