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

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

ペンの作成と削除

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

指定されたスタイル、幅、色を持つ論理ペンを作成します。
論理ペンを利用するには SelectObject 関数でペンを切り替えます。
その後に直線、曲線、図形などで論理ペンが使われます。
使い終わったら SelectObject 関数で元のペンに戻します。
作成された論理ペンが必要なければ DeleteObject 関数で削除します。

基本

  1. ペンの作成(CreatePen)
  2. ペンの切り替え(SelectObject)
  3. 直線とか、曲線などに利用(MoveToEx、LineTo)
  4. ペンの切り替え(SelectObject)
  5. ペンの削除(DeleteObject)
//------------------------------------------------
// 直線・曲線・図形の描画
//------------------------------------------------
static VOID funcDrawSample( HDC hDC )
{
    HPEN hNewPen = (HPEN)CreatePen(PS_SOLID,4,RGB(0x00,0x00,0x00));
    HPEN hOldPen = (HPEN)SelectObject(hDC,hNewPen);
    
    ここで直線・曲線・図形などを描画
    
    SelectObject( hDC, hOldPen );
    DeleteObject( hNewPen );
}

サンプル

//------------------------------------------------
// ペンの作成と削除
//------------------------------------------------
static VOID funcPenLine( HDC hDC, INT cx, INT cy, INT size, INT nStyle, INT nWidth, COLORREF crColor )
{
    HPEN hNewPen = (HPEN)CreatePen(nStyle,nWidth,crColor);
    HPEN hOldPen = (HPEN)SelectObject(hDC,hNewPen);
    
    MoveToEx( hDC, (cx + 0x00), cy, NULL );
    LineTo(   hDC, (cx + size), cy );
    
    SelectObject( hDC, hOldPen );
    DeleteObject( hNewPen );
}

//------------------------------------------------
// WM_PAINTメッセージの処理
//------------------------------------------------
static VOID OnPaint( HWND hWnd )
{
    PAINTSTRUCT     ps;
    RECT            rc;
    HDC             hDC;
    
    hDC = BeginPaint( hWnd, &ps );
    SetRect( &rc, 0, 0, 224, 32 );
    
    // PS_SOLID
    OffsetRect( &rc, +16, +16 );
    DrawText( hDC, TEXT("PS_SOLID"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_SOLID, 1, RGB(0xCC,0x00,0x00) );
    
    // PS_DASH
    OffsetRect( &rc, 0, +48 );
    DrawText( hDC, TEXT("PS_DASH"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_DASH, 1, RGB(0x00,0xCC,0x00) );
    
    // PS_DOT
    OffsetRect( &rc, 0, +48 );
    DrawText( hDC, TEXT("PS_DOT"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_DOT, 1, RGB(0xCC,0xCC,0x00) );
    
    // PS_DASHDOT
    OffsetRect( &rc, 0, +48 );
    DrawText( hDC, TEXT("PS_DASHDOT"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_DASHDOT, 1, RGB(0x00,0x00,0xCC) );
    
    // PS_DASHDOTDOT
    OffsetRect( &rc, 0, +48 );
    DrawText( hDC, TEXT("PS_DASHDOTDOT"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_DASHDOTDOT, 1, RGB(0xCC,0x00,0xCC) );
    
    // PS_INSIDEFRAME
    OffsetRect( &rc, 0, +48 );
    DrawText( hDC, TEXT("PS_INSIDEFRAME"), -1, &rc, (DT_LEFT | DT_VCENTER | DT_SINGLELINE) );
    funcPenLine( hDC, 16, rc.bottom, 224, PS_INSIDEFRAME, 1, RGB(0x00,0xCC,0xCC) );
    
    EndPaint( hWnd, &ps );
}

実行結果

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

解説

CreatePen 関数のサンプルとして実線(PS_SOLID)、破線(PS_DASH)、点線(PS_DOT)、一点鎖線(PS_DASHDOT)、二点鎖線(PS_DASHDOTDOT)、内部フレーム線(PS_INSIDEFRAME)の6タイプを描画します。この中で PS_SOLID 定数、PS_INSIDEFRAME 定数 の2だけがペン幅として2ドット以上を指定できます。それ以外のPS_DASH 定数、PS_DOT 定数、PS_DASHDOT 定数、PS_DASHDOTDOT 定数の4つはペン幅が1ドットの時のみ正しく描画されて、2ドット以上だと実践と同じように描画されます。ここに注意しましょう。また、PS_INSIDEFRAME 定数は長方形(Rectangle)、楕円(Ellipse)などを描画するときに図形内部に実践が収まるように描画されます。それ以外は PS_SOLID 定数と同じ働きになります。


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

コメントを投稿

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