- 画面上に線を引いてみよう -



テキスト表示同様、GDIを利用して画面上に線を引くプログラムを作ってみます
大まかな流れは以下になります

デバイスコンテキスト取得 → ペンを作成 → ペンの持ち替え → 線描画 → 作成したペンの削除



≪ MFC・SDIでの作成例 ≫


 ■ クラスウイザードを呼び出しViewクラスにWM_PAINTを追加する



※画面表示用メッセージWM_PAINTを呼び出し、OnPaint関数を追加





 ■ 追加したOnPaint関数に線を描画するソースを追加


/////////////////////////////////////////////////////////////////
// CTest06View クラスのメッセージ ハンドラ

void CTest06View::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

// TODO: この位置にメッセージ ハンドラ用のコードを追加してください

//デバイスコンテキストのポインタ宣言
CDC* pDC;

//デバイスコンテキストの取得
pDC = GetDC();

//元のペンを格納するペンオブジェクトを作成
CPen* pOldPen;

//ペンの持ち替え(元のペンをpOldPenに格納)
pOldPen = (CPen*)pDC ->SelectStockObject(BLACK_PEN);

//線描画の始点を設定(最初の引数はX座標、2番目の引数がY座標)
pDC->MoveTo(0,0);

//線描画の終点を設定・描画(最初の引数はX座標、2番目の引数がY座標)
pDC->LineTo(200,200);

//元のペンに持ち替え
pDC->SelectObject(pOldPen);

//ペンの削除
pOldPen->DeleteObject();

//デバイスコンテキストの開放
ReleaseDC(pDC);



// 描画用メッセージとして CView::OnPaint() を呼び出してはいけません
}

作成したペンはメモリー上に確保され、開放されるまで残ります。
ペンを作成し使用した後はDeleteObject関数で削除するようにしてください。





 ■ 以上コンパイルすれば完成



※MoveTo関数で指定した座標からLineTo関数で指定した座標まで線を描く





今回もちょっとアレンジしてみます
マウスクリックでの座標取得は前回やったのでクリックでの線描画はちょっと考えれば出来ると思いますので
今回はOnTimer関数との連携で簡単なラインアニメーションを作ってみます





 ■ Viewクラスに終点座標を表すint型メンバ変数 m_x m_y を作成










 ■ クラスウイザードを呼び出しマウスの左クリックイベントを追加



※C***View → WM_LBUTTONDOWN → 関数を追加





 ■ クラスウイザードよりOnTimer関数を追加する



※C***View → WM_TIMER → 関数を追加





 ■ 追加したクリックイベントのOnLButtonDown関数にソースを追加


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

//クリックイベントの追加

//メンバ変数 m_x m_y の初期化
m_x = 400;
m_y = 0;

//タイマーを予めリセット
KillTimer(1);

//タイマー開始
SetTimer(1,1,NULL);

CView::OnLButtonDown(nFlags, point);
}






 ■ 作成したOnTimer関数にソースを追加


void CTest07View::OnTimer(UINT nIDEvent)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください

//OnPaint関数を呼び出し線を描画
OnPaint();

//メンバ変数m_xをデクリメント
m_x--;

//メンバ変数m_yをインクリメント
m_y++;

//メンバ変数m_xの値をチェック(メンバ変数m_xが0以下になればタイマー終了)
if(m_x<=0){
//タイマー終了
KillTimer(1);
}

CView::OnTimer(nIDEvent);
}

※TextOut関数のx,y座標を先程作成したメンバ変数に変更





 ■ 先程作成したOnPint関数のソースの修正


//////////////////////////////////////////////////
// CTest06View クラスのメッセージ ハンドラ

void CTest06View::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト

// TODO: この位置にメッセージ ハンドラ用のコードを追加してください

//デバイスコンテキストのポインタ宣言
CDC* pDC;

//デバイスコンテキストの取得
pDC = GetDC();

//元のペンを格納するペンオブジェクトを作成
CPen* pOldPen;

//ペンの持ち替え(元のペンをpOldPenに格納)
pOldPen = (CPen*)pDC ->SelectStockObject(BLACK_PEN);

//線描画の始点を設定(最初の引数はX座標、2番目の引数がY座標)
pDC->MoveTo(0,0);

//線描画の終点を設定・描画(最初の引数はX座標、2番目の引数がY座標)
pDC->LineTo(m_x,m_y);

//元のペンに持ち替え
pDC->SelectObject(pOldPen);

//ペンの削除
pOldPen->DeleteObject();

//デバイスコンテキストの開放
ReleaseDC(pDC);

// 描画用メッセージとして CView::OnPaint() を呼び出してはいけません
}

※LineTo関数の座標をメンバ変数、m_x、m_yに変更





 ■ 以上コンパイルすれば完成



※マウスでクリックすると座標(0,0)を始点に線を描画していく