- 画面上に四角形を描いてみよう -



GDIを利用して画面上に四角形を描くプログラムを作ってみます
四角形描画には関数が複数ありますが今回は引数の一番少ないInvertRect関数のみ解説します
その他の物についてはMSDN等で調べてみてください

※解説ではOnPaint関数を使用していますがViewクラスのOnDraw関数をしても同じように出来ます




≪ MFC・SDIでの作成例 ≫


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



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





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


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

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

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

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

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

//四角形の座標を表すCRectクラスの「obj01」オブジェクトを作成
//最初の2つの引数が四角形の左上の座標を表す:int x,int y
//3、4番目の引数が四角形の右下の座標を表す:int x,int y
CRect obj01(100,100,300,300);

//InvertRect関数にCRectクラスで出来た四角形座標のオブジェクトを引数に渡す
pDC->InvertRect(obj01);

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

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






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



※InvertRect関数は四角形の内部の色を反転する関数
※再描画などでフォーカスが失われたり現れたりします





今回のアレンジではクリック位置で四角形の左上の座標、
クリックを離した位置で右下の座標を取得し四角形を描画するプログラムを作ってみます





 ■ Viewクラスに四角形の4点の座標を表すint型メンバ変数 m_x1,m_y1,m_x2,m_y2 を作成









 ■ ClassWizradを呼び出しViewクラスに左クリックと、左クリックを離した時のイベント関数を追加



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





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


void CTest09View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
//クリック位置のx、y座標をメンバー変数m_x1、m_y1に格納
m_x1 = point.x;
m_y1 = point.y;

CView::OnLButtonDown(nFlags, point);
}






 ■ 追加したマウスの左ボタンが離された時のイベント関数(OnLButtonUp)にソースを追加


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

//クリックが離された時の座標をメンバー変数m_x2、m_y2に格納
m_x2 = point.x;
m_y2 = point.y;

//OnPaint関数を呼び出し四角形を描画する
OnPaint();

CView::OnLButtonUp(nFlags, point);
}






 ■ OnPaint関数のソースを修正


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

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

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

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

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

//四角形の座標を表すCRectクラスの「obj01」オブジェクトを作成
//最初の2つの引数が四角形の左上の座標を表す:int x,int y
//3、4番目の引数が四角形の右下の座標を表す:int x,int y
CRect obj01(m_x1,m_y1,m_x2,m_y2);

//InvertRect関数にCRectクラスで出来た四角形座標のオブジェクトを引数に渡す
pDC->InvertRect(obj01);

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


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

※「obj01」オブジェクトの座標をメンバー変数 m_x1, m_y1, m_x2, m_y2 に変更





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



※マウスでクリックした位置からマウスのボタンを離した位置で四角形を描画する