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コントロールを追加します.
ファイルの作成ダイアログ
選択ファイルコントロールにイベントハンドラを追加する
Excelテーブルの読み込み
クラスを追加クリック項目-クラスを追加-Type-Libの中のMFCクラス-ファイル-位置はexcel.exeパス、追加_Application,_Workbook,_Worksheet,_Font,_Workbooks,_Worksheets,_Range.wavedrawDlg.hヘッダファイルに追加
声明に参加する
wavedrawDlg.cppにコードを入れる
波形描画
wavedrawDlg.cppのBOOL CwavedrawDlg::OnInitDialog()にタイマー挿入コードを入れる
CwavedrawDlgクラスに波形描画を追加するメンバー関数Cwavedraw::DrawWave(CDC*pDC,CRect&rectPicture),パラメータはそれぞれデバイス上下ポインタと描画の矩形領域である
タイマーと図形描画メンバー関数があれば、WM_TIMERメッセージの応答関数には、波形データのタイミング処理と波形のタイミング描画が追加されている.コードの変更
ダイアログボックスが破棄されると、タイマーは閉じます.CwavadrawDlgクラスにWM_を追加DESTROYメッセージの処理関数は、次のように変更されます.
これで本プログラムの機能が実現できます.本文の大部分は《鶏啄米VS 2010/MFCプログラミング入門》を参考にする
ツール:VS 2015、Excel 2013
プロジェクトの作成
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プログラミング入門》を参考にする