📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "ConvexHull.h"
#include "ConvexHullDoc.h"
#include "ConvexHullView.h"
#include "DlgAddRandomPoints.h"
#include "DlgInputPoints.h"
#include "MainFrm.h"
#include <sstream>
#include <fstream>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_UPDATE_COMMAND_UI(ID_ZOOM_ADJUST, OnUpdateZoomAdjust)
ON_COMMAND(ID_ZOOM_ADJUST, OnZoomAdjust)
ON_COMMAND(ID_DEMO_RUN, OnDemoRun)
ON_UPDATE_COMMAND_UI(ID_DEMO_RUN, OnUpdateDemoRun)
ON_COMMAND(ID_ZOOM_IN, OnZoomIn)
ON_UPDATE_COMMAND_UI(ID_ZOOM_IN, OnUpdateZoomIn)
ON_COMMAND(ID_ZOOM_OUT, OnZoomOut)
ON_UPDATE_COMMAND_UI(ID_ZOOM_OUT, OnUpdateZoomOut)
ON_COMMAND(ID_PUT_POINT, OnPutPoint)
ON_UPDATE_COMMAND_UI(ID_PUT_POINT, OnUpdatePutPoint)
ON_COMMAND(ID_GET_CONVEX_HULL, OnGetConvexHull)
ON_UPDATE_COMMAND_UI(ID_GET_CONVEX_HULL, OnUpdateGetConvexHull)
ON_COMMAND(ID_DEMO_PAUSE, OnDemoPause)
ON_UPDATE_COMMAND_UI(ID_DEMO_PAUSE, OnUpdateDemoPause)
ON_UPDATE_COMMAND_UI(ID_DELETE_POINT, OnUpdateDeletePoint)
ON_COMMAND(ID_DELETE_POINT, OnDeletePoint)
ON_COMMAND(ID_ADD_RANDOM_POINTS, OnAddRandomPoints)
ON_UPDATE_COMMAND_UI(ID_ADD_RANDOM_POINTS, OnUpdateAddRandomPoints)
ON_COMMAND(ID_ERASE_POINTS, OnErasePoints)
ON_UPDATE_COMMAND_UI(ID_ERASE_POINTS, OnUpdateErasePoints)
ON_COMMAND(ID_INPUT_POINTS, OnInputPoints)
ON_UPDATE_COMMAND_UI(ID_INPUT_POINTS, OnUpdateInputPoints)
ON_UPDATE_COMMAND_UI(ID_ERASE_ALL_POINTS, OnUpdateEraseAllPoints)
ON_COMMAND(ID_ERASE_ALL_POINTS, OnEraseAllPoints)
ON_UPDATE_COMMAND_UI(ID_FILE_EXPORT, OnUpdateFileExport)
ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
//##ModelId=443378C70265
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
//##ModelId=443378C70273
CMainFrame::~CMainFrame()
{
}
//##ModelId=443378C702A5
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);
return 0;
}
//##ModelId=443378C70270
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
cs.style &= ~WS_SIZEBOX;
cs.style &= ~WS_MAXIMIZEBOX;
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
//##ModelId=443378C70278
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
//##ModelId=443378C7027A
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
//##ModelId=443378C702AA
void CMainFrame::OnUpdateZoomAdjust(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(TRUE);
//pCmdUI->SetCheck(1);
}
//##ModelId=443378C702AD
void CMainFrame::OnZoomAdjust()
{
// TODO: Add your command handler code here
GetActiveConvexHullView()->ZoomAdjust();
}
//##ModelId=443378C702B5
void CMainFrame::OnDemoRun()
{
// TODO: Add your command handler code here
if(GetActiveConvexHullView()->IsClientStatus_None())
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_DEMO);
}
else
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
}
}
//##ModelId=443378C702B7
void CMainFrame::OnUpdateDemoRun(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
|| GetActiveConvexHullView()->IsClientStatus_Demo());
if(GetActiveConvexHullView()->IsClientStatus_Demo())
pCmdUI->SetCheck(1);
else
pCmdUI->SetCheck(0);
}
//##ModelId=443378C702BF
void CMainFrame::OnZoomIn()
{
// TODO: Add your command handler code here
GetActiveConvexHullView()->ZoomIn(1.5);
}
//##ModelId=443378C702C1
void CMainFrame::OnUpdateZoomIn(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(TRUE);
}
//##ModelId=443378C702C9
void CMainFrame::OnZoomOut()
{
// TODO: Add your command handler code here
GetActiveConvexHullView()->ZoomOut(1.5);
}
//##ModelId=443378C702CB
void CMainFrame::OnUpdateZoomOut(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(TRUE);
}
//##ModelId=443378C702D3
void CMainFrame::OnPutPoint()
{
// TODO: Add your command handler code here
if(GetActiveConvexHullView()->IsClientStatus_None())
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_PUT_POINT);
}
else
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
}
}
//##ModelId=443378C702D5
void CMainFrame::OnUpdatePutPoint(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
|| GetActiveConvexHullView()->IsClientStatus_PutPoint());
if(GetActiveConvexHullView()->IsClientStatus_PutPoint())
pCmdUI->SetCheck(1);
else
pCmdUI->SetCheck(0);
}
//##ModelId=443378C702DD
void CMainFrame::OnGetConvexHull()
{
// TODO: Add your command handler code here
if(GetActiveConvexHullView()->GetDocument()->GetConvexHull().get_points_count() >= 200000)
{
if(AfxMessageBox("您要处理的点太多,有可能超出本程序的处理能力。本程序对这种情况下发生的意外情况将不负责。确认要继续吗?", MB_ICONQUESTION + MB_YESNO) != IDYES)
return;
}
CWaitCursor c;
GetActiveConvexHullView()->GetDocument()->GetConvexHull().solve();
GetActiveConvexHullView()->Invalidate(FALSE);
}
//##ModelId=443378C702DF
void CMainFrame::OnUpdateGetConvexHull(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}
//##ModelId=443378C702E7
void CMainFrame::OnDemoPause()
{
// TODO: Add your command handler code here
GetActiveConvexHullView()->PauseDemo(!GetActiveConvexHullView()->IsDemoPaused());
}
//##ModelId=443378C702E9
void CMainFrame::OnUpdateDemoPause(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_Demo());
if(GetActiveConvexHullView()->IsDemoPaused())
pCmdUI->SetCheck(1);
else
pCmdUI->SetCheck(0);
}
//##ModelId=443378C702F0
void CMainFrame::OnUpdateDeletePoint(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
|| GetActiveConvexHullView()->IsClientStatus_DeletePoint());
if(GetActiveConvexHullView()->IsClientStatus_DeletePoint())
pCmdUI->SetCheck(1);
else
pCmdUI->SetCheck(0);
}
//##ModelId=443378C702F3
void CMainFrame::OnDeletePoint()
{
// TODO: Add your command handler code here
if(GetActiveConvexHullView()->IsClientStatus_None())
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_DELETE_POINT);
}
else
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
}
}
//##ModelId=443378C702FA
void CMainFrame::OnAddRandomPoints()
{
// TODO: Add your command handler code here
CDlgAddRandomPoints dlg;
if(dlg.DoModal() == IDOK)
{
GetActiveConvexHullView()->AddRandomPoints(dlg.m_PointCount);
}
}
//##ModelId=443378C702FC
void CMainFrame::OnUpdateAddRandomPoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}
//##ModelId=443378C70304
void CMainFrame::OnErasePoints()
{
// TODO: Add your command handler code here
if(GetActiveConvexHullView()->IsClientStatus_None())
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_ERASE_POINTS);
}
else
{
GetActiveConvexHullView()->SetClientStatus(CConvexHullView::ClientStatus::CLIENT_STATUS_NONE);
}
}
//##ModelId=443378C70306
void CMainFrame::OnUpdateErasePoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None()
|| GetActiveConvexHullView()->IsClientStatus_ErasePoints());
if(GetActiveConvexHullView()->IsClientStatus_ErasePoints())
pCmdUI->SetCheck(1);
else
pCmdUI->SetCheck(0);
}
//##ModelId=443378C7030E
void CMainFrame::OnInputPoints()
{
// TODO: Add your command handler code here
CDlgInputPoints dlg;
if(dlg.DoModal() == IDOK)
{
//GetActiveConvexHullView()->AddRandomPoints(dlg.m_PointCount);
std::istringstream iss((LPCTSTR)dlg.m_strPoints);
((CConvexHullDoc *) GetActiveDocument())->AddPointsByTextStream(iss);
GetActiveConvexHullView()->ZoomAdjust();
}
}
//##ModelId=443378C70310
void CMainFrame::OnUpdateInputPoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}
//##ModelId=443378C70313
void CMainFrame::OnUpdateEraseAllPoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(GetActiveConvexHullView()->IsClientStatus_None());
}
//##ModelId=443378C7031A
void CMainFrame::OnEraseAllPoints()
{
// TODO: Add your command handler code here
if(AfxMessageBox("您真的要清除所有的点吗?", MB_YESNO | MB_ICONQUESTION) == IDYES)
{
((CConvexHullDoc *) GetActiveDocument())->GetConvexHull().clear();
((CConvexHullDoc *) GetActiveDocument())->SetModifiedFlag(TRUE);
GetActiveConvexHullView()->Invalidate(FALSE);
}
}
//##ModelId=443378C7031C
void CMainFrame::OnUpdateFileExport(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(((CConvexHullDoc *) GetActiveDocument())->GetConvexHull().finished());
}
//##ModelId=443378C70323
void CMainFrame::OnFileExport()
{
// TODO: Add your command handler code here
CFileDialog dlg(FALSE);
if(dlg.DoModal() == IDOK)
{
std::ofstream ofs((LPCTSTR)dlg.GetFileName());
dse::convex_hull &ch = ((CConvexHullDoc *) GetActiveDocument())->GetConvexHull();
for(dse::size_t i = 0; i < ch.get_convex_points_count(); i++ )
{
ofs << ch.get_convex_point(i).x << " " << ch.get_convex_point(i).y << std::endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -