版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 課程名稱:程序設(shè)計(jì)實(shí)訓(xùn)</p><p> 設(shè)計(jì)題目:稀土焙燒爐自動(dòng)控制系統(tǒng)模擬軟件</p><p><b> 設(shè)計(jì)任務(wù):</b></p><p><b> 1.1設(shè)計(jì)目的</b></p><p> (1) 了解稀土以及稀土焙燒爐自動(dòng)控制系統(tǒng)的基本工作原理; </p
2、><p> (2) 進(jìn)一步學(xué)習(xí) C 語言或者 C++語言程序工程設(shè)計(jì)的方法以及程序調(diào)試技巧;</p><p> (3) 學(xué)習(xí)撰寫專業(yè)技術(shù)文檔。 </p><p><b> 1.2設(shè)計(jì)內(nèi)容</b></p><p> 稀土焙燒爐自動(dòng)控制系統(tǒng)模擬軟件設(shè)計(jì)</p><p> 稀土焙燒爐的控制要求是:
3、 </p><p> 1)要保證進(jìn)入焙燒爐的稀土礦石粉料和濃硫酸量控制在設(shè)定的比例。一般設(shè)定稀土礦</p><p> 石粉料和濃硫酸的比例為 1:1(重量比),并根據(jù)工藝要求可以適當(dāng)改變這一比例。 </p><p> 2)規(guī)定進(jìn)入焙燒爐的稀土礦石粉料流量調(diào)節(jié)范圍為每分鐘 0—10kg,一般設(shè)定稀土礦</p><p> 石粉料進(jìn)入焙燒爐
4、的流量為 5kg/min。 </p><p> 3)1 號(hào)操作工要密切觀察爐內(nèi)情況,一旦發(fā)現(xiàn)焙燒爐的尾部有原料堆積的情況,就要</p><p> 及時(shí)通知 2 號(hào)操作工減少稀土礦石粉料,從而消除焙燒爐尾部原料堆積的情況。 </p><p> 用 C 語言或者 C++語言編寫一個(gè)程序,用形象化方式模擬上述稀土焙燒爐的控制系統(tǒng)</p><p&g
5、t; 的工作過程。軟件要能用適當(dāng)?shù)姆绞斤@示出稀土礦石粉料和濃硫酸的流量以及它們的比例,</p><p> 當(dāng)發(fā)生稀土礦石粉料和濃硫酸的流量比例超出設(shè)定的閾值是,能夠用聲音和圖形的方式報(bào)警。</p><p> 1.3設(shè)計(jì)指標(biāo)或者要求</p><p> (1) 要求用 C 語言或者 C++語言編寫滿足設(shè)計(jì)內(nèi)容的程序,并調(diào)試正確; </p><
6、p> (2) 撰寫設(shè)計(jì)報(bào)告。 </p><p><b> 設(shè)計(jì)過程</b></p><p><b> 2.1程序功能</b></p><p> 軟件要能用適當(dāng)?shù)姆绞侥M焙燒爐的尾部有原料堆積的情況以及相應(yīng)的處理過程, 當(dāng)發(fā)</p><p> 生焙燒爐尾部原料堆積時(shí), 能夠用聲音和圖形
7、的方式報(bào)警; 軟件要能允許用戶在規(guī)定范圍內(nèi)</p><p> 設(shè)定稀土礦石粉料的流量、 稀土礦石粉料和濃硫酸的流量比例以及稀土礦石粉料和濃硫酸的</p><p> 流量比例閾值等三個(gè)參數(shù)。 </p><p><b> 2.2算法原理</b></p><p><b> 2.3程序流程圖</b>
8、</p><p> 2.4程序主要模塊或者函數(shù)</p><p> void CMeter::SetScaleDecimals(int nDecimals)</p><p><b> {</b></p><p> m_nScaleDecimals = nDecimals ;</p><p>
9、 ReconstructControl() ;</p><p><b> }</b></p><p> void CMeter::SetUnits(CString &strUnits)</p><p><b> {</b></p><p> m_strUnits = strUnit
10、s ;</p><p> ReconstructControl() ;</p><p><b> }</b></p><p> void CMeter::SetValueDecimals(int nDecimals)</p><p><b> {</b></p><p&g
11、t; m_nValueDecimals = nDecimals ;</p><p> ReconstructControl() ;</p><p><b> }</b></p><p> void CMeter::DrawNode(CDC *pDC)</p><p><b> {</b>&
12、lt;/p><p> CPen penDraw, *pPenOld;</p><p> COLORREF cEdge, cMiddle, cNode;</p><p> cMiddle = RGB(255, 255, 255);</p><p> cEdge = RGB(0, 0, 0);</p><p> fo
13、r(int i=m_nCenterRadius*3/4; i>=0; i--)</p><p><b> {</b></p><p> cNode = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetRValue(cMiddle),</p>
14、<p> (GetGValue(cEdge)-GetGValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetGValue(cMiddle),</p><p> (GetBValue(cEdge)-GetBValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetBValue(cMiddle));<
15、;/p><p> penDraw.DeleteObject();</p><p> penDraw.CreatePen(PS_SOLID, 1, cNode);</p><p> pPenOld = pDC->SelectObject(&penDraw);</p><p> pDC->Arc(m_ptMeterCent
16、er.x-i, m_ptMeterCenter.y-i,m_ptMeterCenter.x+i,m_ptMeterCenter.y+i,</p><p> m_ptMeterCenter.x-i,m_ptMeterCenter.y,m_ptMeterCenter.x-i,m_ptMeterCenter.y);</p><p> pDC->SelectObject(pPenOld)
17、;</p><p><b> }</b></p><p><b> }</b></p><p> void CMeter::DrawValue(CDC *pDC)</p><p><b> {</b></p><p> int nHeight;
18、</p><p> CPoint pttemp;</p><p> CString strtemp;</p><p> CFont *pFontOld;</p><p><b> // 數(shù)值顯示</b></p><p> nHeight = m_nRadiusFrame/5;</
19、p><p> pttemp = m_rectValue.CenterPoint();</p><p> strtemp.Format("%.*lf", m_nValueDecimals, m_dCurrentValue); </p><p> m_font.DeleteObject() ;</p><p> m_fon
20、t.CreateFont (nHeight, 0, 0, 0, 400,</p><p> FALSE, FALSE, 0, ANSI_CHARSET,</p><p> OUT_DEFAULT_PRECIS, </p><p> CLIP_DEFAULT_PRECIS,</p><p> DEFAULT_QUALITY, </
21、p><p> DEFAULT_PITCH|FF_SWISS, "Arial") ;</p><p> pFontOld = pDC->SelectObject(&m_font);</p><p> pDC->SetBkColor(m_colorButton);</p><p> pDC->Se
22、tTextAlign(TA_TOP|TA_CENTER);</p><p> pDC->TextOut(pttemp.x, pttemp.y, m_strUnits);</p><p> pDC->TextOut(pttemp.x, pttemp.y+nHeight, strtemp);</p><p> // 恢復(fù)字體和背景色</p>
23、<p> pDC->SelectObject(pFontOld);</p><p> pDC->SetBkColor(m_colorWindow);</p><p><b> }</b></p><p> void CMeter::SetSubTicks(int nSubTicks)</p>&l
24、t;p><b> {</b></p><p> m_nSubTicks = nSubTicks;</p><p> ReconstructControl();</p><p><b> }</b></p><p> void CMeter::SetAngleRange(int nSt
25、artAngleDeg, int nEndAngleDeg)</p><p><b> {</b></p><p> m_nStartAngleDeg = nStartAngleDeg;</p><p> m_nEndAngleDeg = nEndAngleDeg;</p><p> ReconstructCon
26、trol();</p><p> } </p><p> 軟件運(yùn)行或者測試結(jié)果</p><p> 在運(yùn)行時(shí)先添加稀土礦石粉料流量和濃硫酸流量,然后點(diǎn)擊計(jì)算按鈕,會(huì)自動(dòng)計(jì)算出稀土礦石粉料和濃硫酸流量的比例,然后設(shè)定稀土礦石粉料流量與濃硫酸流量比例的閾值,按全部設(shè)置成功按鈕,若超出閾值,會(huì)彈出對話框提想你
27、重新輸入,如果正確,則彈出流量設(shè)置成功對話框。</p><p> 設(shè)計(jì)過程中遇到的問題及解決辦法</p><p> 在剛開始拿到題的時(shí)候,沒有一點(diǎn)頭緒,但是,經(jīng)過這幾天在圖書館找資料,上網(wǎng)百度,慢慢地才對MFC有了一些了解,但是僅憑這些是遠(yuǎn)遠(yuǎn)不能完成這次的程序設(shè)計(jì),所以在剛開始的時(shí)候,我就慢慢的看課件,從最基本的畫矩形,畫圓開始,慢慢地練習(xí),最后終于能畫出成型了,但是動(dòng)不了,然我我又找
28、資料,發(fā)現(xiàn)是用OnTimer()函數(shù)來實(shí)現(xiàn)的,經(jīng)過多次調(diào)試,終于完成了這次的課程設(shè)計(jì)。</p><p><b> 總結(jié)</b></p><p> 這次的課程設(shè)計(jì)對我個(gè)人來說其實(shí)還是比較難的,因?yàn)樵谝郧暗膶W(xué)習(xí)中從來沒有接觸過MFC,所以在這次課程設(shè)計(jì)中感覺壓力還挺大的。但是,通過我的努力,我覺得我學(xué)到了不少知識(shí),學(xué)會(huì)了怎么用OnDraw()函數(shù),怎樣用MFC作圖。&
29、lt;/p><p> 通過這次的課程設(shè)計(jì),我覺得在平時(shí)對知識(shí)的總結(jié)和積累非常重要。不管學(xué)習(xí)哪門語言,都得學(xué)的精通,而且同時(shí)要掌握其他計(jì)算機(jī)語言,不能老師教什么就只學(xué)什么,這樣遠(yuǎn)遠(yuǎn)不夠。就像*老師給我們講的那樣,等工作了好多知識(shí)都得自學(xué),我們要時(shí)刻保持著不斷學(xué)習(xí)的心態(tài),這樣才能學(xué)的更好。而且,必須在平時(shí)的學(xué)習(xí)中養(yǎng)成獨(dú)立思考的習(xí)慣,不能一遇到問題就問別的同學(xué),這樣只能使自己的惰性越來越嚴(yán)重,無法真正領(lǐng)悟編程的重要性以及
30、在編程中應(yīng)該注意的問題。</p><p><b> 附錄(源代碼)</b></p><p> // Meter.cpp : implementation file</p><p> #include "stdafx.h"</p><p> #include "MyMeter.h&qu
31、ot;</p><p> #include "Meter.h"</p><p> #include "math.h"</p><p> #include "MemDC.h"</p><p> #ifdef _DEBUG</p><p> #defin
32、e new DEBUG_NEW</p><p> #undef THIS_FILE</p><p> static char THIS_FILE[] = __FILE__;</p><p><b> #endif</b></p><p> #define PT_NUM 50</p><p>
33、; /////////////////////////////////////////////////////////////////////</p><p><b> // CMeter</b></p><p> CMeter::CMeter()</p><p><b> {</b></p><
34、;p> m_nStartAngleDeg = 225;</p><p> m_nEndAngleDeg = 315;</p><p> m_nTicks = 10;</p><p> m_nSubTicks = 5;</p><p> m_dMaxValue = 100.0;</p><p> m_d
35、MinValue = 0.0;</p><p> m_dCurrentValue = 50.0;</p><p> m_nScaleDecimals = 0;</p><p> m_nValueDecimals = 1;</p><p> m_colorNeedle = RGB(255, 0, 0);</p><p
36、> m_strUnits = _T("粉料總流量計(jì)");</p><p> m_bColorTick = FALSE;</p><p><b> // 顏色表格</b></p><p> m_colorTable[0] = RGB(255, 255, 0);</p><p> m_
37、colorTable[1] = RGB( 0, 255, 0);</p><p> m_colorTable[2] = RGB(255, 0, 0);</p><p> m_colorTable[3] = RGB(255,183, 34);</p><p> m_colorTable[4] = RGB(255, 92, 93);</p>
38、;<p><b> }</b></p><p> CMeter::~CMeter()</p><p><b> {</b></p><p><b> }</b></p><p> BEGIN_MESSAGE_MAP(CMeter, CStatic)<
39、;/p><p> //{{AFX_MSG_MAP(CMeter)</p><p> ON_WM_PAINT()</p><p> ON_WM_SIZE()</p><p> //}}AFX_MSG_MAP</p><p> END_MESSAGE_MAP()</p><p> /////
40、////////////////////////////////////////////////////////////////// CMeter message handlers</p><p> void CMeter::OnPaint() </p><p><b> {</b></p><p> CPaintDC dc(this);
41、 // device context for painting</p><p><b> // 獲得控件區(qū)域</b></p><p> GetClientRect (&m_rectCtrl);</p><p> CMemDC memDC(&dc, &m_rectCtrl);</p><p>
42、 // 選取圓盤邊框半徑</p><p> m_nRadiusFrame = max(m_rectCtrl.Height(), m_rectCtrl.Width())*9/21;</p><p> // 獲得儀表盤中心點(diǎn)</p><p> m_ptMeterCenter = m_rectCtrl.CenterPoint();</p><p
43、> m_ptMeterCenter.y += m_nRadiusFrame/10;</p><p><b> //繪制儀表盤</b></p><p> if(m_dcBackground.GetSafeHdc()== NULL|| (m_bitmapBackground.m_hObject == NULL))</p><p><
44、;b> {</b></p><p> m_dcBackground.CreateCompatibleDC(&dc);</p><p> m_bitmapBackground.CreateCompatibleBitmap(&dc, m_rectCtrl.Width(), m_rectCtrl.Height())
45、 ;</p><p> m_pBitmapOldBackground = m_dcBackground.SelectObject(&m_bitmapBackground) ;</p><p> DrawMeterBackground(&m_dcBackground, m_rectCtrl);</p><p><b> }</b&
46、gt;</p><p> memDC.BitBlt(0, 0, m_rectCtrl.Width(), m_rectCtrl.Height(), </p><p> &m_dcBackground, 0, 0, SRCCOPY) ;</p><p><b> // 繪制指針</b></p><p> Dr
47、awNeedle(&memDC);</p><p> DrawNode(&memDC);</p><p> DrawValue(&memDC);</p><p> // Do not call CStatic::OnPaint() for painting messages</p><p><b>
48、}</b></p><p> void CMeter::DrawMeterBackground(CDC *pDC, CRect &rect)</p><p><b> {</b></p><p> int nInnerRadius = m_nRadiusFrame*8/10;// 內(nèi)圓弧半徑</p>&
49、lt;p> m_nCenterRadius = m_nRadiusFrame/20;// 中心園半徑大小</p><p> int nFrame = m_nRadiusFrame/18;// 邊框厚度</p><p> double dstepTickDeg = (360.0+m_nStartAngleDeg-m_nEndAngleDeg)/(m_nTicks*m_nS
50、ubTicks);// 刻度步進(jìn)角度</p><p> int nSubTickR = nInnerRadius+(m_nRadiusFrame-2*nFrame-nInnerRadius)/2;</p><p> double dDeg = (m_nStartAngleDeg+360.0-m_nEndAngleDeg)/(TABNUM*PT_NUM); </p>&
51、lt;p> CRect rectPanel,rectInnerPanel;</p><p> CPen penDraw, *pPenOld;</p><p> CFont *pFontOld;</p><p> CBrush brushFill, *pBrushOld;</p><p> POINT ptStart, ptEn
52、d, ptInnerStart, ptInnerEnd;</p><p> CPoint pointInner[BOUNDARY_POINTS], ptGroup1[PT_NUM*TABNUM+1], ptGroup2[PT_NUM*TABNUM+1];</p><p> CPoint ptRgn[PT_NUM*2+2];</p><p> CPoint p
53、ttemp;</p><p> CString strtemp;</p><p> double dRadPerDeg;</p><p> double dTickAngleRad;</p><p> double dTemp;</p><p> int nRef = 0;</p><p&
54、gt; int nTickAngle;</p><p> int nHeight;// 字體大小</p><p> double dtempangle;</p><p> // 計(jì)算起始角終止角弧度</p><p> dRadPerDeg = 4.0*atan(1.0)/180.0;</p><p>
55、m_dLeftAngleRad = (m_nStartAngleDeg-180.0)*dRadPerDeg;</p><p> m_dRightAngleRad = (m_nEndAngleDeg-360.0)*dRadPerDeg;</p><p> // 計(jì)算圓弧起始終止點(diǎn)及區(qū)域</p><p> ptStart.x = m_ptMeterCenter.x
56、-(int)(m_nRadiusFrame*cos(m_dLeftAngleRad));</p><p> ptStart.y = m_ptMeterCenter.y+(int)(m_nRadiusFrame*sin(m_dLeftAngleRad));</p><p> ptEnd.x = m_ptMeterCenter.x+(int)(m_nRadiusFrame*cos(-m_d
57、RightAngleRad));</p><p> ptEnd.y = m_ptMeterCenter.y+(int)(m_nRadiusFrame*sin(-m_dRightAngleRad));</p><p> rectPanel.SetRect(m_ptMeterCenter.x-m_nRadiusFrame, m_ptMeterCenter.y-m_nRadiusFrame,
58、</p><p> m_ptMeterCenter.x+m_nRadiusFrame, m_ptMeterCenter.y+m_nRadiusFrame);</p><p><b> // 獲取點(diǎn)的位置</b></p><p> for(int i=0; i<=PT_NUM*TABNUM; i++)</p><p
59、><b> {</b></p><p> ptGroup1[i].x = m_ptMeterCenter.x + (int)((m_nRadiusFrame-nFrame)*cos((m_nStartAngleDeg-i*dDeg)*dRadPerDeg));</p><p> ptGroup1[i].y = m_ptMeterCenter.y - (in
60、t)((m_nRadiusFrame-nFrame)*sin((m_nStartAngleDeg-i*dDeg)*dRadPerDeg));</p><p> ptGroup2[i].x = m_ptMeterCenter.x + (int)(m_nRadiusFrame*8*cos((m_nStartAngleDeg-i*dDeg)*dRadPerDeg)/10);</p><p>
61、 ptGroup2[i].y = m_ptMeterCenter.y - (int)(m_nRadiusFrame*8*sin((m_nStartAngleDeg-i*dDeg)*dRadPerDeg)/10);</p><p><b> }</b></p><p> // 獲取系統(tǒng)顏色;</p><p> m_colorWindow
62、 = GetSysColor(COLOR_WINDOW);</p><p> m_colorButton = GetSysColor(COLOR_BTNFACE);</p><p> m_colorShadow = GetSysColor(COLOR_BTNSHADOW);</p><p> m_colorHighlight = GetSysCo
63、lor(COLOR_BTNHIGHLIGHT);</p><p> m_colorText= GetSysColor(COLOR_BTNTEXT);</p><p> // 臨時(shí)使用的顏色</p><p> COLORREF colorCaption, cEdge, cMiddle;</p><p> cMiddle = RGB(
64、255, 255, 255);</p><p> cEdge = RGB(96, 96, 255);</p><p> // 用按鈕色繪制背景</p><p> brushFill.DeleteObject();</p><p> brushFill.CreateSolidBrush(m_colorButton);</p>
65、<p> pBrushOld = pDC->SelectObject(&brushFill);</p><p> pDC->Rectangle(rect);</p><p> pDC->SelectObject(pBrushOld);</p><p><b> // 繪制圓盤邊框</b></
66、p><p> for(int iOnBand=nFrame; iOnBand>0; iOnBand--)</p><p><b> {</b></p><p> penDraw.DeleteObject();</p><p> colorCaption = RGB((GetRValue(cEdge)-GetRV
67、alue(cMiddle))*((float)iOnBand)/nFrame+GetRValue(cMiddle),</p><p> (GetGValue(cEdge)-GetGValue(cMiddle))*((float)iOnBand)/nFrame+GetGValue(cMiddle),</p><p> (GetBValue(cEdge)-GetBValue(cMiddle
68、))*((float)iOnBand)/nFrame+GetBValue(cMiddle));</p><p> penDraw.CreatePen(PS_SOLID, iOnBand*2, colorCaption);</p><p> pPenOld = pDC->SelectObject(&penDraw);</p><p> pDC-&g
69、t;Arc(&rectPanel, ptEnd, ptStart);</p><p> pDC->SelectObject(pPenOld);</p><p><b> }</b></p><p><b> // 繪制內(nèi)圈</b></p><p> ptInnerStart.
70、x = m_ptMeterCenter.x-(int)(nInnerRadius*cos(m_dLeftAngleRad));</p><p> ptInnerStart.y = m_ptMeterCenter.y+(int)(nInnerRadius*sin(m_dLeftAngleRad));</p><p> ptInnerEnd.x = m_ptMeterCenter.x+(i
71、nt)(nInnerRadius*cos(-m_dRightAngleRad));</p><p> ptInnerEnd.y = m_ptMeterCenter.y+(int)(nInnerRadius*sin(-m_dRightAngleRad));</p><p> rectInnerPanel.SetRect(m_ptMeterCenter.x-nInnerRadius, m_
72、ptMeterCenter.y-nInnerRadius,</p><p> m_ptMeterCenter.x+nInnerRadius ,m_ptMeterCenter.y+nInnerRadius);</p><p> penDraw.DeleteObject();</p><p> penDraw.CreatePen(PS_SOLID, 1, RGB(
73、255,255,0));</p><p> pPenOld = pDC->SelectObject(&penDraw);</p><p> pDC->Arc(&rectInnerPanel, ptInnerEnd, ptInnerStart);</p><p> pDC->SelectObject(pPenOld);<
74、/p><p> if(m_bColorTick)</p><p><b> {</b></p><p><b> // 繪制色彩刻度</b></p><p> for(i=0; i<TABNUM; i++)</p><p><b> {</b>
75、;</p><p><b> //確定區(qū)域</b></p><p> for(int j=0; j<=PT_NUM; j++)</p><p><b> {</b></p><p> ptRgn[j] = ptGroup1[i*PT_NUM+j];</p><p&g
76、t; ptRgn[2*PT_NUM+1-j] = ptGroup2[i*PT_NUM+j];</p><p><b> }</b></p><p> brushFill.DeleteObject();</p><p> brushFill.CreateSolidBrush(m_colorTable[i]);</p><
77、;p> pBrushOld = pDC->SelectObject(&brushFill);</p><p> penDraw.DeleteObject();</p><p> penDraw.CreatePen(PS_SOLID, 1, m_colorTable[i]);</p><p> pPenOld = pDC->Selec
78、tObject(&penDraw);</p><p> pDC->Polygon(ptRgn, 2*PT_NUM+2);</p><p> pDC->SelectObject(pBrushOld);</p><p> pDC->SelectObject(pPenOld);</p><p><b>
79、}</b></p><p><b> }</b></p><p> // 計(jì)算刻度點(diǎn),避免不能整除引起較大誤差*100</p><p> for(nTickAngle=m_nStartAngleDeg*100; nTickAngle>=(m_nEndAngleDeg-360)*100; nTickAngle-=(int)
80、(dstepTickDeg*100))</p><p><b> {</b></p><p><b> // 轉(zhuǎn)換成弧度</b></p><p> dTickAngleRad = (double)nTickAngle/100*dRadPerDeg;</p><p><b> //
81、 確定外圈坐標(biāo)</b></p><p><b> // 確定x坐標(biāo)</b></p><p> dTemp = m_ptMeterCenter.x + (m_nRadiusFrame-2*nFrame)*cos(dTickAngleRad);</p><p> m_pointBoundary[nRef].x = ROUND(dT
82、emp);</p><p><b> // 確定y坐標(biāo)</b></p><p> dTemp = m_ptMeterCenter.y - (m_nRadiusFrame-2*nFrame)*sin(dTickAngleRad);</p><p> m_pointBoundary[nRef].y = ROUND(dTemp);</p&
83、gt;<p> // 確定刻度點(diǎn)(主刻度和子刻度)</p><p> //主刻度及文本標(biāo)注點(diǎn)</p><p> if(nRef%m_nSubTicks == 0)</p><p><b> {</b></p><p> dTemp = m_ptMeterCenter.x + nInnerRadiu
84、s*cos(dTickAngleRad);</p><p> pointInner[nRef].x = ROUND(dTemp);</p><p> dTemp = m_ptMeterCenter.y - nInnerRadius*sin(dTickAngleRad);</p><p> pointInner[nRef].y = ROUND(dTemp);&l
85、t;/p><p><b> }</b></p><p><b> // 子刻度</b></p><p><b> else</b></p><p><b> {</b></p><p> dTemp = m_ptMeterCe
86、nter.x + nSubTickR*cos(dTickAngleRad);</p><p> pointInner[nRef].x = ROUND(dTemp);</p><p> dTemp = m_ptMeterCenter.y - nSubTickR*sin(dTickAngleRad);</p><p> pointInner[nRef].y = R
87、OUND(dTemp);</p><p><b> }</b></p><p><b> nRef++ ;</b></p><p><b> }</b></p><p><b> // 多邊形區(qū)域</b></p><p>
88、 m_rgnBoundary.DeleteObject() ;</p><p> m_rgnBoundary.CreatePolygonRgn(m_pointBoundary, nRef, ALTERNATE);</p><p> m_rectValue.top = m_ptMeterCenter.y + m_nRadiusFrame/5;</p><p>
89、m_rectValue.bottom = m_ptMeterCenter.y + m_nRadiusFrame/2;</p><p> m_rectValue.left = m_ptMeterCenter.x - m_nRadiusFrame/2;</p><p> m_rectValue.right = m_ptMeterCenter.x + m_nRadiusFrame/2;<
90、;/p><p><b> // 繪制刻度</b></p><p> penDraw.DeleteObject();</p><p> penDraw.CreatePen(PS_SOLID, 1, RGB(0,0,0));</p><p> pPenOld = pDC->SelectObject(&pen
91、Draw);</p><p> for(i=0; i<nRef; i++)</p><p><b> {</b></p><p> pDC->MoveTo(m_pointBoundary[i]);</p><p> pDC->LineTo(pointInner[i]);</p>&
92、lt;p><b> }</b></p><p> pDC->SelectObject(pPenOld);</p><p><b> // 刻度標(biāo)號(hào)</b></p><p><b> // 確定字體大小</b></p><p> nHeight = m_n
93、RadiusFrame/6;</p><p> m_font.CreateFont(nHeight, 0, 0, 0, 400, </p><p> FALSE, FALSE, 0, ANSI_CHARSET,</p><p> OUT_DEFAULT_PRECIS, </p><p> CLIP_DEFAULT_PRECIS,<
94、;/p><p> DEFAULT_QUALITY, </p><p> DEFAULT_PITCH|FF_SWISS, "Arial");</p><p> pFontOld = pDC->SelectObject(&m_font);</p><p> pDC->SetBkMode(TRANSPAR
95、ENT);</p><p> for(i=0; i<=m_nTicks; i++)</p><p><b> {</b></p><p> dtempangle = m_nStartAngleDeg-i*m_nSubTicks*dstepTickDeg;</p><p> strtemp.Format(&
96、quot;%.*lf", m_nScaleDecimals, (m_dMinValue+(m_dMaxValue-m_dMinValue)*i/m_nTicks));</p><p> if(dtempangle>190)</p><p><b> {</b></p><p> pDC->SetTextAlign(T
97、A_BOTTOM|TA_LEFT);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);</p><p><b> }</b></p><p> else if(dtempangle&g
98、t;170)</p><p><b> {</b></p><p> pDC->SetTextAlign(TA_BASELINE|TA_LEFT);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/3,
99、 strtemp);</p><p><b> }</b></p><p> else if(dtempangle>135)</p><p><b> {</b></p><p> pDC->SetTextAlign(TA_BASELINE|TA_LEFT);</p>
100、<p> pDC->TextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2, strtemp);</p><p><b> }</b></p><p> else if(dtempangle>100)</p><p>&
101、lt;b> {</b></p><p> pDC->SetTextAlign(TA_TOP|TA_LEFT);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x-nHeight/4, pointInner[m_nSubTicks*i].y-nHeight/8, strtemp);</p>&
102、lt;p><b> }</b></p><p> else if(dtempangle>80)</p><p><b> {</b></p><p> pDC->SetTextAlign(TA_TOP|TA_CENTER);</p><p> pDC->TextOu
103、t(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y, strtemp);</p><p><b> }</b></p><p> else if(dtempangle>45)</p><p><b> {</b></p><p
104、> pDC->SetTextAlign(TA_BOTTOM|TA_RIGHT);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x+nHeight/3, pointInner[m_nSubTicks*i].y+nHeight, strtemp);</p><p><b> }</b></p
105、><p> else if(dtempangle>10)</p><p><b> {</b></p><p> pDC->SetTextAlign(TA_RIGHT|TA_BASELINE);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x, p
106、ointInner[m_nSubTicks*i].y+nHeight/2, strtemp);</p><p><b> }</b></p><p> else if(dtempangle>-10)</p><p><b> {</b></p><p> pDC->SetText
107、Align(TA_RIGHT|TA_BASELINE);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/3, strtemp);</p><p><b> }</b></p><p><b> e
108、lse </b></p><p><b> {</b></p><p> pDC->SetTextAlign(TA_RIGHT|TA_BOTTOM);</p><p> pDC->TextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHe
109、ight/2, strtemp);</p><p><b> }</b></p><p><b> }</b></p><p> pDC->SelectObject(pFontOld);</p><p><b> }</b></p><p>
110、; void CMeter::ReconstructControl()</p><p><b> {</b></p><p> if ((m_pBitmapOldBackground) && </p><p> (m_bitmapBackground.GetSafeHandle()) && </p&
111、gt;<p> (m_dcBackground.GetSafeHdc()))</p><p><b> {</b></p><p> m_dcBackground.SelectObject(m_pBitmapOldBackground);</p><p> m_dcBackground.DeleteDC() ;</p
112、><p> m_bitmapBackground.DeleteObject();</p><p><b> }</b></p><p> Invalidate ();</p><p><b> }</b></p><p> void CMeter::OnSize(UIN
113、T nType, int cx, int cy) </p><p><b> {</b></p><p> CStatic::OnSize(nType, cx, cy);</p><p> // TODO: Add your message handler code here</p><p> Reconstru
114、ctControl() ;</p><p><b> }</b></p><p> void CMeter::DrawNeedle(CDC *pDC)</p><p><b> {</b></p><p> int nResult;</p><p> double
115、dRadPerDeg = 4.0*atan(1.0)/180.0;</p><p> double dAngleDeg;</p><p> double dAngleRad ;</p><p> double dTemp ;</p><p> CBrush brushFill, *pBrushOld ;</p><
116、p> CPen penDraw, *pPenOld ;</p><p> CPoint pointNeedle[4] ;// 指針由四邊形組成</p><p> // 計(jì)算角度并限定指針走的角度</p><p> dAngleDeg = m_nStartAngleDeg-(360.0+m_nStartAngleDeg-m_nEndAngleDeg)&
117、lt;/p><p> *(m_dCurrentValue-m_dMinValue)/(m_dMaxValue-m_dMinValue);</p><p> dAngleDeg = min(dAngleDeg, m_nStartAngleDeg);</p><p> dAngleDeg = max(dAngleDeg, m_nEndAngleDeg-360.0);&
118、lt;/p><p> dAngleRad = dAngleDeg*dRadPerDeg;</p><p> // 計(jì)算三角形底邊兩個(gè)點(diǎn)</p><p> pointNeedle[0].x = m_ptMeterCenter.x - (int)(m_nCenterRadius*10*sin(dAngleRad)/8);</p><p> p
119、ointNeedle[0].y = m_ptMeterCenter.y - (int)(m_nCenterRadius*10*cos(dAngleRad)/8);</p><p> pointNeedle[2].x = m_ptMeterCenter.x + (int)(m_nCenterRadius*10*sin(dAngleRad)/8);</p><p> pointNeedle
120、[2].y = m_ptMeterCenter.y + (int)(m_nCenterRadius*10*cos(dAngleRad)/8);</p><p> // 計(jì)算指針頂部坐標(biāo)</p><p> dTemp = m_ptMeterCenter.x + m_nRadiusFrame*cos(dAngleRad)*95/100;</p><p> poin
121、tNeedle[1].x = ROUND(dTemp);</p><p> dTemp = m_ptMeterCenter.y - m_nRadiusFrame*sin(dAngleRad)*95/100;</p><p> pointNeedle[1].y = ROUND(dTemp);</p><p> // 計(jì)算指針尾部坐標(biāo)</p><
122、;p> dTemp = m_ptMeterCenter.x - m_nRadiusFrame*cos(dAngleRad)/6;</p><p> pointNeedle[3].x = ROUND(dTemp);</p><p> dTemp = m_ptMeterCenter.y + m_nRadiusFrame*sin(dAngleRad)/6;</p>&l
123、t;p> pointNeedle[3].y = ROUND(dTemp);</p><p> pDC->SelectClipRgn(&m_rgnBoundary);</p><p> brushFill.CreateSolidBrush(m_colorNeedle);</p><p> penDraw.CreatePen(PS_SOLID
124、, 1, m_colorNeedle);</p><p> pPenOld = pDC->SelectObject(&penDraw) ;</p><p> pBrushOld = pDC->SelectObject(&brushFill) ;</p><p><b> // 繪制指針</b></p>
125、;<p> pDC->Polygon(pointNeedle, 4);</p><p> nResult = pDC->SelectClipRgn(NULL);</p><p> pDC->SelectObject(pPenOld);</p><p> pDC->SelectObject(pBrushOld);</
126、p><p><b> // 立體感處理</b></p><p> if(dAngleDeg>90)</p><p><b> {</b></p><p> penDraw.DeleteObject();</p><p> penDraw.CreatePen(PS_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 自動(dòng)控制系統(tǒng)課程設(shè)計(jì)
- 稀土萃取過程自動(dòng)控制系統(tǒng).pdf
- 自動(dòng)控制課程設(shè)計(jì)--基于matlab軟件的自動(dòng)控制系統(tǒng)仿真
- 自動(dòng)控制課程設(shè)計(jì)-- 自動(dòng)控制系統(tǒng)的校正
- 自動(dòng)控制原理課程設(shè)計(jì)--基于matlab軟件的自動(dòng)控制系統(tǒng)仿真
- 04023自動(dòng)控制系統(tǒng)課程設(shè)計(jì)安排
- 電力拖動(dòng)自動(dòng)控制系統(tǒng)課程設(shè)計(jì)
- 04023自動(dòng)控制系統(tǒng)課程設(shè)計(jì)安排
- 電力拖動(dòng)自動(dòng)控制系統(tǒng)課程設(shè)計(jì)
- 04023自動(dòng)控制系統(tǒng)課程設(shè)計(jì)安排
- 電力拖動(dòng)自動(dòng)控制系統(tǒng)課程設(shè)計(jì)(3)
- 運(yùn)動(dòng)控制課程設(shè)計(jì)--電力拖動(dòng)自動(dòng)控制系統(tǒng)
- 自動(dòng)控制課程設(shè)計(jì)--自動(dòng)控制系統(tǒng)建模、分析及校正
- 課程設(shè)計(jì)--變頻液位自動(dòng)控制系統(tǒng)
- 四層電梯自動(dòng)控制系統(tǒng)課程設(shè)計(jì)報(bào)告
- 稀土尾氣過濾載體浸湯泡過程自動(dòng)控制系統(tǒng)設(shè)計(jì).pdf
- led調(diào)光燈亮度自動(dòng)控制系統(tǒng)課程設(shè)計(jì)
- 電氣控制課程設(shè)計(jì)--- 攪動(dòng)泵自動(dòng)控制系統(tǒng)
- 四層電梯自動(dòng)控制系統(tǒng) 課程設(shè)計(jì)報(bào)告
- 基于dsp的自動(dòng)控制系統(tǒng)課程設(shè)計(jì)報(bào)告
評論
0/150
提交評論