• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            milkyway的窩

            最初想法的誕生地

             

            Windows CE5.0下繪制實(shí)時(shí)數(shù)據(jù)曲線

                     繪制思路:做一個(gè)自定義控件插入界面中
                具體步驟:
                (1)橫軸劃分為若干點(diǎn),使用Moveto+Lineto連線,定時(shí)刷新實(shí)現(xiàn)動(dòng)態(tài)效果;
                 (2)在程序中,使用CPaintDC,CClientDc,CDC,CBitMap,CBrush等繪圖類;
                  (3)繪圖程序分為幾大部分:注冊(cè)類句柄、刷新機(jī)制、設(shè)定坐標(biāo)系、繪圖;

            部分代碼如下:

            BOOL CLineChartCtrl::RegisterWndClass(HINSTANCE hInstance)
            {
             WNDCLASSW wc;
             wc.lpszClassName = TEXT("LineChartCtrl"); // matches class name in client
             。。。
             return (::RegisterClass(&wc) != 0 );  }

            void CLineChartCtrl::InvalidateCtrl()
            {
             CClientDC dc(this);
             CRect rcClient;
             GetClientRect(rcClient);

             if (m_MemDC.GetSafeHdc() == NULL)
             {
              m_MemDC.CreateCompatibleDC(&dc);
              m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
              m_MemDC.SelectObject(m_Bitmap);
                 m_MemDC.SetBkColor(RGB(255,255,255));              //靜態(tài)背景色
              CBrush bkBrush(RGB(160,160,160));
              m_MemDC.FillRect(rcClient,&bkBrush);
             }
            InvalidateRect(rcClient, FALSE);
            }

            float CLineChartCtrl::SetPos(int nIndex, float nPos)
            {
             。。。}

            void CLineChartCtrl::OnPaint()
            {
             CPaintDC dc(this); // device context for painting
             
             CRect rcClient;
             GetClientRect(rcClient);

             // draw scale
             if (m_MemDC.GetSafeHdc() != NULL)
              dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY);
            }

            void CLineChartCtrl::DrawSpike()
            {
             CRect rcClient;
             GetClientRect(rcClient);

             if (m_MemDC.GetSafeHdc() != NULL)             //豎線間隔寬度
             {
              m_MemDC.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 20, 0, SRCCOPY);

              // draw scale
              CRect rcRight = rcClient;
              rcRight.left = rcRight.right - 20;
                 m_MemDC.SetBkColor(RGB(255,255,255));                       //運(yùn)行時(shí)背景色

             CBrush bkBrush(RGB(160,160,160));                  
             m_MemDC.FillRect(rcRight,&bkBrush);

                static BOOL bDrawVerticle = FALSE;
              bDrawVerticle = !bDrawVerticle;
              if (bDrawVerticle)
              {
                  CPen pen(PS_SOLID, 1, RGB(128,128,128));                      //縱軸色
               CPen* pOldPen = m_MemDC.SelectObject(&pen);
               m_MemDC.MoveTo(CPoint(rcClient.right-2, rcClient.top));
               m_MemDC.LineTo(CPoint(rcClient.right-2, rcClient.bottom));
               m_MemDC.SelectObject(pOldPen);
              }

              int nCount = m_items.GetSize();
              CLineChartItem* pItem;
              CPoint ptOld, ptNew;
              for (int i=0; i<nCount; i++)
              {
               pItem = m_items.GetAt(i);

               float  nRange = pItem->m_nUpper - pItem->m_nLower;
               ptOld.x = rcRight.left-1;                            // Minus one to make sure to draw inside the area
               ptNew.x = rcRight.right-1;
               ptOld.y = (int)((((float)(nRange - pItem->m_nOldPos))/(float)nRange)
                * (float)rcRight.Height());
               ptNew.y = (int)((((float)(nRange - pItem->m_nPos))/(float)nRange)
                * (float)rcRight.Height());

               CPen pen(PS_SOLID, 1, pItem->m_colorLine);
               CPen* pOldPen = m_MemDC.SelectObject(&pen);
               m_MemDC.MoveTo(ptOld);
               m_MemDC.LineTo(ptNew);
               m_MemDC.SelectObject(pOldPen);
              }
             }
            }

            BOOL CLineChartCtrl::Add(COLORREF color, float Upper, float Lower)
            {
             CLineChartItem* pItem = new CLineChartItem;
             pItem->m_colorLine = color;
             pItem->m_nLower = Lower;
             pItem->m_nUpper = Upper;
             pItem->m_nPos = 0;
             pItem->m_nOldPos = 0;

             try
             {
              m_items.Add(pItem);

              InvalidateCtrl();
              return TRUE;
             }
             
              
             catch (CMemoryException* e)
             {
              if (pItem !=NULL)
               delete pItem;
              e->Delete();
              return FALSE;
             } 

            }

            void CLineChartCtrl::Go()
            {
             DrawSpike();

             Invalidate(FALSE);
            }

               注意的幾點(diǎn):(1) Windows CE采用unicode,必須寫諸如WNDCLASSW;LoadCursorW;
                                       (2) EVC下的CBrush不能使用兩個(gè)參數(shù)如CBrush(HS_Cross,RGB(0,0,0));
                                       (3)改動(dòng)stdAfx.h包含的頭文件;
                                       (4)在void CVoltagecontrolDlg::DoDataExchange(CDataExchange* pDX)里加入   DDX_Control(pDX, IDC_LineChartCtrl, m_LineChart);  在BOOL CVoltagecontrolDlg::OnInitDialog()里加入  m_LineChart.SubclassDlgItem(IDC_LineChartCtrl, this);
                                      (5)在設(shè)置自定義空間屬性ID必須為IDC_LineChartCtrl,CLASS為L(zhǎng)ineChartCtrl,相應(yīng)程序里的注冊(cè)句柄名稱也設(shè)成LineChartCtrl;
                                      (6)程序中改變豎線間隔的是其寬度,而畫豎線的時(shí)間間隔是2*Timer;

              現(xiàn)有的運(yùn)行效果:
             
            橫軸采用五個(gè)Edit控件使時(shí)間數(shù)值能夠動(dòng)態(tài)變化;圖形繪制從坐標(biāo)軸右側(cè)開(kāi)始,橫軸隨時(shí)間移動(dòng); 采樣時(shí)間為1S;達(dá)到控制精度(error<0.05)要求時(shí)停止采集數(shù)據(jù)并且彈出提示對(duì)話框。

            問(wèn)題:(1)運(yùn)行程序?qū)⒊霈F(xiàn)三個(gè)警告:位于Wincore.cpp的line 348,349,4199。選擇ignore后,可以運(yùn)行程序。
                       (2)縱軸坐標(biāo)通過(guò)實(shí)際值標(biāo)定,且沒(méi)有畫出刻度線。

            posted on 2007-05-10 14:42 milkyway 閱讀(3231) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 課題進(jìn)展evc

            評(píng)論

            # re: Windows CE5.0下繪制實(shí)時(shí)數(shù)據(jù)曲線 2007-05-23 10:32 milkyway

            Assertion Failed: voltagecontrol: File wincore.cpp, Line 348
            Assertion Failed: voltagecontrol: File wincore.cpp, Line 349
            Error: Trying to use SubclassWindow with incorrect CWnd
            derived class.
            hWnd = $7C017E20 (nIDC=$03F4) is not a CWnd.
            Assertion Failed: voltagecontrol: File wincore.cpp, Line 4199

            警告調(diào)試信息  回復(fù)  更多評(píng)論   

            # re: Windows CE5.0下繪制實(shí)時(shí)數(shù)據(jù)曲線 2011-01-17 05:03 jkl

            覺(jué)得挻惡心的.不過(guò)有總比沒(méi)有好.   回復(fù)  更多評(píng)論   

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            隨筆皆原創(chuàng),文章乃轉(zhuǎn)載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久综合久久性久99毛片| 久久精品国产亚洲AV无码偷窥| 久久久国产精品亚洲一区| 亚洲AV日韩AV天堂久久| 99久久99这里只有免费费精品| 国产99久久九九精品无码| 伊人久久大香线蕉成人| 久久久久人妻一区精品性色av| 国产亚洲美女精品久久久| 亚洲av伊人久久综合密臀性色| 久久99热精品| 综合人妻久久一区二区精品| 国产午夜精品理论片久久| 亚洲熟妇无码另类久久久| 久久久91人妻无码精品蜜桃HD| 色偷偷偷久久伊人大杳蕉| 久久久久亚洲av毛片大| 99精品国产在热久久| 久久久SS麻豆欧美国产日韩| 天天久久狠狠色综合| 久久棈精品久久久久久噜噜| 青青久久精品国产免费看| 热99re久久国超精品首页| 亚洲欧美日韩久久精品第一区| 久久国产精品一区| A级毛片无码久久精品免费| 久久九九久精品国产| 久久精品一本到99热免费| 国产精品无码久久综合网| 九九精品99久久久香蕉| 精品久久久无码人妻中文字幕| 国产亚洲精午夜久久久久久| 青青青青久久精品国产h| 久久国产精品无码HDAV | 精品久久久久久久无码| 久久久久久久91精品免费观看| 色综合久久最新中文字幕| 囯产精品久久久久久久久蜜桃| 久久久久国产一级毛片高清板| 精品久久久久久国产91| 99久久国语露脸精品国产|