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

📄 drawcircleview.cpp

📁 此为本书的配套光盘.本书不但由浅入深地讲解了软件保护技术
💻 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 + -