Step 2. データのグラフ表示(応用編2. カーソルを作る)

カーソルを作りカーソル位置の x, y データを表示するとともに、矢印キーによるカーソルの移動を実現します。

1. キー入力イベントメッセージ

ClassWizard を立ち上げます。クラス名は C***View を選択します。メッセージから WM_KEYDOWN を選択し、関数の追加をクリックします。

2. 変数宣言と初期化

何番目のデータのところにいるのかを示すカーソル位置 (Ci) をヘッダ(****View.h)で宣言し、****View.cpp の上の方にある以下の部分で初期化します。

CStep1View::CStep1View()
{
    // TODO: この場所に構築用のコードを追加してください。
    MRegion=0;
    //最初は0番目のデータ
    Ci=0;
}


3. カーソルの描画(OnDraw 関数)

カーソルの描画は OnDraw 関数で行います。ここでのカーソルはデータ点の上に緑の線を置くことにします。また、カーソル位置の x, y データおよびデータ番号をグラフの右上に表示することにします。コメントでカーソルはここからと書いたところが新しいところです。

void CStep1View::OnDraw(CDC* pDC)
{
    CStep1Doc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。

    int xt, yt;
    char name[20], *t1;


    for (int i=0; i=Xmin && x[i]<=Xmax && y[i]>=Ymin && y[i]<=Ymax) {

            xt=(int)  550*(x[i]-Xmin)/(Xmax-Xmin)+100;
            yt=(int) -300*(y[i]-Ymin)/(Ymax-Ymin)+350;

            pDC->SetPixel(xt,yt,RGB(0,0,255));
        }

    }


//  pDC->Rectangle(100,50,650,350);
    if (ndata>0) {
        CBrush NewBrush;
        NewBrush.CreateSolidBrush(RGB(255,0,0));
        CBrush* OldBrush=pDC->SelectObject(&NewBrush);

        CRect DRect(100,50,650,350);
        pDC->FrameRect(DRect, &NewBrush);

        pDC->SelectObject(OldBrush);
        NewBrush.DeleteObject();

        pDC->TextOut(250,30, "VC++ for Chemist");

        t1 = gcvt(Xmin, 8, name);
        pDC->TextOut(100,360, t1);
        t1 = gcvt(Xmax, 8, name);
        pDC->TextOut(640,360, t1);

        pDC->SetTextColor(RGB(255,0,0));
        t1 = gcvt(Ymax, 8, name);
        pDC->TextOut(40,50, t1);
        t1 = gcvt(Ymin, 8, name);
        pDC->TextOut(40,330, t1);

        //カーソルはここから
        if (x[Ci]>=Xmin && x[Ci]<=Xmax && y[Ci]>=Ymin && y[Ci]<=Ymax) {

            CPen NewPen;
            NewPen.CreatePen(PS_SOLID, 2, RGB(0,255,0));
            CPen* OldPen=pDC->SelectObject(&NewPen);

            xt=(int)  550*(x[Ci]-Xmin)/(Xmax-Xmin)+100;
            yt=(int) -300*(y[Ci]-Ymin)/(Ymax-Ymin)+350;

            pDC->MoveTo(xt,yt);
            pDC->LineTo(xt,yt-30);

            pDC->SelectObject(OldPen);
            NewPen.DeleteObject();

        }

        pDC->SetTextColor(RGB(0,0,0));
        pDC->TextOut(420,20, "No.= ");
        pDC->TextOut(520,20, "x= ");
        pDC->TextOut(620,20, "y= ");

        pDC->SetTextColor(RGB(0,255,0));
        t1 = itoa(Ci, name, 10);
        pDC->TextOut(460,20, name);
        t1 = gcvt(x[Ci], 8, name);
        pDC->TextOut(550,20, t1);
        t1 = gcvt(y[Ci], 8, name);
        pDC->TextOut(650,20, t1);


    }


}


4. 矢印キー入力でのカーソル移動

1. でOnKeyDown 関数がソースファイルの一番下につくられていますのでここを書き換えます。右矢印が押されたらデータ番号を1増やすようにします。

void CStep1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    CClientDC myDC(this);

    if (nChar==VK_RIGHT) {
        if (Ci+1<ndata) {
            Ci=Ci+1;
        }
    }
    if (nChar==VK_LEFT) {
        if (Ci-1>=0) {
            Ci=Ci-1;
        }
    }

    RedrawWindow();
    CView::OnKeyDown(nChar, nRepCnt, nFlags);
}


5. 補足

データの数が多い場合は Shift キーと矢印キーが同時に押されたら 100 進むといった工夫をしたほうが実用的かもしれません。