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

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

長方形の描画

2011年05月20日 03時40分00秒 | グラフィック関連

長方形を描くには Rectangle 関数を使います。
この関数は左上隅(始点)と右下隅(終点)の2つの点で長方形を表現します。
なお、現在のペンで外枠、現在のブラシで長方形内部を塗りつぶします。
現在のブラシを NULL_BRUSH 定数にすると長方形の枠のみを描画します。
現在のペンを NULL_PEN 定数にすると長方形の内部のみを描画します。

プロトタイプ宣言

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

基本

  1. 外枠と内部を描画(funcDrawFrame)
  2. 外枠のみを描画(funcDrawEdge)
  3. 内部のみを描画(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);
    
    Rectangle( hDC, 16, 32, 176, 128 );
    
    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);
    
    Rectangle( hDC, 16, 32, 176, 128 );
    
    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);
    
    Rectangle( hDC, 16, 32, 176, 128 );
    
    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 funcColorRectangle( HDC hDC )
{
    LONG cx = 1;
    LONG cy = 1;
    
    // 橙色
    SetDCPenColor(   hDC, RGB(0x99,0x66,0x00) );
    SetDCBrushColor( hDC, RGB(0xFF,0xCC,0x00) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
    cx += 4;
    cy += 3;
    // 黄緑色
    SetDCPenColor(   hDC, RGB(0x66,0x99,0x00) );
    SetDCBrushColor( hDC, RGB(0xCC,0xFF,0x00) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
    cx += 4;
    cy += 3;
    // 桃色
    SetDCPenColor(   hDC, RGB(0x99,0x00,0x66) );
    SetDCBrushColor( hDC, RGB(0xFF,0x00,0xCC) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
    cx += 4;
    cy += 3;
    // 紫色
    SetDCPenColor(   hDC, RGB(0x66,0x00,0x99) );
    SetDCBrushColor( hDC, RGB(0xCC,0x00,0xFF) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
    cx += 4;
    cy += 3;
    // 青緑色
    SetDCPenColor(   hDC, RGB(0x00,0x99,0x66) );
    SetDCBrushColor( hDC, RGB(0x00,0xFF,0xCC) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
    cx += 4;
    cy += 3;
    // 青色
    SetDCPenColor(   hDC, RGB(0x00,0x66,0x99) );
    SetDCBrushColor( hDC, RGB(0x00,0xCC,0xFF) );
    Rectangle( hDC, SIZE16(cx,cy,9,6) );
}

//------------------------------------------------
// 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) );
    funcColorRectangle( hDC );
    EndPaint( hWnd, &ps );
}

実行結果

上記の OnPaint 関数を WM_PAINT メッセージで呼び出すと次のように描画されます。

解説

Rectangle 関数のサンプルとして橙色、黄緑色、桃色、紫色、青緑色、青色の6色を描画します。このカラー切り替えには SetDCPenColor 関数でペン色(外枠色)、SetDCBrushColor 関数でブラシ色(内部色)を設定してます。この2つの関数を利用するには SelectObject 関数で事前に DC_PEN 定数、DC_BRUSH 定数を選択させておく必要があります。この処理を省略すると登録済みのペン(黒色)と登録済みのブラシ(白色)が初期値ですから外枠色は常に黒色のままで内部色は常に白色のままで描画されます。そこで WM_PAINT メッセージの最初で DC_PEN 定数、DC_BRUSH 定数を SelectObject 関数で切り替えておきます。

それから funcColorRectangle 関数で長方形の左上隅と右下隅を計算しやすい SIZE16 マクロ関数を定義してます。このマクロは16×16ドットを基本にしたマス座標で指定できる便利なマクロ関数です。また、引数も左上隅と右下隅ではなく左上隅(x,y)と長方形サイズ(w,l)を与えることで左上隅と右下隅に変換された引数に置き換えてくれます。そのため Rectangle 関数で長方形をサイズで指定するときに非常に便利となってます。

Rectangle( hDC, SIZE16(1,1,9,6) );

Rectangle( hDC, (1 * 16), (1 * 16), ((1 + 9) * 16), ((1 + 6) * 16) );

マクロ関数はコンパイル時に上記のように置き変わります。
よって次のように指定したのと同じになります。

Rectangle( hDC, 16, 16, 160, 112 );

上記の座標では、
 横サイズは (160-16)=144 で (144÷16ドット)=9マス分
 縦サイズは (112-16)= 96 で ( 96÷16ドット)=6マス分
となります。

ちゃんと長方形サイズで指定したのと同じ9×6マスになりました。


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ペンの作成と削除 | トップ | 丸角長方形の描画 »
最新の画像もっと見る

コメントを投稿

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