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

📄 pointerdevice.cpp

📁 上位机图形显示程序,可用于8051单片机的开发,通信及控制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				format.Format("%%.%dlf", PD_OutputAccuracy);
				text.Format(format, tmpnum); 
			}
			
			if(current_angle < 180 && current_angle > 0)
			{
				dcmem.SetTextAlign(TA_CENTER | TA_TOP);
				dcmem.TextOut(textpos.x + 2, textpos.y - 5, text);
			}
			else
			{
				dcmem.SetTextAlign(TA_CENTER | TA_BOTTOM);
				dcmem.TextOut(textpos.x + 2, textpos.y + 5, text);
			}
			current_angle -= delta;
			if(current_angle <= PD_RightAngle)
				break;
		}
	}

	dcmem.SetTextColor(oldcolor);
	dcmem.SetBkMode(oldmode);
	dcmem.SelectObject(pfontold);

	//绘制示数输出框
	if(PD_OutputFontSize)	//如果输出字体大小为零,表示不需要输出框
	{
		brush.CreateSolidBrush(PD_OutputBkColor);
		pbrushold = dcmem.SelectObject(&brush);
		pen.CreatePen(PS_SOLID, 1, PD_OutputBdColor);
		ppenold = dcmem.SelectObject(&pen);
		dcmem.Rectangle(PD_OutputPos.x + PD_Origin.x - PD_OutputWidth / 2, PD_OutputPos.y + PD_Origin.y - PD_OutputHeight / 2, PD_OutputPos.x + PD_Origin.x + PD_OutputWidth / 2, PD_OutputPos.y + PD_Origin.y + PD_OutputHeight / 2);
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
		pfontold = dcmem.SelectObject(&PD_OutputFont);
		oldmode = dcmem.SetBkMode(TRANSPARENT);
		oldcolor = dcmem.SetTextColor(PD_OutputTextColor);
		dcmem.SetTextAlign(TA_CENTER);
		format.Format("%%.%dlf", PD_OutputAccuracy);
		if(PD_Status == PD_UPDATED)
			text.Format(format, PD_CurrentNumber); 
		else
			text.Format(format, GetCurrentNumber()); 
		dcmem.TextOut(PD_OutputTextPos.x + PD_Origin.x, PD_OutputTextPos.y + PD_Origin.y, text);
		dcmem.SelectObject(ppenold);
		pen.DeleteObject();
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
		dcmem.SelectObject(pfontold);
		dcmem.SetTextColor(oldcolor);
		dcmem.SetBkMode(oldmode);
	}

	//绘制仪表的指针
	temp_color = GetNextColor(PD_PointerColor, 0.5);
	CPoint bkpt, pt[4], ptbk[4];
	double angle;
	ptbk[0] = pt[0] = PD_Origin;
	ptbk[0].Offset(3, 3);
	angle = ANG * (PD_CurrentAngle + PD_CenterAngle);
	pt[2].x = PD_Origin.x + (long)(PD_PointerLength * cos(angle));
	pt[2].y = PD_Origin.y - (long)(PD_PointerLength * sin(angle));
	ptbk[2] = pt[2];
	ptbk[2].Offset(3, 3);
	angle = PD_PointerSideAngle + ANG * PD_CurrentAngle;
	bkpt.x = pt[1].x = PD_Origin.x + (long)(PD_PointerSideRadius * cos(angle));
	bkpt.y = pt[1].y = PD_Origin.y - (long)(PD_PointerSideRadius * sin(angle));
	ptbk[1] = pt[1];
	ptbk[1].Offset(3, 3);
	
	if(PD_HasPointerShadow)
	{
		brush.CreateSolidBrush(PD_PointerShadowColor);
		pbrushold = dcmem.SelectObject(&brush);
		dcmem.Polygon(ptbk, 3);
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
	}

	pen.CreatePen(PS_SOLID, PD_PointerWidth, temp_color);
	ppenold = dcmem.SelectObject(&pen);
	brush.CreateSolidBrush(temp_color);
	pbrushold = dcmem.SelectObject(&brush);
	dcmem.Polygon(pt, 3);
  	dcmem.SelectObject(ppenold);
	pen.DeleteObject();	 	
	dcmem.SelectObject(pbrushold);
	brush.DeleteObject();

	temp_color = PD_PointerColor;
	angle = ANG * 2 * PD_CenterAngle - PD_PointerSideAngle + ANG * PD_CurrentAngle;
	pt[1].x = PD_Origin.x + (long)(PD_PointerSideRadius * cos(angle));
	pt[1].y = PD_Origin.y - (long)(PD_PointerSideRadius * sin(angle));
	ptbk[1] = pt[1];
	ptbk[1].Offset(3, 3);

	if(PD_HasPointerShadow)
	{
		brush.CreateSolidBrush(PD_PointerShadowColor);
		pbrushold = dcmem.SelectObject(&brush);
		dcmem.Polygon(ptbk, 3);
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
	}

	pen.CreatePen(PS_SOLID, PD_PointerWidth, temp_color);
	ppenold = dcmem.SelectObject(&pen);
	brush.CreateSolidBrush(temp_color);
	pbrushold = dcmem.SelectObject(&brush);
	dcmem.Polygon(pt, 3);
  	dcmem.SelectObject(ppenold);
	pen.DeleteObject();	 	
	dcmem.SelectObject(pbrushold);
	brush.DeleteObject();

	temp_color = GetNextColor(temp_color, 0.7);
	pt[2] = bkpt;
	ptbk[2] = pt[2];
	ptbk[2].Offset(3, 3);
	angle = PI + ANG * (PD_CurrentAngle + PD_CenterAngle);
	pt[3].x = PD_Origin.x + (long)(PD_PointerTail * cos(angle));
	pt[3].y = PD_Origin.y - (long)(PD_PointerTail * sin(angle));
	ptbk[3] = pt[3];
	ptbk[3].Offset(3, 3);

	if(PD_HasPointerShadow)
	{
		brush.CreateSolidBrush(PD_PointerShadowColor);
		pbrushold = dcmem.SelectObject(&brush);
		dcmem.Polygon(ptbk, 3);	
		dcmem.Polygon(&ptbk[1], 3);
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
	}

	pen.CreatePen(PS_SOLID, PD_PointerWidth, temp_color);
	ppenold = dcmem.SelectObject(&pen);
	brush.CreateSolidBrush(temp_color);
	pbrushold = dcmem.SelectObject(&brush);
	dcmem.Polygon(pt, 3);
	dcmem.Polygon(&pt[1], 3);
  	dcmem.SelectObject(ppenold);
	pen.DeleteObject();	 	
	dcmem.SelectObject(pbrushold);
	brush.DeleteObject();

	//绘制仪表的中心轴
	dcmem.SelectStockObject(NULL_PEN);
	temp_color = PD_AxleColor;
	int k;
	for(k = PD_AxleRadius; k >= 0; k --)
	{
		temp_color = GetNextColor(temp_color, 1.2);
		brush.CreateSolidBrush(temp_color);
		pbrushold = dcmem.SelectObject(&brush);
		dcmem.Ellipse(PD_Origin.x - k, PD_Origin.y - k, PD_Origin.x + k, PD_Origin.y + k);
		dcmem.SelectObject(pbrushold);
		brush.DeleteObject();
	}
	
	//绘制仪表的标题
	if(PD_TitleFontSize)	//如果标题字体大小为零,表示不需要标题
	{
		pfontold = dcmem.SelectObject(&PD_TitleFont);
		oldmode = dcmem.SetBkMode(TRANSPARENT);
		oldcolor = dcmem.SetTextColor(PD_TitleColor);
		dcmem.SetTextAlign(TA_LEFT);
		dcmem.TextOut(PD_TitleOffset.x, PD_TitleOffset.y, PD_Title);
		dcmem.SelectObject(pfontold);
		dcmem.SetTextColor(oldcolor);
		dcmem.SetBkMode(oldmode);
	}

	//将内存DC的内容一次画在屏幕DC上
	dc.BitBlt(0, 0, bmp.bmWidth, bmp.bmHeight, &dcmem, 0, 0, SRCCOPY);

 	dcmem.SelectObject(pbitmapold);
	bmpc.DeleteObject();	
	
	dcmem.DeleteDC();
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_MoveWindow(int x, int y)	
//输入参数:窗口新位置的左上角坐标x,y
//返回值:无
//作用:移动仪表的位置,移动后自己完成重画
void PointerDevice::PD_MoveWindow(int x, int y)	
{
	CRect rect;
	GetWindowRect(&rect);
	MoveWindow(x, y, rect.Width(), rect.Height(), true);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetTimer(UINT timeout)
//输入参数:定时器的触发间隔时间,用毫秒作单位
//返回值:无
//作用:设置仪表内部的计时器触发间隔时间(将决定指针的摆动速度),单位是毫秒
void PointerDevice::PD_SetTimer(UINT timeout)
{
	KillTimer(1);
	SetTimer(1, timeout, NULL);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetRadius(UINT radius)
//输入参数:半径,单位是象素
//返回值:无
//作用:设置仪表刻度弧线的半径
void PointerDevice::PD_SetRadius(UINT radius)
{
	PD_Radius = radius;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBigGridLength(UINT length)
//输入参数:长度,单位是象素
//返回值:无
//作用:设置仪表的大刻度线长度,该函数不完成重画
void PointerDevice::PD_SetBigGridLength(UINT length)
{
	PD_BigGridLength = length;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBigGridNum(UINT num)
//输入参数:格子数目
//返回值:无
//作用:设置仪表的大刻度线的格子数目,该函数不完成重画
void PointerDevice::PD_SetBigGridNum(UINT num)
{
	PD_BigGridNum = num;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetCenterAngle(double angle)
//输入参数:角度,单位是度
//返回值:无
//作用:设置仪表刻度弧中线与X轴的夹角,该函数不完成重画
void PointerDevice::PD_SetCenterAngle(double angle)
{
	PD_CenterAngle = angle;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOrigin(long x, long y)
//输入参数:指针原点的坐标,相对于仪表的左上角
//返回值:无
//作用:设置仪表的指针原点位置
void PointerDevice::PD_SetOrigin(long x, long y)
{
	PD_Origin.x = x;
	PD_Origin.y = y;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetSize(UINT width, UINT height)
//输入参数:仪表的宽度和高度,单位是象素
//返回值:无
//作用:设置仪表的大小
void PointerDevice::PD_SetSize(UINT width, UINT height)
{
	int update = 0;
	if(PD_Origin.x == (long)((PD_Width - 1) / 2) && PD_Origin.y == (long)((PD_Height - 1) / 2))
		update = 1;
	PD_Width = width;
	PD_Height = height;
	if(update)//设置仪表的原点为窗体的中心
	{
		PD_Origin.x = (long)((PD_Width - 1) / 2);		
		PD_Origin.y = (long)((PD_Height - 1) / 2);
	}
	RECT rect;
	GetWindowRect(&rect);
	MoveWindow(rect.left, rect.top, width, height);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetSmallGridLength(UINT length)
//输入参数:小刻度线长度,单位是象素
//返回值:无
//作用:设置小刻度线的长度
void PointerDevice::PD_SetSmallGridLength(UINT length)
{
	PD_SmallGridLength = length;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetFaceRadius(UINT radius)
//输入参数:半径,单位是象素
//返回值:无
//作用:设置仪表面板的半径
void PointerDevice::PD_SetFaceRadius(UINT radius)
{
	PD_FaceRadius = radius;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetSmallGridNum(UINT num)
//输入参数:小刻度线格子数目
//返回值:无
//作用:设置小刻度显的格子数目
void PointerDevice::PD_SetSmallGridNum(UINT num)
{
	PD_SmallGridNum = num;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetPointerLength(UINT length)
//输入参数:指针长度,单位是象素
//返回值:无
//作用:设置仪表的指针长度
void PointerDevice::PD_SetPointerLength(UINT length)
{
	PD_PointerLength = length;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetPointerWidth(UINT width)
//输入参数:指针的绘制宽度,单位是象素
//返回值:无
//作用:设置仪表的指针绘制宽度,会决定指针的尖端粗细
void PointerDevice::PD_SetPointerWidth(UINT width)
{
	PD_PointerWidth = width;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetSweepAngle(double angle)
//输入参数:角度,单位是度
//返回值:无
//作用:设置仪表刻度弧线的张角
void PointerDevice::PD_SetSweepAngle(double angle)
{
	PD_SweepAngle = angle;
	PD_FaceSweepAngle = angle + 10;	//默认仪表面板弧线张角比刻度弧线张角大10度
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetFaceSweepAngle(double angle)
//输入参数:角度,单位是度
//返回值:无
//作用:设置仪表面板弧线的张角
void PointerDevice::PD_SetFaceSweepAngle(double angle)
{
	PD_FaceSweepAngle = angle;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetIsLoop(UINT op)
//输入参数:true或者false,true表示允许循环转动
//返回值:无
//作用:设置是否允许指针循环转动
void PointerDevice::PD_SetIsLoop(UINT op)
{
	PD_IsLoop = op;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetFaceColor(COLORREF color)
//输入参数:仪表面板的颜色,可用RGB(red, green, blue)函数获得,其中red, green, blue分别为红、绿和蓝色的份量,取值0-255
//返回值:无
//作用:设置是否允许指针循环转动
void PointerDevice::PD_SetFaceColor(COLORREF color)
{
	PD_FaceColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetCalibrationColor(COLORREF color)
//输入参数:刻度线的颜色
//返回值:无
//作用:设置仪表刻度线的颜色
void PointerDevice::PD_SetCalibrationColor(COLORREF color)
{
	PD_CalibrationColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetInnerRadius(UINT radius)
//输入参数:半径,单位象素
//返回值:无
//作用:设置面板内部中空圆(颜色和底色一样)的半径
void PointerDevice::PD_SetInnerRadius(UINT radius)
{
	PD_InnerRadius = radius;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetFontSize(UINT size)
//输入参数:字体点数,单位象素
//返回值:无
//作用:设置刻度线附近的文字的字体大小
void PointerDevice::PD_SetFontSize(UINT size)
{
	PD_FontSize = size;
	PD_Font.DeleteObject();
	PD_Font.CreateFont(MulDiv(PD_FontSize, - GetDC()->GetDeviceCaps(LOGPIXELSY), 72), 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET, OUT_STROKE_PRECIS, CLIP_STROKE_PRECIS, DRAFT_QUALITY, VARIABLE_PITCH | FF_SWISS, _T("Arial"));
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetTextSpace(UINT length)
//输入参数:距离,单位象素
//返回值:无
//作用:设置刻度线附近的文字和刻度线之间的距离

⌨️ 快捷键说明

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