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

📄 target.cpp

📁 电子尺源程序说明 本程序使用ADO访问Access2000的数据库。
💻 CPP
字号:
// Target.cpp : implementation file
//

#include "stdafx.h"
#include "new ruler.h"
#include "Target.h"
#include "Math.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// Target

CTarget::CTarget()
{
	m_pPenAux = NULL;
	m_colorStart = RGB(255, 0, 0);
	m_colorAux = RGB(0, 0, 0);
	m_colorFont = RGB(0, 0, 0);
}

CTarget::~CTarget()
{
	if (m_pPenAux)
		delete m_pPenAux;
}

BEGIN_MESSAGE_MAP(CTarget, CWnd)
	//{{AFX_MSG_MAP(CTarget)
	ON_WM_RBUTTONUP()
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CTarget message handlers

void CTarget::CreateTarget(LPCTSTR lpTitle, CWnd* pWnd)
{
	//取得屏幕宽度
	m_cxScreen = ::GetSystemMetrics(SM_CXSCREEN);
	m_cyScreen = ::GetSystemMetrics(SM_CYSCREEN);
	//创建透明窗口
	CreateEx(WS_EX_TOPMOST, 
		AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)), 
		"Target", WS_POPUP, 0, 0, m_cxScreen, m_cyScreen, NULL, NULL, NULL );

	//得到当前窗口的DC,以便绘制辅助线、坐标等
	CDC * pDC;
	pDC = GetDC();
	//V1.06后pDC不保存,改为需要绘图时再取DC指针,否则会非法操作

	//表示目前尚未点击
	m_bSecond = FALSE;

	//记录父窗口的指针,以便测量结束进行通知
	m_pWndParent = pWnd;

	//窗口内存DC保存当前屏幕,辅助线移动时重绘窗口
	m_MemDC.CreateCompatibleDC(NULL);
	CBitmap Bitmap;
	Bitmap.CreateCompatibleBitmap(pDC, m_cxScreen, m_cyScreen);
	m_MemDC.SelectObject(&Bitmap);
	m_MemDC.BitBlt(0, 0, m_cxScreen, m_cyScreen, pDC, 0, 0, SRCCOPY);
	Bitmap.DeleteObject();

	//创建辅助线的画笔
	m_pPenAux = new CPen(PS_SOLID, 1, m_colorAux);
}

void CTarget::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	// CDC * pDC;
	// pDC = GetDC();
	
	m_MemDC.DeleteDC();

	CWnd::OnRButtonUp(nFlags, point);
	// pDC->DeleteDC();

	::DeleteObject(m_pPenAux->m_hObject);
	delete m_pPenAux;
	m_pPenAux = NULL;

	DestroyWindow();
	m_pWndParent->PostMessage(WM_CANCELCLICK);
}

void CTarget::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC * pDC;
	pDC = GetDC();

	if(m_bSecond == FALSE)
	{
		m_StartPos = point;
		m_bSecond = TRUE;
		pDC->BitBlt(0, 0, m_cxScreen, m_cyScreen, &m_MemDC, 0, 0, SRCCOPY);
		CPen pen(PS_SOLID, 2, m_colorStart);
		CPen * pOldPen;
		pOldPen = pDC->SelectObject(&pen);
		pDC->MoveTo(point.x - 10, point.y);
		pDC->LineTo(point.x + 10, point.y);
		pDC->MoveTo(point.x, point.y - 10);
		pDC->LineTo(point.x, point.y + 10);
		pDC->SelectObject(pOldPen);
		::DeleteObject(pen.m_hObject);
		m_MemDC.BitBlt(0, 0, m_cxScreen, m_cyScreen, pDC, 0, 0, SRCCOPY);
		ReleaseDC(pDC);   // Modified by Wang Hongying Apr. 21, 2002
	}
	else
	{
		m_EndPos = point;
		Calculate();
		// pDC->DeleteDC();  // Modified by Wang Hongying Apr. 21, 2002
		ReleaseDC(pDC);   // Modified by Wang Hongying Apr. 21, 2002
		m_MemDC.DeleteDC();

		::DeleteObject(m_pPenAux->m_hObject);
		delete m_pPenAux;
		m_pPenAux = NULL;

		DestroyWindow();
		m_pWndParent->PostMessage(WM_ENDCLICK);
	}

	CWnd::OnLButtonDown(nFlags, point);
}

void CTarget::Calculate()
{
	double x, y;

	x = m_EndPos.x - m_StartPos.x;
	y = m_EndPos.y - m_StartPos.y;
	//计算长度(像素)
	m_iLen_p = (int)sqrt(x * x + y * y);
	//计算面积(像素)
	m_AreaRectangle_Pixel = abs(int(x * y));

	CDC * pDC;
	pDC = GetDC();
	pDC->SetMapMode(MM_LOMETRIC);

	POINT tmpStart = m_StartPos;
	POINT tmpEnd = m_EndPos;

	pDC->DPtoLP(&tmpStart);
	pDC->DPtoLP(&tmpEnd);

	x = tmpEnd.x - tmpStart.x;
	y = tmpEnd.y - tmpStart.y;
	//计算长度(0.1毫米)
	m_dLen_m = sqrt(x * x + y * y);
	//计算面积(0.01平方毫米)
	m_AreaRectangle_MM = fabs(x*y);

	pDC->SetMapMode(MM_LOENGLISH);

	tmpStart = m_StartPos;
	tmpEnd = m_EndPos;

	pDC->DPtoLP(&tmpStart);
	pDC->DPtoLP(&tmpEnd);

	x = tmpEnd.x - tmpStart.x;
	y = tmpEnd.y - tmpStart.y;
	//计算长度(0.01inch)
	m_dLen_i = sqrt(x * x + y * y);
	//计算面积(0.0001平方inch)
	m_AreaRectangle_Inch = fabs(x*y);

	ReleaseDC(pDC);
}

void CTarget::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC* pDC;
	pDC = GetDC();

	pDC->SetMapMode(MM_TEXT);
	pDC->SelectObject(m_pPenAux);

	pDC->BitBlt(0, 0, m_cxScreen, m_cyScreen, &m_MemDC, 0, 0, SRCCOPY);
	pDC->MoveTo(0, point.y);
	pDC->LineTo(m_cxScreen, point.y);
	pDC->MoveTo(point.x, 0);
	pDC->LineTo(point.x, m_cyScreen);

	//显示当前坐标
	pDC->SetTextColor(m_colorFont);
	CString strCord;
	//如果已点击过一次,再显示距离
	if (m_bSecond)
	{
		double x, y;
		x = point.x - m_StartPos.x;
		y = point.y - m_StartPos.y;
		int iDistance = (int)sqrt(x * x + y * y);
		strCord.Format("当前:%d,%d 距离:%d",point.x,point.y,iDistance);
	}
	else
		strCord.Format("当前:%d,%d",point.x,point.y);
	//输出
	CSize sizeCordWidth = pDC->GetOutputTextExtent(strCord);
	int iOffsetX = 0, iOffsetY = 0;
	//移到边界时,调整显示位置
	if((m_cxScreen - point.x) <= (sizeCordWidth.cx + 25))
		iOffsetX = -(sizeCordWidth.cx + 40);
	if ((m_cyScreen - point.y) <= (sizeCordWidth.cy + 25))
		iOffsetY = -(sizeCordWidth.cy + 40);
	pDC->TextOut(point.x + 20 + iOffsetX, point.y + 20 + iOffsetY, strCord);

	if (m_bSecond)
	{
		pDC->MoveTo(m_StartPos.x, m_StartPos.y);
		pDC->LineTo(point.x, point.y);
	}

	ReleaseDC(pDC);
	CWnd::OnMouseMove(nFlags, point);
}

RECT CTarget::GetPoints()
{
	//以RECT结构返回两点(起点、终点)坐标
	//左上角为起点,右下角为终点
	////////////////////////////////////////
	//rect.left		起点横坐标
	//rect.top		起点纵坐标
	//rect.right	终点横坐标
	//rect.bottom	终点纵坐标
	////////////////////////////////////////
	RECT rect;
	rect.left = m_StartPos.x;
	rect.top = m_StartPos.y;
	rect.right = m_EndPos.x;
	rect.bottom = m_EndPos.y;

	return rect;
}

int CTarget::GetLength_Pixel()
{
	//返回以像素为单位的长度
	return m_iLen_p;
}

double CTarget::GetLength_MM()
{
	//返回以毫米为单位的长度
	return m_dLen_m / 10;
}

double CTarget::GetLength_Inch()
{
	//返回以英寸为单位的长度
	return m_dLen_i / 100;
}

void CTarget::SetColor(COLORREF Aux, COLORREF Start, COLORREF Font)
{
	//设置参照物的颜色
	m_colorAux = Aux;		//辅助线
	m_colorFont = Font;		//坐标字
	m_colorStart = Start;	//起点标志
}

double CTarget::GetArea_Rectangle_MM()
{
	/////////////////////////////////////////
	//返回两点间围成矩形的面积
	//单位:平方毫米
	/////////////////////////////////////////

	return m_AreaRectangle_MM / 100;
}

double CTarget::GetArea_Rectangle_Inch()
{
	/////////////////////////////////////////
	//返回两点间围成矩形的面积
	//单位:平方inch
	/////////////////////////////////////////

	return m_AreaRectangle_Inch / 10000;
}

int CTarget::GetArea_Rectangle_Pixel()
{
	/////////////////////////////////////////
	//返回两点间围成矩形的面积
	//单位:像素数
	/////////////////////////////////////////

	return m_AreaRectangle_Pixel;
}

int CTarget::GetArea_Circle_Pixel()
{
	/////////////////////////////////////////
	//返回以起点为圆心,长度为半径的圆形面积
	//单位:像素数
	/////////////////////////////////////////

	return int(2 * PI * m_iLen_p * m_iLen_p);
}

double CTarget::GetArea_Circle_MM()
{
	/////////////////////////////////////////
	//返回以起点为圆心,长度为半径的圆形面积
	//单位:平方毫米
	/////////////////////////////////////////

	return 2 * PI * m_dLen_m * m_dLen_m /100;
}

double CTarget::GetArea_Circle_Inch()
{
	/////////////////////////////////////////
	//返回以起点为圆心,长度为半径的圆形面积
	//单位:平方Inch
	/////////////////////////////////////////

	return 2 * PI * m_dLen_i * m_dLen_i /10000;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -