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

📄 meter.cpp

📁 485通讯接口模块的编程应用
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		else if(dtempangle>10)
		{
			::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BASELINE)  ; 
			pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2,ETO_OPAQUE,NULL ,strtemp , NULL) ; 
		}
		else if(dtempangle>-10)
		{
			::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BASELINE)  ; 
			pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/3,ETO_OPAQUE,NULL ,strtemp , NULL) ; 
		}
		else 
		{
			::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BOTTOM)  ; 
			pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2,ETO_OPAQUE,NULL ,strtemp , NULL) ; 
		}
	}
	pDC->SelectObject(pFontOld);
}

void CMeter::ReconstructControl()
{
 	
	if ((m_pBitmapOldBackground) && (m_bitmapBackground.GetSafeHandle()) && (m_dcBackground.GetSafeHdc()))
	{
			m_dcBackground.SelectObject(m_pBitmapOldBackground);
			m_dcBackground.DeleteDC() ;
			m_bitmapBackground.DeleteObject();
	}

 	Invalidate ();
}
 
void CMeter::DrawNeedle(CDC *pDC)
{
	int nResult;
	double dRadPerDeg = 4.0*atan(1.0)/180.0;
	double dAngleDeg;
	double dAngleRad ;
	double dTemp ;
	CBrush brushFill, *pBrushOld ;
	CPen penDraw, *pPenOld ;
	CPoint pointNeedle[4] ;	// 指针由四边形组成


	// 计算角度并限定指针走的角度
	dAngleDeg = m_nStartAngleDeg-(360.0+m_nStartAngleDeg-m_nEndAngleDeg)
		*(m_dCurrentValue-m_dMinValue)/(m_dMaxValue-m_dMinValue);
	dAngleDeg = min(dAngleDeg, m_nStartAngleDeg);
	dAngleDeg = max(dAngleDeg, m_nEndAngleDeg-360.0);
	dAngleRad = dAngleDeg*dRadPerDeg;

	// 计算三角形底边两个点
	pointNeedle[0].x = m_ptMeterCenter.x - (int)(m_nCenterRadius*10*sin(dAngleRad)/8);
	pointNeedle[0].y = m_ptMeterCenter.y - (int)(m_nCenterRadius*10*cos(dAngleRad)/8);
	pointNeedle[2].x = m_ptMeterCenter.x + (int)(m_nCenterRadius*10*sin(dAngleRad)/8);
	pointNeedle[2].y = m_ptMeterCenter.y + (int)(m_nCenterRadius*10*cos(dAngleRad)/8);
	
	// 计算指针顶部坐标
	dTemp = m_ptMeterCenter.x + m_nRadiusFrame*cos(dAngleRad)*95/100;
	pointNeedle[1].x = ROUND(dTemp);
	dTemp = m_ptMeterCenter.y - m_nRadiusFrame*sin(dAngleRad)*95/100;
	pointNeedle[1].y = ROUND(dTemp);
	// 计算指针尾部坐标
	dTemp = m_ptMeterCenter.x - m_nRadiusFrame*cos(dAngleRad)/6;
	pointNeedle[3].x = ROUND(dTemp);
	dTemp = m_ptMeterCenter.y + m_nRadiusFrame*sin(dAngleRad)/6;
	pointNeedle[3].y = ROUND(dTemp);

	pDC->SelectClipRgn(&m_rgnBoundary);

	brushFill.CreateSolidBrush(m_colorNeedle);
	penDraw.CreatePen(PS_SOLID, 1, m_colorNeedle);

	pPenOld = pDC->SelectObject(&penDraw) ;
	pBrushOld = pDC->SelectObject(&brushFill) ;

	// 绘制指针
	pDC->Polygon(pointNeedle, 4);

	nResult = pDC->SelectClipRgn(NULL);

	pDC->SelectObject(pPenOld);
	pDC->SelectObject(pBrushOld);

	// 立体感处理
	if(dAngleDeg>90)
	{
		penDraw.DeleteObject();
		penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);
		pPenOld = pDC->SelectObject(&penDraw);
		pDC->MoveTo(pointNeedle[1]);
		pDC->LineTo(pointNeedle[0]);
		pDC->LineTo(pointNeedle[3]);
		pDC->SelectObject(pPenOld);
		
		penDraw.DeleteObject();
		penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);
		pPenOld = pDC->SelectObject(&penDraw);
		pDC->MoveTo(pointNeedle[1]);
		pDC->LineTo(pointNeedle[2]);
		pDC->LineTo(pointNeedle[3]);
		pDC->SelectObject(pPenOld);
	}
	else
	{
		penDraw.DeleteObject();
		penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);
		pPenOld = pDC->SelectObject(&penDraw);
		pDC->MoveTo(pointNeedle[1]);
		pDC->LineTo(pointNeedle[2]);
		pDC->LineTo(pointNeedle[3]);
		pDC->SelectObject(pPenOld);
		
		penDraw.DeleteObject();
		penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);
		pPenOld = pDC->SelectObject(&penDraw);
		pDC->MoveTo(pointNeedle[1]);
		pDC->LineTo(pointNeedle[0]);
		pDC->LineTo(pointNeedle[3]);
		pDC->SelectObject(pPenOld);
	}
}

void CMeter::UpdateNeedle(double dValue)
{
  	

	if (m_dCurrentValue != dValue)
	{
		m_dCurrentValue = dValue;
 		Invalidate();
	}
}

