📄 drawcircleview.cpp
字号:
// DrawCircleView.cpp : implementation of the CDrawCircleView class
//
#include "stdafx.h"
#include "DrawCircle.h"
#include "DrawCircleDoc.h"
#include "DrawCircleView.h"
#include "DrawParamDlg.h"
#include "DrawMethodDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView
IMPLEMENT_DYNCREATE(CDrawCircleView, CView)
BEGIN_MESSAGE_MAP(CDrawCircleView, CView)
//{{AFX_MSG_MAP(CDrawCircleView)
ON_WM_SIZE()
ON_COMMAND(ID_SETUP_DRAWPARAM, OnSetupDrawparam)
ON_COMMAND(ID_SETUP_DRAWMETHOD, OnSetupDrawmethod)
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_DO_DRAW_CIRCLE, OnDoDrawCircle)
ON_UPDATE_COMMAND_UI(ID_DO_DRAW_CIRCLE, OnUpdateDoDrawCircle)
ON_WM_SETCURSOR()
ON_WM_LBUTTONDOWN()
ON_WM_DESTROY()
ON_UPDATE_COMMAND_UI(ID_SETUP_DRAWPARAM, OnUpdateSetupDrawparam)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView construction/destruction
extern WORD p1,p2,p3,p4;
extern DWORD lp1,lp2;
extern WORD handle[16];
extern BYTE buffer[1024];
CDrawCircleView::CDrawCircleView()
{
m_lpCircleBuf = NULL;
m_nPointCount = 0;
m_iPosX = 0;
m_iPosY = 0;
m_iRadius = 30;
m_bDoDrawCircle = FALSE;
m_hCross = LoadCursor(NULL,(LPCTSTR)IDC_CROSS);
m_iDrawMethod = GetPrivateProfileInt("Encrypt","RunAs",2,".\\config.ini");
}
CDrawCircleView::~CDrawCircleView()
{
if(m_lpCircleBuf)
delete[] m_lpCircleBuf;
}
BOOL CDrawCircleView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
if(m_iDrawMethod==2)
{
WORD retcode;
retcode = Rockey(RY_FIND,&handle[0],&lp1,&lp2,&p1,&p2,&p3,&p4,buffer);
if(retcode)
{
return FALSE;
}
retcode = Rockey(RY_OPEN,&handle[0],&lp1,&lp2,&p1,&p2,&p3,&p4,buffer);
if(retcode)
{
return FALSE;
}
}
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView drawing
void CDrawCircleView::OnDraw(CDC* pDC)
{
CDrawCircleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
DrawAxis(pDC); //画坐标轴
DrawCircleBuf(pDC); //画缓冲区中圆的每个点
SetPixelRel(pDC,m_iPosX,m_iPosY,RGB(255,0,0)); //以红色标记圆心位置
}
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView printing
BOOL CDrawCircleView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDrawCircleView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDrawCircleView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView diagnostics
#ifdef _DEBUG
void CDrawCircleView::AssertValid() const
{
CView::AssertValid();
}
void CDrawCircleView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDrawCircleDoc* CDrawCircleView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawCircleDoc)));
return (CDrawCircleDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDrawCircleView message handlers
void CDrawCircleView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rc;
GetClientRect(rc);
m_iOrgX = rc.Width()/2;
m_iOrgY = rc.Height()/2;
}
void CDrawCircleView::DrawAxis(CDC* pDC)
{
CRect rc;
GetClientRect(rc);
CPen pen(PS_SOLID,1,RGB(0,0,255));
CPen* pOldPen = pDC->SelectObject(&pen);
COLORREF clOldText = pDC->SetTextColor(RGB(0,0,255));
int iOldMode = pDC->SetBkMode(TRANSPARENT);
int iMaxX = rc.Width();
int iMaxY = rc.Height();
int iCenterX = rc.Width()/2;
int iCenterY = rc.Height()/2;
pDC->MoveTo(iCenterX,0);
pDC->LineTo(iCenterX,iMaxY);
pDC->MoveTo(iCenterX,0);
pDC->LineTo(iCenterX-10,10);
pDC->MoveTo(iCenterX,0);
pDC->LineTo(iCenterX+10,10);
pDC->TextOut(iCenterX-25,25,"Y");
pDC->MoveTo(0,iCenterY);
pDC->LineTo(iMaxX,iCenterY);
pDC->MoveTo(iMaxX,iCenterY);
pDC->LineTo(iMaxX-10,iCenterY-10);
pDC->MoveTo(iMaxX,iCenterY);
pDC->LineTo(iMaxX-10,iCenterY+10);
pDC->TextOut(iMaxX-25,iCenterY-25,"X");
CString str;
switch(m_iDrawMethod)
{
case 0:
str = "原始软件计算演示";
break;
case 1:
str = "模拟硬件计算演示";
break;
case 2:
str = "真实硬件计算演示";
break;
}
pDC->TextOut(0,0,str);
pDC->SetTextColor(clOldText);
pDC->SetBkMode(iOldMode);
pDC->SelectObject(pOldPen);
}
//画圆弧上对应的8个点
void CDrawCircleView::CirclePlotPoints(CDC *pDC,int iCenterX, int iCenterY, int x, int y)
{
SetPixelRel(pDC,iCenterX+x,iCenterY+y);
SetPixelRel(pDC,iCenterX-x,iCenterY+y);
SetPixelRel(pDC,iCenterX+x,iCenterY-y);
SetPixelRel(pDC,iCenterX-x,iCenterY-y);
SetPixelRel(pDC,iCenterX+y,iCenterY+x);
SetPixelRel(pDC,iCenterX-y,iCenterY+x);
SetPixelRel(pDC,iCenterX+y,iCenterY-x);
SetPixelRel(pDC,iCenterX-y,iCenterY-x);
}
//将逻辑坐标值转换为设备坐标并在屏幕画一个像素点
void CDrawCircleView::SetPixelRel(CDC *pDC,int x, int y,COLORREF clPixel)
{
pDC->SetPixel(m_iOrgX+x,m_iOrgY-y,clPixel);
}
void CDrawCircleView::OnSetupDrawparam()
{
CDrawParamDlg dlg;
CRect rc;
GetClientRect(rc);
dlg.m_rcClient = rc;
dlg.m_iPosX = m_iPosX;
dlg.m_iPosY = m_iPosY;
dlg.m_iRadius = m_iRadius;
if(dlg.DoModal()==IDOK)
{
m_iPosX = dlg.m_iPosX;
m_iPosY = dlg.m_iPosY;
m_iRadius = dlg.m_iRadius;
Invalidate();
CalcCirclePointBuf();
}
}
void CDrawCircleView::OnSetupDrawmethod()
{
CDrawMethodDlg dlg;
dlg.m_iDrawMethod = m_iDrawMethod;
if(dlg.DoModal()==IDOK)
{
m_iDrawMethod = dlg.m_iDrawMethod;
Invalidate();
CalcCirclePointBuf();
}
}
void CDrawCircleView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CWnd* pWnd = AfxGetMainWnd();
CString str;
int x=point.x-m_iOrgX;
int y=m_iOrgY-point.y;
str.Format("X:%d,Y:%d",x,y);
pWnd->SetWindowText(str);
CView::OnMouseMove(nFlags, point);
}
void CDrawCircleView::OnDoDrawCircle()
{
m_bDoDrawCircle = !m_bDoDrawCircle;
}
void CDrawCircleView::OnUpdateDoDrawCircle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bDoDrawCircle?1:0);
}
BOOL CDrawCircleView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(m_bDoDrawCircle)
{
SetCursor(m_hCross);
return FALSE;
}
else
return CView::OnSetCursor(pWnd, nHitTest, message);
}
void CDrawCircleView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_bDoDrawCircle) //画圆状态
{
int x=point.x-m_iOrgX;
int y=m_iOrgY-point.y;
m_iPosX = x;
m_iPosY = y;
Invalidate();
CalcCirclePointBuf();
}
CView::OnLButtonDown(nFlags, point);
}
void CDrawCircleView::DrawCircleBuf(CDC *pDC)
{
TRACE("buf data\n");
for(int i=0;i<m_nPointCount;i++)
{
CirclePlotPoints(pDC,m_iPosX,m_iPosY,m_lpCircleBuf[i].x,m_lpCircleBuf[i].y);
TRACE("(%d,%d) ",m_lpCircleBuf[i].x,m_lpCircleBuf[i].y);
}
TRACE("buf\n");
}
void CDrawCircleView::CalcCirclePointBuf()
{
CWaitCursor wait;
CClientDC dc(this);
CDC* pDC = &dc;
if(m_lpCircleBuf)
delete[] m_lpCircleBuf;
m_lpCircleBuf = new POINT[m_iRadius];
switch(m_iDrawMethod)
{
case 0:
DrawCircleMidPoint(pDC,m_iPosX,m_iPosY,m_iRadius);
break;
case 1:
DrawCircleMidPoint_SoftRockey(pDC,m_iPosX,m_iPosY,m_iRadius);
break;
case 2:
DrawCircleMidPoint_Rockey(pDC,m_iPosX,m_iPosY,m_iRadius);
break;
}
}
void CDrawCircleView::OnDestroy()
{
CView::OnDestroy();
if(m_iDrawMethod==2)
Rockey(RY_CLOSE,&handle[0],&lp1,&lp2,&p1,&p2,&p3,&p4,buffer);
}
void CDrawCircleView::OnUpdateSetupDrawparam(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_nPointCount!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -