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

📄 pointerdevice.cpp

📁 上位机图形显示程序,可用于8051单片机的开发,通信及控制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void PointerDevice::PD_SetTextSpace(UINT length)
{
	PD_TextSpace = length;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetTextColor(COLORREF color)
//输入参数:颜色
//返回值:无
//作用:设置刻度线附近的文字的颜色
void PointerDevice::PD_SetTextColor(COLORREF color)
{
	PD_TextColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetTextStartAngle(double angle)
//输入参数:角度,单位是度
//返回值:无
//作用:设置刻度线附近的文字的起始位置,相对于PD_CenterAngle
void PointerDevice::PD_SetTextStartAngle(double angle)
{
	PD_TextStartAngle = angle;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetCenterNumber(double number)
//输入参数:希望在指针开始的默认位置对应的数字
//返回值:无
//作用:设置指针开始的默认位置对应的数字
void PointerDevice::PD_SetCenterNumber(double number)
{
	PD_CenterNumber = number;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetDeltaNumber(double deltanumber)
//输入参数:数值的增量
//返回值:无
//作用:设置标写刻度时,每个大刻度格子对应的数值增量
void PointerDevice::PD_SetDeltaNumber(double deltanumber)
{
	PD_DeltaNumber = deltanumber;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetStatus(UINT status)
//输入参数:状态常量,可以是下面几种之一:
//	PD_TEST		测试状态,创建时默认的状态,指针会自动移动以测试是否正常工作
//	PD_UPDATED	工作状态,仪表的指针已经指到合适的位置
//  PD_SHUTDOWN	关闭状态,此状态下仪表不作任何动作。
//返回值:无
//作用:设置仪表的当前状态
void PointerDevice::PD_SetStatus(UINT status)
{
	if(PD_UPDATING != status)
		PD_Status = status;
	PD_ObjectAngle = PD_CurrentAngle = 0;
	PD_CurrentNumber = PD_CenterNumber;
	DrawFace();
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetNumberRange(double min, double max)
//输入参数:min是最小的测量值,max是最大的测量值
//返回值:无
//作用:设置仪表的量程
void PointerDevice::PD_SetNumberRange(double min, double max)
{
	PD_MinNumber = min;
	PD_MaxNumber = max;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetCurrentNumber(double number)
//输入参数:当前要显示的数值,应该在量程之内,否则指针会指到最小(下溢出)或者最大(上溢出)位置
//返回值:无
//作用:设置仪表要显示的数值
void PointerDevice::PD_SetCurrentNumber(double number)
{
	if(PD_Status == PD_TEST || PD_Status == PD_SHUTDOWN)
		return;
	if(number > PD_MaxNumber && !PD_IsLoop)		//如果指针不能循环转动,则要判断溢出
	{
		//上溢出通知
		PD_ObjectAngle = (PD_MaxNumber - PD_CenterNumber) * PD_SweepAngle / (PD_MaxNumber - PD_MinNumber);
	}
	else if(number < PD_MinNumber && !PD_IsLoop)	//如果指针不能循环转动,则要判断溢出
	{
		//下溢出通知
		PD_ObjectAngle = (PD_MinNumber - PD_CenterNumber) * PD_SweepAngle / (PD_MaxNumber - PD_MinNumber);
	}
	else
	{
		PD_ObjectAngle = (number - PD_CenterNumber) * PD_SweepAngle / (PD_MaxNumber - PD_MinNumber);
	}
	PD_CurrentNumber = number;
	PD_Status = PD_UPDATING;
	DrawFace();
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetPointerColor(COLORREF color)
//输入参数:颜色的三种原色份量,取值都在0-255以内
//返回值:无
//作用:设置仪表指针的颜色
void PointerDevice::PD_SetPointerColor(COLORREF color)
{
	PD_PointerColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBorderWidth(UINT width)
//输入参数:边界宽度,单位是象素
//返回值:无
//作用:设置仪表3D圆形边界的宽度,如果设置为0,表示不需要3D圆形边界
void PointerDevice::PD_SetBorderWidth(UINT width)
{
	PD_BorderWidth = width;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetPointerStyle(int side_x, int side_y, int tail)
//输入参数:针侧面的点坐标(相对于PD_Origin),针尾的长度
//返回值:无
//作用:设置仪表的指针样式,指针样式由原点,针尖点、针侧面的点和针尾点这四个点来决定,需要指定的只有针侧面的点位置和针尾长度
void PointerDevice::PD_SetPointerStyle(int side_x, int side_y, int tail)
{
	PD_PointerSide.x = side_x;
	PD_PointerSide.y = side_y;
	PD_PointerTail = tail;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetAxleStyle(UINT radius, COLORREF color)
//输入参数:半径和颜色
//返回值:无
//作用:设置仪表的指针球状轴的样式
void PointerDevice::PD_SetAxleStyle(UINT radius, COLORREF color)
{
	PD_AxleRadius = radius;
	PD_AxleColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_Update()
//输入参数:无
//返回值:无
//作用:对其他不能用函数定制的变量进行初始化,应该在其他变量初始化结束后再最后调用
void PointerDevice::PD_Update()
{
	//计算刻度线左右两侧的角度
	PD_RightAngle = PD_CenterAngle - PD_SweepAngle / 2;	
	PD_LeftAngle = PD_CenterAngle + PD_SweepAngle / 2;	

	//计算面板左右两侧的角度
	PD_FaceRightAngle = PD_CenterAngle - PD_FaceSweepAngle / 2;	
	PD_FaceLeftAngle = PD_CenterAngle + PD_FaceSweepAngle / 2;	
	
	//计算刻度弧线中点和左右端点的位置
	PD_CenterPoint.x = PD_Origin.x + (long)(PD_Radius * cos(ANG * PD_CenterAngle));
	PD_CenterPoint.y = PD_Origin.y - (long)(PD_Radius * sin(ANG * PD_CenterAngle));
	PD_StartPoint.x = PD_Origin.x + (long)(PD_Radius * cos(ANG * PD_RightAngle));
	PD_StartPoint.y = PD_Origin.y - (long)(PD_Radius * sin(ANG * PD_RightAngle));
	PD_EndPoint.x = PD_Origin.x + (long)(PD_Radius * cos(ANG * PD_LeftAngle));
	PD_EndPoint.y = PD_Origin.y - (long)(PD_Radius * sin(ANG * PD_LeftAngle));

	//计算面板弧线左右端点位置
	PD_FaceStartPoint.x = PD_Origin.x + (long)(PD_FaceRadius * cos(ANG * PD_FaceRightAngle));
	PD_FaceStartPoint.y = PD_Origin.y - (long)(PD_FaceRadius * sin(ANG * PD_FaceRightAngle));
	PD_FaceEndPoint.x = PD_Origin.x + (long)(PD_FaceRadius * cos(ANG * PD_FaceLeftAngle));
	PD_FaceEndPoint.y = PD_Origin.y - (long)(PD_FaceRadius * sin(ANG * PD_FaceLeftAngle));
	
	//计算指针形状的相关参数
	PD_PointerSideRadius = sqrt(PD_PointerSide.x * PD_PointerSide.x + PD_PointerSide.y * PD_PointerSide.y);
	if(PD_PointerSide.x == 0)
		PD_PointerSideAngle = - (PI / 2);
	else
		PD_PointerSideAngle = - atan(PD_PointerSide.y / PD_PointerSide.x);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOutputFontSize(UINT size)
//输入参数:字体大小,单位象素
//返回值:无
//作用:设置输出示数框内文字的字体大小
void PointerDevice::PD_SetOutputFontSize(UINT size)
{
	PD_OutputFontSize = size;
	PD_OutputFont.DeleteObject();
	PD_OutputFont.CreateFont(MulDiv(PD_OutputFontSize, - 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_SetOutputPos(int rect_x, int rect_y, int text_x, int text_y)
//输入参数:输出示数框的中心位置坐标(相对于PD_Origin)和示数框内文字的中心位置坐标(相对于PD_Origin)
//返回值:无
//作用:设置输出示数框和其内的文字的位置
void PointerDevice::PD_SetOutputPos(int rect_x, int rect_y, int text_x, int text_y)
{
	PD_OutputPos.x = rect_x;
	PD_OutputPos.y = rect_y;
	PD_OutputTextPos.x = text_x;
	PD_OutputTextPos.y = text_y;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOutputBkColor(COLORREF color)
//输入参数:输出示数框背景颜色
//返回值:无
//作用:设置输出示数框的背景颜色
void PointerDevice::PD_SetOutputBkColor(COLORREF color)
{
	PD_OutputBkColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOutputTextColor(COLORREF color)
//输入参数:输出示数框内文字的颜色
//返回值:无
//作用:设置输出示数框内文字的颜色
void PointerDevice::PD_SetOutputTextColor(COLORREF color)
{
	PD_OutputTextColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOutputBdColor(COLORREF color)
//输入参数:输出示数框边界的颜色
//返回值:无
//作用:设置输出示数框边界的颜色
void PointerDevice::PD_SetOutputBdColor(COLORREF color)
{
	PD_OutputBdColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetOutputSize(UINT width, UINT height)
//输入参数:输出示数框的宽度和高度,单位象素
//返回值:无
//作用:设置输出示数框的大小
void PointerDevice::PD_SetOutputSize(UINT width, UINT height)
{
	PD_OutputWidth = width;
	PD_OutputHeight = height;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:GetCurrentNumber()
//输入参数:无
//返回值:当前指针位置所对应的示数
//作用:获取当前指针位置所对应的示数
double PointerDevice::GetCurrentNumber()
{
	double curangle;
	curangle = PD_CurrentAngle;
	return (curangle * (PD_MaxNumber - PD_MinNumber) / PD_SweepAngle + PD_CenterNumber);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBkColor(COLORREF color)
//输入参数:仪表背景颜色
//返回值:无
//作用:设置仪表背景颜色(原来默认是对话框背景颜色以模仿透明)
void PointerDevice::PD_SetBkColor(COLORREF color)
{
	PD_BkColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetStepLength(double length)
//输入参数:指针最小的摆动角度,单位是度
//返回值:无
//作用:设置仪表指针最小的摆动角度
void PointerDevice::PD_SetStepLength(double length)
{
	PD_StepLength = length;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetPointerShadow(UINT show, COLORREF color, int offset_x, int offset_y)
//输入参数:show为1表示显示阴影,为0表示没有阴影,color是阴影的颜色,offset_x和offset_y是阴影和指针的相对偏移量
//返回值:无
//作用:设置仪表指针的阴影
void PointerDevice::PD_SetPointerShadow(UINT show, COLORREF color, int offset_x, int offset_y)
{
	PD_HasPointerShadow = show;
	PD_PointerShadowColor = color;
	PD_PointerShadowOffset.x = offset_x;
	PD_PointerShadowOffset.y = offset_y;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBitmapBk(UINT bitmap_id, UINT showmode)
//输入参数:bitmap_id是位图资源的ID,显示方式showmode可以是0,1,2
//showmode为0表示不使用位图作为背景
//showmode为1表示直接使用位图作为背景
//showmode为2表示使用映射的位图作为背景,也就是将位图中和系统颜色近似的颜色映射成系统颜色,常用于实现透明背景效果
//返回值:无
//作用:设置仪表的位图背景
void PointerDevice::PD_SetBitmapBk(UINT bitmap_id, UINT showmode)
{
	PD_UseBitmap = showmode;
	PD_BitmapID = bitmap_id;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_PtInHotArea(CPoint point)
//输入参数:事件发生时鼠标的坐标
//返回值:如果是true则表示点在热区中,如果是false表示点不在热区中
//作用:判断指定点是否在仪表热区(表盘)中。
UINT PointerDevice::PD_PtInHotArea(CPoint point)
{
	double r = sqrt((point.x - PD_Origin.x) * (point.x - PD_Origin.x) + (point.y - PD_Origin.y) * (point.y - PD_Origin.y));
	if(r <= (PD_FaceRadius + PD_BorderWidth))
		return true;
	else 
		return false;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetTitle(int x, int y, CString title, UINT fontsize, COLORREF color)
//输入参数:标题左上角相对于仪表窗口左上角的坐标x,y,标题文字title,字体大小fontsize(为0则不显示),color是字体颜色
//返回值:无
//作用:设定仪表的标题
void PointerDevice::PD_SetTitle(int x, int y, CString title, UINT fontsize, COLORREF color)
{
	PD_TitleOffset.x = x;
	PD_TitleOffset.y = y;
	PD_Title = title;
	PD_TitleFontSize = fontsize;
	PD_TitleColor = color;
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:GetNextColor(COLORREF current_color, int delta)
//输入参数:current_color为源颜色,delta为变化量(可以取正负值)
//返回值:无
//作用:获得current_color的同样色调的下一颜色(如果delta大于0则为更亮的颜色,小于0则为更暗的颜色)
COLORREF PointerDevice::GetNextColor(COLORREF current_color, int delta)
{
	long red, green, blue;
	red = GetRValue(current_color) + delta;
	green = GetGValue(current_color) + delta;
	blue = GetBValue(current_color) + delta;
	if(red > 255)
		red = 255;
	if(green > 255)
		green = 255;
	if(blue > 255)
		blue = 255;
	if(red < 0)
		red = 0;
	if(green < 0)
		green = 0;
	if(blue < 0)
		blue = 0;
	return RGB(red, green, blue);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:GetNextColor(COLORREF color, double ratio)
//输入参数:current_color为源颜色,ratio为变化比率
//返回值:无
//作用:获得current_color的同样色调的下一颜色(如果ratio大于1则为更亮的颜色,小于1则为更暗的颜色)
COLORREF PointerDevice::GetNextColor(COLORREF current_color, double ratio)
{
	long red, green, blue;
	red = (long)(GetRValue(current_color) * ratio);
	green = (long)(GetGValue(current_color) * ratio);
	blue = (long)(GetBValue(current_color) * ratio);
	if(red > 255)
		red = 255;
	if(green > 255)
		green = 255;
	if(blue > 255)
		blue = 255;
	if(red < 0)
		red = 0;
	if(green < 0)
		green = 0;
	if(blue < 0)
		blue = 0;
	return RGB(red, green, blue);
}


/////////////////////////////////////////////////////////////////////////////////////////
//函数名:PD_SetBorderColor(COLORREF color)
//输入参数:边框的颜色(最深的一环颜色)
//返回值:无
//作用:设置仪表3D边框的颜色基调
void PointerDevice::PD_SetBorderColor(COLORREF color)
{
	PD_BorderColor = color;
}


⌨️ 快捷键说明

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