- 画面上に扇形を描画 -



GDIを利用して画面上に扇形を描くプログラムを作ってみます
扇形描画にはPie関数を使います
引数は3つで、最初の引数が楕円に外接する四角形の2点座標を持つオブジェクト(CRect)
2番目の引数が、弧の始点座標を持つオブジェクト(CPoint)
3番目の引数が、弧の終点座標を持つオブジェクト(CPoint)


※解説では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(0,0,201,201);


//CPointクラスは、扇形の描画関数(Pic)での始点、終点座標を表すオブジェクトの作成
//CPointクラスのobj02、obj03オブジェクトを作成
CPoint obj02(100,200);
CPoint obj03(150,50);


//Pie関数にCRectクラスで作成したオブジェクトを引数に渡す
//最初の引数は内接する四角形の座標
//2番目の引数は弧の始点座標
//3番目の引数は弧の終点座標
pDC->Pie(obj01,obj02,obj03);

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

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





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








今回のアレンジは時計の針のように円の真上から真下に扇形の始点を移しながら描画ていくプログラムを作ってみます





 ■ Viewクラスに扇形の終点座標を表すint型メンバ変数 m_x1,m_y1 を作成





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





 ■ ClassWizradを呼び出しViewクラスに左クリックイベント関数と、タイマー関数を追加



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





 ■ 追加した左クリックイベント関数(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);
}






 ■ OnTimer関数にソースを追加


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

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

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


//楕円に外接する四角形の座標を示すCRectクラスの「obj01」オブジェクトを作成
//1、2番目の引数が左上の座標
//3,4番目の引数が右下の座標
CRect obj01(0,0,201,201);


//CPointクラスは、扇形の描画関数(Pic)での始点、終点座標を表すオブジェクトの作成
//CPointクラスのobj02、obj03オブジェクトを作成
CPoint obj02(100,0);
CPoint obj03(m_x1,m_y1);


//Pie関数にCRectクラスで作成したオブジェクトを引数に渡す
//最初の引数は内接する四角形の座標
//2番目の引数は弧の始点座標
//3番目の引数は弧の終点座標
pDC->Pie(obj01,obj02,obj03);


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


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


//扇形の終点座標を真上から真下に移すまでのアルゴリズム
m_y1++;

if(m_y1>100){
m_x1--;
}
else{
m_x1++;
}


//Y座標が200になったときタイマーを終了
if(m_y1>200){
KillTimer(1);
}


CView::OnTimer(nIDEvent);
}






 ■ OnPaint関数のソースを修正


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

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

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


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

※先程追加したソースを全て削除





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



※クリックすると円の真上を始点に右回りに終点座標を移し扇形を描いていき真下に来た時タイマーを止め停止します
※ちなみに私の作った物はこちらからDLできます