Step 2. データのグラフ表示(応用編1. マウスドラッグによる拡大)

ここでは表示されたグラフの一部をマウスでドラッグすると拡大するようにプログラムの変更を行います。

1. マウスイベントメッセージ

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

2. 変数宣言と初期化

左ボタンが押されたかどうか(MRegion)と最初に左ボタンが押された位置(RegionSX, RegionSY)を記憶するための変数をヘッダファイルで宣言します。また、MRegion を初期化(=0)するため C****View() を下記のように書き換えます。

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


3. 左ボタンクリック、マウス移動など

OnLButtonDown, OnLButtonUp, OnMouseMove 関数を次のように書き換えます。 point はマウスの位置を表します。point.x でx座標を、point.yでy座標を取得できます。

void CStep1View::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    if (MRegion==0) {
        MRegion=1;
        RegionSX=point.x;
        RegionSY=point.y;
    }

}

void CStep1View::OnLButtonUp(UINT nFlags, CPoint point) 
{
    float temp1,temp2;
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    if (MRegion==1) {
        MRegion=0;
       
        temp1=(Xmax-Xmin)*(RegionSX-100)/550.0+Xmin;
        temp2=(Xmax-Xmin)*(point.x-100)/550.0+Xmin;
       
        if (temp1>temp2) {
           Xmin=temp2;
           Xmax=temp1;
        }
        else {
           Xmin=temp1;
           Xmax=temp2;
        }

        temp1=(Ymin-Ymax)*(RegionSY-50)/300+Ymax;
        temp2=(Ymin-Ymax)*(point.y-50)/300+Ymax;
        if (temp1>temp2) {
           Ymin=temp2;
           Ymax=temp1;
        }
        else {
           Ymin=temp1;
           Ymax=temp2;
        }

    }

    RedrawWindow(); 

}

void CStep1View::OnMouseMove(UINT nFlags, CPoint point) 
{
    CDC* pDC=GetDC();

    int EX,EY;
    // TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
    if (MRegion==1) {

        EX=point.x;
        EY=point.y;

        RedrawWindow();

        CRect DRect(RegionSX,RegionSY,EX,EY);

        CBrush NewBrush;
        NewBrush.CreateSolidBrush(RGB(125,125,125));
        CBrush* OldBrush=pDC->SelectObject(&NewBrush);

        pDC->FrameRect(DRect, &NewBrush);

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

    }

}