扇形を描くには Pie 関数を使います。
この関数は左上隅(始点)と右下隅(終点)の2つの点で扇形を表現します。
また、放射直線の始点と終点の2つの点で扇形の最初と終了を表現します。
なお、現在のペンで外枠、現在のブラシで扇形内部を塗りつぶします。
現在のブラシを NULL_BRUSH 定数にすると扇形の枠のみを描画します。
現在のペンを NULL_PEN 定数にすると扇形の内部のみを描画します。
プロトタイプ宣言
BOOL Pie( HDC hDC, // デバイス・コンテキストのハンドル int nLeft, // 扇形の左上隅の x 座標 int nTop, // 扇形の左上隅の y 座標 int nRight, // 扇形の右下隅の x 座標 int nBottom // 扇形の右下隅の y 座標 int nStartX, // 放射直線の始点の x 座標 int nStartY, // 放射直線の始点の y 座標 int nEndX, // 放射直線の終点の x 座標 int nEndY // 放射直線の終点の y 座標 );
基本
- 外枠と内部を描画(funcDrawFrame)
- 外枠のみを描画(funcDrawEdge)
- 内部のみを描画(funcDrawFill)
//------------------------------------------------ // 外枠と内部を描画 //------------------------------------------------ static VOID funcDrawFrame( HDC hDC ) { HPEN hNewPen = (HPEN)CreatePen(PS_INSIDEFRAME,4,RGB(0x99,0x66,0x00)); HPEN hOldPen = (HPEN)SelectObject(hDC,hNewPen); HBRUSH hNewBrush = (HBRUSH)CreateSolidBrush(RGB(0xFF,0x99,0x00)); HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC,hNewBrush); Pie( hDC, 16, 32, 176, 128, 16, 80, 176, 32 ); DeleteObject( SelectObject(hDC,hOldBrush) ); DeleteObject( SelectObject(hDC,hOldPen) ); }
//------------------------------------------------ // 外枠のみを描画 //------------------------------------------------ static VOID funcDrawEdge( HDC hDC ) { HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC,GetStockObject(NULL_BRUSH)); HPEN hNewPen = (HPEN)CreatePen(PS_INSIDEFRAME,4,RGB(0x99,0x66,0x00)); HPEN hOldPen = (HPEN)SelectObject(hDC,hNewPen); Pie( hDC, 16, 32, 176, 128, 16, 80, 176, 32 ); SelectObject( hDC, hOldBrush ); SelectObject( hDC, hOldPen ); DeleteObject( hNewPen ); }
//------------------------------------------------ // 内部のみを描画 //------------------------------------------------ static VOID funcDrawFill( HDC hDC ) { HPEN hOldPen = (HPEN)SelectObject(hDC,GetStockObject(NULL_PEN)); HBRUSH hNewBrush = (HBRUSH)CreateSolidBrush(RGB(0xFF,0x99,0x00)); HBRUSH hOldBrush = (HBRUSH)SelectObject(hDC,hNewBrush); Pie( hDC, 16, 32, 176, 128, 16, 80, 176, 32 ); SelectObject( hDC, hOldPen ); SelectObject( hDC, hOldBrush ); DeleteObject( hNewBrush ); }
サンプル
//------------------------------------------------ // 扇形の座標マクロ //------------------------------------------------ #define SIZE16(x,y,w,l) ((x) * 16), ((y) * 16), (((x)+(w)) * 16), (((y)+(l)) * 16) //------------------------------------------------ // 扇形の描画 //------------------------------------------------ static VOID funcColorPie( HDC hDC ) { LONG cx = 1; LONG cy = 1; LONG px = 1; LONG py = 4; // 橙色 SetDCPenColor( hDC, RGB(0x99,0x66,0x00) ); SetDCBrushColor( hDC, RGB(0xFF,0xCC,0x00) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); cx += 3; cy += 2; px += 3; py += 2; // 黄緑色 SetDCPenColor( hDC, RGB(0x66,0x99,0x00) ); SetDCBrushColor( hDC, RGB(0xCC,0xFF,0x00) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); cx += 3; cy += 2; px += 3; py += 2; // 桃色 SetDCPenColor( hDC, RGB(0x99,0x00,0x66) ); SetDCBrushColor( hDC, RGB(0xFF,0x00,0xCC) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); cx += 3; cy += 2; px += 3; py += 2; // 紫色 SetDCPenColor( hDC, RGB(0x66,0x00,0x99) ); SetDCBrushColor( hDC, RGB(0xCC,0x00,0xFF) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); cx += 3; cy += 2; px += 3; py += 2; // 青緑色 SetDCPenColor( hDC, RGB(0x00,0x99,0x66) ); SetDCBrushColor( hDC, RGB(0x00,0xFF,0xCC) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); cx += 3; cy += 2; px += 3; py += 2; // 青色 SetDCPenColor( hDC, RGB(0x00,0x66,0x99) ); SetDCBrushColor( hDC, RGB(0x00,0xCC,0xFF) ); Pie( hDC, SIZE16(cx,cy,9,6), SIZE16(px,py,+6,-3) ); } //------------------------------------------------ // WM_PAINTメッセージの処理 //------------------------------------------------ static VOID OnPaint( HWND hWnd ) { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint( hWnd, &ps ); SelectObject( hDC, GetStockObject(DC_PEN) ); SelectObject( hDC, GetStockObject(DC_BRUSH) ); funcColorPie( hDC ); EndPaint( hWnd, &ps ); }
実行結果
上記の OnPaint 関数を WM_PAINT メッセージで呼び出すと次のように描画されます。
解説
Pie 関数のサンプルとして橙色、黄緑色、桃色、紫色、青緑色、青色の6色を描画します。このカラー切り替えには SetDCPenColor 関数でペン色(外枠色)、SetDCBrushColor 関数でブラシ色(内部色)を設定してます。この2つの関数を利用するには SelectObject 関数で事前に DC_PEN 定数、DC_BRUSH 定数を選択させておく必要があります。この処理を省略すると登録済みのペン(黒色)と登録済みのブラシ(白色)が初期値ですから外枠色は常に黒色のままで内部色は常に白色のままで描画されます。そこで WM_PAINT メッセージの最初で DC_PEN 定数、DC_BRUSH 定数を SelectObject 関数で切り替えておきます。
それから funcColorPie 関数で扇形の左上隅と右下隅を計算しやすい SIZE16 マクロ関数を定義してます。このマクロは16×16ドットを基本にしたマス座標で指定できる便利なマクロ関数です。また、引数も左上隅と右下隅ではなく左上隅(x,y)と扇形サイズ(w,l)を与えることで左上隅と右下隅に変換された引数に置き換えてくれます。そのため Pie 関数で扇形をサイズで指定するときに非常に便利となってます。
Pie( hDC, SIZE16(1,1,9,6), SIZE16(1,4,+6,-3) );
↓
Pie( hDC, (1 * 16), (1 * 16), ((1 + 9) * 16), ((1 + 6) * 16), (1 * 16), (4 * 16), ((1 + 6) * 16), ((4 - 3) * 16) );
マクロ関数はコンパイル時に上記のように置き変わります。
よって次のように指定したのと同じになります。
Pie( hDC, 16, 16, 160, 112, 16, 64, 112, 16 );
上記の座標では、
横サイズは (160-16)=144 で (144÷16ドット)=9マス分
縦サイズは (112-16)= 96 で ( 96÷16ドット)=6マス分
となります。
ちゃんと扇形サイズで指定したのと同じ9×6マスになりました。
※コメント投稿者のブログIDはブログ作成者のみに通知されます