2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)題目:稀土焙燒爐自動控制系統(tǒng)模擬軟件</p><p><b>  設(shè)計(jì)任務(wù):</b></p><p><b>  1.1設(shè)計(jì)目的</b></p><p>  (1) 了解稀土以及稀土焙燒爐自動控制系統(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>  稀土焙燒爐自動控制系統(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 號操作工要密切觀察爐內(nèi)情況,一旦發(fā)現(xiàn)焙燒爐的尾部有原料堆積的情況,就要</p><p>  及時通知 2 號操作工減少稀土礦石粉料,從而消除焙燒爐尾部原料堆積的情況。 </p><p>  用 C 語言或者 C++語言編寫一個程序,用形象化方式模擬上述稀土焙燒爐的控制系統(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>  生焙燒爐尾部原料堆積時, 能夠用聲音和圖形

7、的方式報(bào)警; 軟件要能允許用戶在規(guī)定范圍內(nèi)</p><p>  設(shè)定稀土礦石粉料的流量、 稀土礦石粉料和濃硫酸的流量比例以及稀土礦石粉料和濃硫酸的</p><p>  流量比例閾值等三個參數(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)行時先添加稀土礦石粉料流量和濃硫酸流量,然后點(diǎn)擊計(jì)算按鈕,會自動計(jì)算出稀土礦石粉料和濃硫酸流量的比例,然后設(shè)定稀土礦石粉料流量與濃硫酸流量比例的閾值,按全部設(shè)置成功按鈕,若超出閾值,會彈出對話框提想你

27、重新輸入,如果正確,則彈出流量設(shè)置成功對話框。</p><p>  設(shè)計(jì)過程中遇到的問題及解決辦法</p><p>  在剛開始拿到題的時候,沒有一點(diǎn)頭緒,但是,經(jīng)過這幾天在圖書館找資料,上網(wǎng)百度,慢慢地才對MFC有了一些了解,但是僅憑這些是遠(yuǎn)遠(yuǎn)不能完成這次的程序設(shè)計(jì),所以在剛開始的時候,我就慢慢的看課件,從最基本的畫矩形,畫圓開始,慢慢地練習(xí),最后終于能畫出成型了,但是動不了,然我我又找

28、資料,發(fā)現(xiàn)是用OnTimer()函數(shù)來實(shí)現(xiàn)的,經(jīng)過多次調(diào)試,終于完成了這次的課程設(shè)計(jì)。</p><p><b>  總結(jié)</b></p><p>  這次的課程設(shè)計(jì)對我個人來說其實(shí)還是比較難的,因?yàn)樵谝郧暗膶W(xué)習(xí)中從來沒有接觸過MFC,所以在這次課程設(shè)計(jì)中感覺壓力還挺大的。但是,通過我的努力,我覺得我學(xué)到了不少知識,學(xué)會了怎么用OnDraw()函數(shù),怎樣用MFC作圖。&

29、lt;/p><p>  通過這次的課程設(shè)計(jì),我覺得在平時對知識的總結(jié)和積累非常重要。不管學(xué)習(xí)哪門語言,都得學(xué)的精通,而且同時要掌握其他計(jì)算機(jī)語言,不能老師教什么就只學(xué)什么,這樣遠(yuǎn)遠(yuǎn)不夠。就像*老師給我們講的那樣,等工作了好多知識都得自學(xué),我們要時刻保持著不斷學(xué)習(xí)的心態(tài),這樣才能學(xué)的更好。而且,必須在平時的學(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>  // 臨時使用的顏色</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)號</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ì)算三角形底邊兩個點(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論