?? wymeterctl.cpp
字號:
// 計算 Y 坐標
dTemp = m_nBottomCY - m_nTopRadius*sin(dAngleRad) ;
m_pointBoundary[nRef].y = ROUND(dTemp) ;
nRef++ ;
}
nHalfPoints = nRef ;
// 增加低邊弧上的點
for (nAngleDeg=nEndAngleDeg; nAngleDeg>=nStartAngleDeg; nAngleDeg-=nAngleIncrementDeg)
{
dAngleRad = nAngleDeg*dRadPerDeg ;
dTemp = m_nBottomCX + m_nBottomRadius*cos(dAngleRad) ;
m_pointBoundary[nRef].x = ROUND(dTemp) ;
dTemp = m_nBottomCY - m_nBottomRadius*sin(dAngleRad) ;
m_pointBoundary[nRef].y = ROUND(dTemp) ;
nRef++ ;
}
// 構造儀表表面多邊形
for (i=0; i<nRef; i++)
{
pointRecess[i].x = m_pointBoundary[i].x ;
pointRecess[i].y = m_pointBoundary[i].y-1 ;
}
pointRecess[0].x = pointRecess[0].x + 1 ;
pointRecess[nRef-1].x = pointRecess[nRef-1].x - 1 ;
for (i=nHalfPoints; i<nRef; i++)
{
pointRecess[i].x = m_pointBoundary[i].x ;
pointRecess[i].y = m_pointBoundary[i].y+1 ;
}
pointRecess[nHalfPoints].x = pointRecess[nHalfPoints].x - 1 ;
pointRecess[nRef-1].x = pointRecess[nRef-1].x + 1 ;
// 建立儀表表面區域
m_rgnBoundary.DeleteObject() ;
m_rgnBoundary.CreatePolygonRgn(m_pointBoundary, nRef, ALTERNATE) ;
// 定位數值輸出矩形
m_rectValue.left = rect.left + 5 ;
m_rectValue.right = rect.right - 3*rect.Width()/5 ;
m_rectValue.bottom = rect.bottom - 8*rect.Height()/11 ;
m_rectValue.top = rect.top +5;
// 獲取有關系統顏色
m_colorWindow = GetSysColor(COLOR_WINDOW) ;
m_colorButton = GetSysColor(COLOR_BTNFACE) ;
m_colorShadow = GetSysColor(COLOR_BTNSHADOW) ;
m_colorHighlight = GetSysColor(COLOR_BTNHIGHLIGHT) ;
m_colorText = GetSysColor(COLOR_BTNTEXT) ;
// 用按鈕色填充背景
brushFill.DeleteObject() ;
brushFill.CreateSolidBrush(m_colorButton) ;
pBrushOld = pDC->SelectObject(&brushFill) ;
pDC->Rectangle(rect) ;
pDC->SelectObject(pBrushOld) ;
// 繪制儀表凹面.
penDraw.DeleteObject() ;
penDraw.CreatePen(PS_SOLID, 1, m_colorShadow) ;
pPenOld = pDC->SelectObject(&penDraw) ;
pDC->MoveTo(pointRecess[0]) ;
pDC->PolylineTo(pointRecess, nHalfPoints+1) ;
pDC->SelectObject(pPenOld) ;
// 繪制儀表凹面陰影.
penDraw.DeleteObject() ;
penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight) ;
pPenOld = pDC->SelectObject(&penDraw) ;
// 繪制低邊弧
pDC->PolylineTo(&pointRecess[nHalfPoints], nHalfPoints) ;
pDC->LineTo(pointRecess[0]) ; // connect it to the top
pDC->SelectObject(pPenOld) ;
// 繪制儀表表面
// 使用文本顏色繪制邊框
penDraw.DeleteObject() ;
penDraw.CreatePen(PS_SOLID, 1, m_colorText) ;
pPenOld = pDC->SelectObject(&penDraw) ;
// 使用窗口顏色填充
brushFill.DeleteObject() ;
brushFill.CreateSolidBrush(m_colorWindow) ;
pBrushOld = pDC->SelectObject(&brushFill) ;
// 繪制表面
pDC->Polygon(m_pointBoundary, nRef) ;
// 恢復刷子
pDC->SelectObject(pBrushOld) ;
// 繪制刻度記號.
// 刻度長度比高邊下降15%
dTemp = m_nTopRadius - 0.15*(m_nTopRadius-m_nBottomRadius) ;
for (nAngleDeg=90; nAngleDeg>nStartAngleDeg; nAngleDeg-=nTickDeg)
{
dAngleRad = nAngleDeg*dRadPerDeg ;
dX = m_nBottomCX + m_nTopRadius*cos(dAngleRad) ;
dY = m_nBottomCY - m_nTopRadius*sin(dAngleRad) ;
pDC->MoveTo(ROUND(dX), ROUND(dY)) ;
dX = m_nBottomCX + dTemp*cos(dAngleRad) ;
dY = m_nBottomCY - dTemp*sin(dAngleRad) ;
pDC->LineTo(ROUND(dX), ROUND(dY)) ;
}
for (nAngleDeg=90+nTickDeg; nAngleDeg<nEndAngleDeg; nAngleDeg+=nTickDeg)
{
dAngleRad = nAngleDeg*dRadPerDeg ;
dX = m_nBottomCX + m_nTopRadius*cos(dAngleRad) ;
dY = m_nBottomCY - m_nTopRadius*sin(dAngleRad) ;
pDC->MoveTo(ROUND(dX), ROUND(dY)) ;
dX = m_nBottomCX + dTemp*cos(dAngleRad) ;
dY = m_nBottomCY - dTemp*sin(dAngleRad) ;
pDC->LineTo(ROUND(dX), ROUND(dY)) ;
}
// 恢復畫筆
pDC->SelectObject(pPenOld) ;
// 繪制數值顯示矩形
penDraw.DeleteObject() ;
penDraw.CreatePen(PS_SOLID, 1, m_colorShadow) ;
pPenOld = pDC->SelectObject(&penDraw) ;
pDC->MoveTo(m_rectValue.left, m_rectValue.bottom) ;
pDC->LineTo(m_rectValue.left, m_rectValue.top) ;
pDC->LineTo(m_rectValue.right, m_rectValue.top) ;
pDC->SelectObject(pPenOld) ;
penDraw.DeleteObject() ;
penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight) ;
pPenOld = pDC->SelectObject(&penDraw) ;
pDC->LineTo(m_rectValue.right, m_rectValue.bottom) ;
pDC->LineTo(m_rectValue.left, m_rectValue.bottom) ;
pDC->SelectObject(pPenOld) ;
// 計算字體大小
nHeight = m_rectValue.Height()*85/100 ;
m_fontValue.DeleteObject() ;
m_fontValue.CreateFont (nHeight, 0, 0, 0, 400,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, "Arial") ;
pFontOld = pDC->SelectObject(&m_fontValue) ;
pDC->GetTextMetrics(&tm) ;
m_nValueFontHeight = tm.tmHeight ;
m_nValueFontWidth = tm.tmAveCharWidth ;
m_nValueBaseline = m_rectValue.bottom - m_nValueFontHeight/4 ;
m_nValueCenter = m_rectValue.left + m_rectValue.Width()/2 ;
// 輸出數值
pDC->SetTextColor(m_colorText) ;
pDC->SetBkColor(m_colorButton) ;
// 輸出單位
pDC->SetTextAlign(TA_CENTER|TA_BASELINE) ;
pDC->TextOut(rect.right - 2*m_nValueFontWidth,
rect.bottom - m_nValueFontHeight/2,
m_strUnits) ;
// 輸出最小值
pDC->SetTextAlign(TA_LEFT|TA_BASELINE) ;
strTemp.Format("%.*lf", m_nScaleDecimals, m_dMinValue) ;
pDC->TextOut(rect.left+1,rect.bottom-5,strTemp) ;
// 輸出最大值
pDC->SetTextAlign(TA_RIGHT|TA_BASELINE) ;
strTemp.Format("%.*lf", m_nScaleDecimals, m_dMaxValue) ;
pDC->TextOut((rect.right+m_pointBoundary[0].x)/2,
rect.top+m_nValueFontHeight-3,
strTemp) ;
// 恢復字體和文字背景色
pDC->SelectObject(pFontOld) ;
pDC->SetBkColor(m_colorWindow) ;
}
//重繪指針
void CwyMeterCtrl::UpdateNeedle(double dValue)
{
m_dCurrentValue = dValue ;
InvalidateControl() ;
}
// 消息處理
void CwyMeterCtrl::OnDMaxValueChanged() //最大值改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnDMinValueChanged() //最小值改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnDCurrentValueChanged() //當前值改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnNScaleDecimalsChanged() //標尺精度改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnNValueDecimalsChanged() //數值精度改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnColorNeedleChanged() //指針顏色改變
{
InvalidateControl();
SetModifiedFlag();
}
void CwyMeterCtrl::OnStrUnitsChanged() //數值單位改變
{
InvalidateControl();
SetModifiedFlag();
}
//串行化
void CwyMeterCtrl::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // 保存
ar << m_strUnits;
ar << m_dMaxValue;
ar << m_dMinValue;
ar << m_nScaleDecimals;
ar << m_nValueDecimals;
ar << m_colorNeedle;
}
else
{ // 讀取
ar >> m_strUnits;
ar >> m_dMaxValue;
ar >> m_dMinValue;
ar >> m_nScaleDecimals;
ar >> m_nValueDecimals;
ar >> m_colorNeedle;
m_dCurrentValue=0.0;
}
}
//建立窗口時設置定時器
int CwyMeterCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
SetTimer (1, 1000, NULL) ;
return 0;
}
//關閉窗口時刪除定時器
void CwyMeterCtrl::OnDestroy()
{
COleControl::OnDestroy();
KillTimer (1) ;
}
//定時消息處理,用于測試
void CwyMeterCtrl::OnTimer(UINT nIDEvent)
{
//return;
static double dStep = 1.5 ;
static double dValue = 0.0 ;
dValue += dStep ;
if (dValue > m_dMaxValue)
{
dStep = -fabs(dStep) ;
dValue = m_dMaxValue-dStep ;
}
else if (dValue < m_dMinValue)
{
dStep = fabs(dStep) ;
dValue = m_dMinValue+dStep ;
}
UpdateNeedle(dValue) ;
COleControl::OnTimer(nIDEvent);
}
//設定當前值
void CwyMeterCtrl::SetCurrentValue(double val)
{
UpdateNeedle(val) ;//重繪指針
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -