📄 pointerdevice.cpp
字号:
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 + -