ペンを使う

今回はペンオブジェクトを使ってみましょう。

既存のペンを使う・GetStockObject

windowsはペン属性を用意してくれていますので、
それを使います。用意されているペン属性は以下の3種類です。

BLACK_PEN
WHITE_PEN
NULL_PEN

BLACK_PENは標準で使われる太さ1ピクセルの黒いペン、WHITE_PENは
白いペン、NULL_PENは描かないペンです。

「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //取得するペン・以前のペン
     HPEN hPen, hOld;

ペンオブジェクトの宣言ですね。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);

               //ストックペンを取得
               hPen = (HPEN) GetStockObject (WHITE_PEN) ;
               //デバイスコンテキストとペンをつなぐ
               hOld = (HPEN)SelectObject (hdc, hPen);

               //領域いっぱいに四角形を描く
               Rectangle (hdc,0,0,240,294) ;
               //以前のペンに戻す
               SelectObject (hdc, hOld);
               //領域いっぱいに円・楕円を描く
               Ellipse (hdc,0,0,240,294) ;

               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

hPenペンはGetStockObject関数で既存のペン属性(WHITE_PEN)を取得します。
取得したペンをSelectObject関数でデバイスコンテキストに設定すると、
戻り値として以前のオブジェクトのハンドルが返るのでhOldに保存しておきます。
四角形を描いた後、以前のペンに戻して楕円を描いています。
このhPenのペン属性は、windowsが元々用意していたペンなので
削除する必要はありません。
では実行してみましょう。

白色のペンを使っています

四角形のペンは白色で描いているので、見えませんね^^;

HGDIOBJ GetStockObject( int fnObject );
第一引数 fnObject には、定義済み(ストック)オブジェクトのタイプを指定します

戻り値 成功なら要求した論理オブジェクトのハンドルが、失敗ならNULLが返ります。

HGDIOBJ SelectObject( HDC hdc, HGDIOBJ hgdiobj );
第一引数 hdc には、デバイスコンテキストのハンドルを指定しますを指定します
第二引数 hgdiobj には、選択対象のオブジェクトのハンドルを指定します

戻り値
リージョン以外のオブジェクトを指定した場合に関数が成功すると
置き換えが発生する前のオブジェクトのハンドルが、失敗ならNULL が返ります。

ソースのダウンロード

ペンを作る・Createpen

白や黒のペンでは物足りないので、自分でペンを作ってみます。
上のBeginPaint~EndPaint内のみを変更します。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);

               //ペンを作成
               hPen = CreatePen (PS_SOLID, 1, RGB (255, 0, 0));
               //デバイスコンテキストとペンをつなぐ
               hOld = (HPEN) SelectObject (hdc, hPen);

               //四角形を描く
               Rectangle (hdc,0,0,240,294) ;
               //円・楕円を描く
               Ellipse (hdc,0,0,240,294) ;
               //以前のペンに戻す
               SelectObject (hdc, hOld);
               //作成したペンを削除
               DeleteObject (hPen);

               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

CreatePen関数で新しく論理ペンを作成します。
論理ペンの使い方は同じで、SelectObjectでデバイスコンテキストに設定し、
用が終わったらDeleteObject関数でペンを削除します。
作成したオブジェクトは、デバイスコンテキストに設定されている間は
オブジェクトは破棄されないようです。
では実行してみましょう。

赤色のペンが使われています

また、設定によってペンの太さも変えられます。

HPEN CreatePen( int fnPenStyle, int nWidth, COLORREF crColor);
第一引数 fnPenStyle には、定義済みペンの種類を指定します
第二引数 nWidth には、ペンの太さをピクセル単位で指定します
第一引数 crColor には、ペンの色を指定します

fnPenStyleのマクロ
PS_SOLID:ペンは連続した線を描きます
PS_DASH:ペンは破線を描きます(ペンの太さが1でないと効果が出ない)
PS_NULL:ペンは見えない線を描きます

戻り値 成功なら作成された論理ペンのハンドルが、失敗ならNULLが返ります。

BOOL DeleteObject( HGDIOBJ hObject );
第一引数 hObject には、論理ペン・ブラシ・パレット等のハンドルを指定します

戻り値 成功ならTRUEが、失敗ならNULLが返ります。

ソースのダウンロード

2005/5/28


戻る