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 が返ります。
白や黒のペンでは物足りないので、自分でペンを作ってみます。
上の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が返ります。
戻り値 成功ならTRUEが、失敗ならNULLが返ります。
2005/5/28