void CMeter::SetNeedleColor(COLORREF colorNeedle)
{
	if (m_colorNeedle != colorNeedle )
	{
		m_colorNeedle = colorNeedle ;
		ReconstructControl() ;
	}
}


void CMeter::SetRange(double dMin, double dMax)
{
	m_dMaxValue = dMax ;
	m_dMinValue = dMin ;
	ReconstructControl() ;
}


void CMeter::SetScaleDecimals(int nDecimals)
{
	m_nScaleDecimals = nDecimals ;
	ReconstructControl() ;
}

void CMeter::SetUnits(CString &strUnits)
{
	m_strUnits = strUnits ;
	ReconstructControl() ;
}

void CMeter::SetValueDecimals(int nDecimals)
{
	m_nValueDecimals = nDecimals ;
	ReconstructControl() ;
}





void CMeter::DrawNode(CDC *pDC)
{
	CPen penDraw, *pPenOld;
	COLORREF cEdge, cMiddle, cNode;
	cMiddle = RGB(255, 255, 255);
	cEdge = RGB(0, 0, 0);
	for(int i=m_nCenterRadius*3/4; i>=0; i--)
	{
		cNode = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetRValue(cMiddle),
			(GetGValue(cEdge)-GetGValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetGValue(cMiddle),
			(GetBValue(cEdge)-GetBValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetBValue(cMiddle));
	
		penDraw.DeleteObject();
		penDraw.CreatePen(PS_SOLID, 1, cNode);
		pPenOld = pDC->SelectObject(&penDraw);
	//	pDC->Arc(m_ptMeterCenter.x-i, m_ptMeterCenter.y-i,m_ptMeterCenter.x+i,m_ptMeterCenter.y+i,
	//		m_ptMeterCenter.x-i,m_ptMeterCenter.y,m_ptMeterCenter.x-i,m_ptMeterCenter.y);
		pDC->SelectObject(pPenOld);
	}
}

void CMeter::SetColorTick(BOOL bColorTick)
{
	m_bColorTick = bColorTick;
	ReconstructControl();
}

void CMeter::DrawValue(CDC *pDC)
{
	int nHeight;
	CPoint pttemp;
	CString strtemp;
	CFont *pFontOld;

	//  数值显示
	nHeight = m_nRadiusFrame / 5;
	pttemp = m_rectValue.CenterPoint();
	strtemp.Format(_T("%.*lf"), m_nValueDecimals, m_dCurrentValue); 
	m_font.DeleteObject() ;
	m_font.CreateFont (nHeight, 0, 0, 0, 400,
						FALSE, FALSE, 0, ANSI_CHARSET,
						OUT_DEFAULT_PRECIS, 
						CLIP_DEFAULT_PRECIS,
						DEFAULT_QUALITY, 
						DEFAULT_PITCH|FF_SWISS, _T("Arial")) ;
	pFontOld = pDC->SelectObject(&m_font);
	pDC->SetBkColor(m_colorButton);

 	::SetTextAlign(pDC->m_hDC ,TA_TOP|TA_CENTER)  ; 
  	pDC->ExtTextOut(pttemp.x, pttemp.y,ETO_OPAQUE,NULL ,m_strUnits , NULL) ; 
	pDC->ExtTextOut(pttemp.x, pttemp.y+nHeight,ETO_OPAQUE,NULL ,strtemp , NULL) ; 
  	// 恢复字体和背景色
	pDC->SelectObject(pFontOld);
	pDC->SetBkColor(m_colorWindow);
	m_font.DeleteObject() ; 
	
}

void CMeter::SetTicks(int nTicks)
{
	m_nTicks = nTicks;
	ReconstructControl();
}

void CMeter::SetSubTicks(int nSubTicks)
{
	m_nSubTicks = nSubTicks;
	ReconstructControl();
}

void CMeter::SetAngleRange(int nStartAngleDeg, int nEndAngleDeg)
{
	m_nStartAngleDeg = nStartAngleDeg;
	m_nEndAngleDeg = nEndAngleDeg;
	ReconstructControl();
	
}

//设定报警上限
float CMeter::SetUpperValue(float fv)
{
 	fWarnupper = fv ; 
	return fWarnupper ; 

}
//设定报警下限
float CMeter::SetLowerValue(float fLower)
{
   fWarnlower = fLower ; 
   return fWarnlower ; 

}

//计算报警状态
void CMeter::CalStatus()
{
	if (m_dCurrentValue > fWarnupper || m_dCurrentValue < fWarnlower) 
	{	
		if (iStatus == 2)
		{
		   SetStatus(1) ;  //正常到报警
 		  SetNeedleColor(m_colorTable[2]) ; //进入报警

		}
	}else if ( iStatus == 1) //从报警进入正常
	{
	 	SetStatus(2) ;   
 		SetNeedleColor(m_colorTable[1]) ; //正常
	}

}

void CMeter::SetStatus(int istus)
{
	iStatus = istus ; 
}

int CMeter::GetControlStatus()
{
 	return iStatus ; 
}

CString CMeter::GetCurValue()
{
	CString strTmp ; 
	strTmp.Format(_T("%.1f") , m_dCurrentValue) ; 
	
	return strTmp ; 
	
}

CString CMeter::GetStrText()
{

	return m_strUnits ; 
	
}

void CMeter::SetDelayTime(float fv)
{
	fDelaytime = fv ; 

}

⌨️ 快捷键说明

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