2025-11-27 16:46:48 +09:00

149 lines
3.4 KiB
C++

// WorkspaceGraphView.cpp : implementation file
//
#include "stdafx.h"
#include "WorkspaceDemo.h"
#include "WorkspaceGraphDoc.h"
#include "WorkspaceGraphView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PI 3.1415926
/////////////////////////////////////////////////////////////////////////////
// CWorkspaceGraphView
IMPLEMENT_DYNCREATE(CWorkspaceGraphView, CFormView)
CWorkspaceGraphView::CWorkspaceGraphView()
:
CFormView(CWorkspaceGraphView::IDD),
m_nPolyRadius(50), // Use some valid initial values (will be changed)
m_nPolyOffsetX(520),
m_nPolyOffsetY(90),
m_nSides(3),
m_color(0)
{
//{{AFX_DATA_INIT(CWorkspaceGraphView)
//}}AFX_DATA_INIT
}
CWorkspaceGraphView::~CWorkspaceGraphView()
{
}
void CWorkspaceGraphView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWorkspaceGraphView)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CWorkspaceGraphView, CFormView)
//{{AFX_MSG_MAP(CWorkspaceGraphView)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CWorkspaceGraphView diagnostics
#ifdef _DEBUG
void CWorkspaceGraphView::AssertValid() const
{
CFormView::AssertValid();
}
void CWorkspaceGraphView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CWorkspaceGraphDoc* CWorkspaceGraphView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWorkspaceGraphDoc)));
return (CWorkspaceGraphDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CWorkspaceGraphView message handlers
void CWorkspaceGraphView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// Calculate figure position relative to the group control
CWnd* pGroupCtrl;
CRect r;
pGroupCtrl = GetDlgItem(IDC_GROUP);
// ... Group control must exist
ASSERT(pGroupCtrl != NULL);
// Calculate the window rect of the group control relative to its parent (this dialog)
pGroupCtrl->GetWindowRect(r);
ScreenToClient(r);
// Position the polygon at the right part of the group control
if (r.Height() < r.Width())
m_nPolyRadius = UINT(r.Height() / 3);
else
m_nPolyRadius = UINT(r.Width() / 3);
m_nPolyOffsetX = r.left + r.Width() / 2;
m_nPolyOffsetY = r.top + r.Height() / 2;
// Fit frame around view
ResizeParentToFit(FALSE);
}
void CWorkspaceGraphView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
UNREFERENCED_PARAMETER(pHint);
UNREFERENCED_PARAMETER(lHint);
UNREFERENCED_PARAMETER(pSender);
m_color = GetDocument()->GetColor();
m_nSides = GetDocument()->GetSides();
Invalidate();
}
void CWorkspaceGraphView::OnPaint()
{
if (IsIconic())
{
CFormView::OnPaint();
}
else
{
// Draw the polygon using the current value of the data members
if (3 <= m_nSides && m_nSides <= 20)
{
CPaintDC dc(this);
// Calculate the corner positions
POINT* pPoint = new POINT[m_nSides];
for (UINT nSide = 0; nSide < m_nSides; nSide++)
{
pPoint[nSide].x = long(cos(2 * PI * nSide / m_nSides) * m_nPolyRadius) + m_nPolyOffsetX;
pPoint[nSide].y = long(sin(2 * PI * nSide / m_nSides) * m_nPolyRadius) + m_nPolyOffsetY;
}
// Use the correct color
CBrush brush(m_color);
CBrush* pOldBrush;
pOldBrush = dc.SelectObject(&brush);
dc.Polygon(pPoint, m_nSides);
dc.SelectObject(pOldBrush);
// Clean up
delete[] pPoint;
}
}
}