プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

図形の描画

2011年05月21日 02時28分00秒 | グラフィック関連

GDIで図形を描くには、次の関数をそれぞれ使います。

  • Rectangle(長方形)
  • RoundRect(丸角長方形)
  • Ellipse(楕円)
  • Arc(円弧)
  • Pie(扇形)
  • Chord(弓形)

この関数群は左上隅(始点)と右下隅(終点)の2つの点で図形を表現します。
また、放射直線の始点と終点の2つの点で円弧・扇形・弓形の最初と終了を表現します。
なお、現在のペンで外枠、現在のブラシで図形内部を塗りつぶします。
現在のブラシを NULL_BRUSH 定数にすると図形の枠のみを描画します。
現在のペンを NULL_PEN 定数にすると図形の内部のみを描画します。

基本

//------------------------------------------------
// 外枠と内部を描画
//------------------------------------------------
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);
    /*
    ここで長方形・丸角長方形・楕円・円弧・扇形・弓形などを描画
    */
    DeleteObject( SelectObject(hDC,hOldBrush) );
    DeleteObject( SelectObject(hDC,hOldPen) );
}

上記のように新しいペンやブラシを作成したら SelectObject 関数で切り替える事で図形の外枠と内部を自由に描画できます。なお、ペン色とブラシ色のカラーだけを切り替えたい場合には SetDCPenColor 関数でペン色(外枠色)、SetDCBrushColor 関数でブラシ色(内部色)を設定できます。この2つの関数を利用するには SelectObject 関数で事前に DC_PEN 定数、DC_BRUSH 定数を選択させておく必要があります。この処理を省略すると登録済みのペン(黒色)と登録済みのブラシ(白色)が初期値ですから外枠色は常に黒色のままで内部色は常に白色のままで描画されます。そこでデバイスコンテキストに DC_PEN 定数、DC_BRUSH 定数を SelectObject 関数で切り替えておきます。これで外枠色と内部色のカラーだけを変更するのが簡単になります。詳しくは、それぞれの[詳細を見る]をどうぞ。

長方形

BOOL Rectangle(
    HDC hDC,        // デバイス・コンテキストのハンドル
    int nLeft,      // 長方形の左上隅の x 座標
    int nTop,       // 長方形の左上隅の y 座標
    int nRight,     // 長方形の右下隅の x 座標
    int nBottom     // 長方形の右下隅の y 座標
);

詳細を見る

丸角長方形

BOOL RoundRect(
    HDC hDC,        // デバイス・コンテキストのハンドル
    int nLeft,      // 丸角長方形の左上隅の x 座標
    int nTop,       // 丸角長方形の左上隅の y 座標
    int nRight,     // 丸角長方形の右下隅の x 座標
    int nBottom     // 丸角長方形の右下隅の y 座標
    int nWidth,     // 丸角楕円の幅
    int nHeight     // 丸角楕円の高さ
);

詳細を見る

楕円

BOOL Ellipse(
    HDC hDC,        // デバイス・コンテキストのハンドル
    int nLeft,      // 楕円の左上隅の x 座標
    int nTop,       // 楕円の左上隅の y 座標
    int nRight,     // 楕円の右下隅の x 座標
    int nBottom     // 楕円の右下隅の y 座標
);

詳細を見る

円弧

BOOL Arc(
    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 座標
);

詳細を見る

扇形

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 座標
);

詳細を見る

弓形

BOOL Chord(
    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 座標
);

詳細を見る


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 弓形の描画 | トップ | ウインドウの雛形 »
最新の画像もっと見る

コメントを投稿

グラフィック関連」カテゴリの最新記事