電子書籍の厳選無料作品が豊富!

VC++ MFCダイアログベースです。

通信で取得した値をグラフにすると言うソフトを作っています。

グラフにでき、動作するのですが、配列の要素数を増やしていくと処理が重くなってしまい
受信したデータを表示するために作った別のエディットボックスの表示が
更新されなくなると言う不具合がありました。
  
値は0か1だけであり、もう少し簡単に出来ないか考えているのですが、
どうかアイデアをいただけないでしょうか?
よろしくお願い致します。

// m_nNumPlot;//配列の要素数(unsigned int)
// m_pPlotData[m_nNumPlot];//通信で受信データを格納(double)
// nWidth;//グラフ領域の幅サイズ←Bitmap.CreateCompatibleBitmap(&dc, nWidth, nHeight);

double PlotX;// プロットする X 位置
double PlotY;// プロットする Y 位置

// PlotSpace = グラフ領域の幅サイズ÷(配列の要素数-1)
double PlotSpace = (double)nWidth / (m_nNumPlot - 1);// プロットの間隔


pDC->SelectObject(&m_penGraph);

// 配列の(要素数-1)回線を書くループ
for(int j = 0; j < m_nNumPlot; j++){
PlotX = nWidth - PlotSpace * j;
PlotY = m_pPlotData[j];//計算した後のY位置
if(j == 0)pDC->MoveTo((int)PlotX, (int)PlotY);//線の始点
elsepDC->LineTo((int)PlotX, (int)PlotY);//線の終点
}

pDC->SelectObject(pOldPen);

A 回答 (1件)

★折れ線グラフですか。


・折れ線グラフなら MoveTo()、LineTo() を組み合わせなくても PolylineTo() の1つで実行できます。
 配列の構造を PolylineTo() で利用可能な形式に変更して呼び出せば簡単に折れ線を描画してくれます。
 つまり、配列を POINT 構造体にセットします。→ループ部分でセットしなおす。その後に実行。
・下にそのサンプルを載せておきます。

サンプル:
POINT Plot[ m_nNumPlot ];

for ( int j = 0 ; j < m_nNumPlot ; j++ ){
 Plot[ j ].x = nWidth - PlotSpace * j;
 Plot[ j ].y = m_pPlotData[ j ];
}
pDC->PolylineTo( Plot, m_nNumPlot );

参考文献:
http://wisdom.sakura.ne.jp/system/winapi/win32/w …→『カレントポジションと線』
http://msdn2.microsoft.com/ja-jp/library/534yk5b …→『CDC::PolylineTo (MFC)』
 基本的に GDI の操作は処理が低速です。これが処理を重くしているのかな。
・以上。

参考URL:http://msdn2.microsoft.com/ja-jp/library/534yk5b …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!