MFCによるExcelデータの波形描画

9715 ワード

MFCによるExcelデータの波形描画
ツール:VS 2015、Excel 2013
  • プロジェクトの作成
  • ファイル作成ダイアログ
  • Excelファイルを開いて読み込む
  • 波形
  • を描画
    プロジェクトの作成
    VS 2015を開くと、ファイル→新規→プロジェクト→MFCアプリケーション→プロジェクト名をwavedrawに変更→OK→次→ダイアログベース選択→完了
    TODOを削除:ここにダイアログボックスのコントロールを配置し、Edit Controlコントロールを追加し、IDをIDC_に変更します.SLCT_EDIT、Buttonコントロールを追加し、IDをIDC_に変更SLCT_BUTTON、captionを選択ファイルに変更し、最後にPicture Controlコントロールを追加します.
    ファイルの作成ダイアログ
    選択ファイルコントロールにイベントハンドラを追加する
    void CwavedrawDlg::OnBnClickedSlctButton() 
    {
        // TODO:               
    
        //     
        TCHAR fmtFilter[] = _T("excel  (*.xlsx*.xls)|*.xlsx;*.xls||");
        //       
        CFileDialog fileDlg(TRUE, _T("xlsx"), NULL, 0, fmtFilter, this);
        CString strFilePath; //    
    
        //       
        if (IDOK == fileDlg.DoModal())
        {
            //           "  
            strFilePath = fileDlg.GetPathName();
            SetDlgItemText(IDC_SLCT_EDIT, strFilePath);
        }
    
    }

    Excelテーブルの読み込み
    クラスを追加クリック項目-クラスを追加-Type-Libの中のMFCクラス-ファイル-位置はexcel.exeパス、追加_Application,_Workbook,_Worksheet,_Font,_Workbooks,_Worksheets,_Range.wavedrawDlg.hヘッダファイルに追加
    #include"CApplication.h"
    #include"CFont0.h"
    #include"CRange.h"
    #include"CWorkbook.h"
    #include"CWorkbooks.h"
    #include"CWorksheet.h"
    #include"CWorksheets.h"
    #define COUNT 100

    声明に参加する
    double value[COUNT]={0};
    int CT=0;

    wavedrawDlg.cppにコードを入れる
    void CwavedrawDlg::OnBnClickedOk()
    {
        // TODO:               
        //  
        COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
        if (!app.CreateDispatch(_T("Excel.Application")))
        {
            this->MessageBox(_T("    Excel  !"));
            //return TRUE;
        }
        books = app.get_Workbooks();
        //  Excel,  pathname Excel     
        UpdateData(TRUE);
    
        lpDisp = books.Open(m_strfilepath, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);
    
        book.AttachDispatch(lpDisp);
        sheets = book.get_Worksheets();
        sheet = sheets.get_Item(COleVariant((short)1));
    
        _variant_t rValue; //          
    
        //     (A,i)     
        for (int i = 0; i < 100; i++)
        {
            CString num;
            num.Format(_T("A%d"), i+1);
            range = sheet.get_Range(_variant_t(num), _variant_t(num));
            //         
    
            rValue = _variant_t(range.get_Value2());
            //   double   
            rValue.ChangeType(VT_R8);
            //    ,    
    
            value[i]= rValue.dblVal;
        }
            book.put_Saved(TRUE);
            app.Quit();
            CDialogEx::OnOK();  
    }

    波形描画
    wavedrawDlg.cppのBOOL CwavedrawDlg::OnInitDialog()にタイマー挿入コードを入れる
    //     ,ID 1,     200ms
    SetTimer(1,200,NULL);
    

    CwavedrawDlgクラスに波形描画を追加するメンバー関数Cwavedraw::DrawWave(CDC*pDC,CRect&rectPicture),パラメータはそれぞれデバイス上下ポインタと描画の矩形領域である
    void CwavedrawDlg::DrawWave(CDC *pDC, CRect &rectPicture)
    {
        float fDeltaX; // x              
        float fDeltaY; // y              
        int nX; //                
        int nY; //                
        CPen newPen; //        
        CPen *pOldPen; //        
        CBrush newBrush; //        
        CBrush *pOldBrush; //        
    
            //    fDeltaX   fDeltaY
        fDeltaX = (float)rectPicture.Width() / (COUNT - 1);
        fDeltaY = (float)rectPicture.Height() / 100;
    
        //        
        newBrush.CreateSolidBrush(RGB(255, 255, 255));
        //      ,            pOldBrush
        pOldBrush = pDC->SelectObject(&newBrush);
        //               ,      
        pDC->Rectangle(rectPicture);
        //      
        pDC->SelectObject(pOldBrush);
        //      
        newBrush.DeleteObject();
    
        //       ,    1,     
        newPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
        //      ,            pOldPen
        pOldPen = pDC->SelectObject(&newPen);
    
        //                  ,         
        pDC->MoveTo(rectPicture.left, rectPicture.bottom);
        //    m_nzValues              ,     ,      
        for (int i = 0; i < CT; i++)
        {
            nX = rectPicture.left + (int)(i * fDeltaX);
            nY = rectPicture.bottom - (double)(value[i] * fDeltaY);
            pDC->LineTo(nX, nY);
        }
    
        //      
        pDC->SelectObject(pOldPen);
        //      
        newPen.DeleteObject();
    }

    タイマーと図形描画メンバー関数があれば、WM_TIMERメッセージの応答関数には、波形データのタイミング処理と波形のタイミング描画が追加されている.コードの変更
    void CwavedrawDlg::OnTimer(UINT_PTR nIDEvent)
    {
        // TODO:              /      
    
        CRect rectPicture;
    
        //             
        // (               ,                  )
        m_picDraw.GetClientRect(&rectPicture);
    
        //      
        DrawWave(m_picDraw.GetDC(), rectPicture);
        CT++;
    
        CDialogEx::OnTimer(nIDEvent);
    }

    ダイアログボックスが破棄されると、タイマーは閉じます.CwavadrawDlgクラスにWM_を追加DESTROYメッセージの処理関数は、次のように変更されます.
    void CwavedrawDlg::OnDestroy()
    {
        CDialogEx::OnDestroy();
    
        // TODO :             
        //     
        KillTimer(1);
    }
    

    これで本プログラムの機能が実現できます.本文の大部分は《鶏啄米VS 2010/MFCプログラミング入門》を参考にする