 |
- 画面上に楕円を描画 -
GDIを利用して画面上に楕円を描くプログラムを作ってみます
楕円の描画も四角形の場合と同様にCRectクラスを使います
楕円描画関数はEllipse
※解説では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」オブジェクトを作成
//1、2番目の引数が左上の座標
//3,4番目の引数が右下の座標
CRect obj01(10,10,300,100);
//Ellipse関数にCRectクラスで作成したオブジェクトを引数に渡し楕円描画
pDC->Ellipse(obj01);
//デバイスコンテキストの開放
ReleaseDC(pDC);
// 描画用メッセージとして CView::OnPaint() を呼び出してはいけません
}
|
■ 以上コンパイルすれば完成

※画面表示用メッセージWM_PAINTを呼び出し、OnPaint関数を追加
今回のアレンジでも2点座標をクリックし円を描く物を考えてみます
左上と、右下の座標を求めて描画するものは前回の応用で出来ると思いますので
今回は最初のクリック座標を円の中心座標、
次のクリックを円に外接する四角形の隅の座標で楕円を描く物を考えてみます
■ Viewクラスに楕円に外接する四角形の4点の座標を表すint型メンバ変数
m_x1,m_y1,m_x2,m_y2 を作成


※画面表示用メッセージWM_PAINTを呼び出し、OnPaint関数を追加
■ 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;
//int型変数x1,x2,y1,y2にクリック座標の値を代入
int x1 = m_x1;
int x2 = m_x2;
int y1 = m_y1;
int y2 = m_y2;
//差分を求めるint型変数作成
int sabun = 0;
//X座標の差分を求め左上と右下のX座標をメンバー変数に格納
if(x1 > x2){
sabun = x1 - x2;
m_x1 = x1 - sabun;
m_x2 = x1 + sabun;
}
else if (x1 < x2){
sabun = x2 - x1;
m_x1 = x1 - sabun;
m_x2 = x1 + sabun;
}
//Y座標の差分を求め左上と右下のY座標をメンバー変数に格納
if(y1 > y2){
sabun = y1 - y2;
m_y1 = y1 - sabun;
m_y2 = y1 + sabun;
}
else if (y1 < y2){
sabun = y2 - y1;
m_y1 = y1 - sabun;
m_y2 = y1 + sabun;
}
//OnPaint関数を呼び出し四角形を描画する
OnPaint();
CView::OnLButtonUp(nFlags, point);
}
|
■ OnPaint関数のソースを修正
///////////////////////////////
// CTest06View クラスのメッセージ ハンドラ
void CTest06View::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
//デバイスコンテキストのポインタ宣言
CDC* pDC;
//デバイスコンテキストの取得
pDC = GetDC();
//楕円に外接する四角形の座標を示すCRectクラスの「obj01」オブジェクトを作成
//1、2番目の引数が左上の座標
//3,4番目の引数が右下の座標
CRect obj01(m_x1,m_y1,m_x2,m_y2);
//Ellipse関数にCRectクラスで作成したオブジェクトを引数に渡し楕円描画
pDC->Ellipse(obj01);
//デバイスコンテキストの開放
ReleaseDC(pDC);
// 描画用メッセージとして CView::OnPaint() を呼び出してはいけません
}
|
※「obj01」オブジェクトの座標をメンバー変数 m_x1, m_y1, m_x2, m_y2 に変更
■ 以上コンパイルすれば完成

※マウスでクリックした位置を円の中心とし、マウスのボタンを離した位置を四角形の角とする四角形に内接する楕円を描く
|
|
 |