指定されたスタイル、幅、色を持つ論理ペンを作成します。
論理ペンを利用するには SelectObject 関数でペンを切り替えます。
その後に直線、曲線、図形などで論理ペンが使われます。
使い終わったら SelectObject 関数で元のペンに戻します。
作成された論理ペンが必要なければ DeleteObject 関数で削除します。
基本
- ペンの作成(CreatePen)
- ペンの切り替え(SelectObject)
- 直線とか、曲線などに利用(MoveToEx、LineTo)
- ペンの切り替え(SelectObject)
- ペンの削除(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 定数と同じ働きになります。
※コメント投稿者のブログIDはブログ作成者のみに通知されます