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