CPen
クラス
Windows のグラフィック デバイス インターフェイス (GDI) のペンをカプセル化したものです。
構文
class CPen : public CGdiObject
メンバー
パブリック コンストラクター
名前 | 説明 |
---|---|
CPen::CPen |
CPen オブジェクトを構築します。 |
パブリック メソッド
名前 | 説明 |
---|---|
CPen::CreatePen |
スタイル、幅、ブラシの属性を指定して、論理的な外観または幾何学的なペンを作成し、 CPen オブジェクトにアタッチします。 |
CPen::CreatePenIndirect |
LOGPEN 構造体で指定されたスタイル、幅、色を持つペンを作成し、CPen オブジェクトにアタッチします。 |
CPen::FromHandle |
Windows HPEN を指定した場合、 CPen オブジェクトへのポインターを返します。 |
CPen::GetExtLogPen |
EXTLOGPEN 基になる構造体を取得します。 |
CPen::GetLogPen |
基になる LOGPEN 構造体を取得します。 |
パブリック演算子
名前 | 説明 |
---|---|
CPen::operator HPEN |
CPen オブジェクトにアタッチされている Windows ハンドルを返します。 |
解説
CPen
の使用方法の詳細については、「Graphic オブジェクト」を参照してください。
継承階層
CPen
要件
ヘッダー: afxwin.h
CPen::CPen
CPen
オブジェクトを構築します。
CPen();
CPen(
int nPenStyle,
int nWidth,
COLORREF crColor);
CPen(
int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount = 0,
const DWORD* lpStyle = NULL);
パラメーター
nPenStyle
ペンのスタイルを指定します。 コンストラクターの最初のバージョンのこのパラメーターには、次のいずれかの値を指定できます。
PS_SOLID
実線ペンを作成します。PS_DASH
破線のペンを作成します。 ペンの幅がデバイス単位で 1 以下の場合にのみ有効です。PS_DOT
点線のペンを作成します。 ペンの幅がデバイス単位で 1 以下の場合にのみ有効です。PS_DASHDOT
ダッシュとドットを交互に使用してペンを作成します。 ペンの幅がデバイス単位で 1 以下の場合にのみ有効です。PS_DASHDOTDOT
ダッシュと二重のドットを交互に使用してペンを作成します。 ペンの幅がデバイス単位で 1 以下の場合にのみ有効です。PS_NULL
null ペンを作成します。PS_INSIDEFRAME
外接する四角形 (たとえば、Ellipse
、Rectangle
、RoundRect
、Pie
、およびChord
メンバー関数) を指定する Windows GDI 出力関数によって生成された閉じた図形のフレーム内に線を描画するペンを作成します。 外接する四角形 (LineTo
メンバー関数など) を指定しない Windows GDI 出力関数でこのスタイルを使用する場合、ペンの描画領域はフレームによって制限されません。
CPen
コンストラクターの 2 番目のバージョンでは、型、スタイル、終了キャップ、結合属性の組み合わせを指定します。 各カテゴリの値は、ビットごとの "or" (|
) 演算子を使用して結合する必要があります。 ペンの種類には、次のいずれかの値を指定できます。
PS_GEOMETRIC
ジオメトリック ペンを作成します。PS_COSMETIC
化粧ペンを作成します。CPen
コンストラクターの 2 番目のバージョンでは、nPenStyle
に次のペン スタイルが追加されます。PS_ALTERNATE
他のすべてのピクセルを設定するペンを作成します。 (このスタイルは、化粧品用ペンにのみ適用されます)。PS_USERSTYLE
ユーザーが指定したスタイル配列を使用するペンを作成します。エンド キャップには、次のいずれかの値を指定できます。
PS_ENDCAP_ROUND
エンド キャップは丸型です。PS_ENDCAP_SQUARE
エンド キャップは正方形です。PS_ENDCAP_FLAT
エンド キャップはフラットです。結合には、次のいずれかの値を指定できます。
PS_JOIN_BEVEL
結合は面取りされます。PS_JOIN_MITER
結合は、SetMiterLimit
関数によって設定された現在の制限内にある場合に miter されます。 結合がこの制限を超えると、面取りされます。PS_JOIN_ROUND
結合はラウンドです。
nWidth
ペンの幅を指定します。
コンストラクターの最初のバージョンでは、値 0 は値 1 と同様に扱われますが、ペンが使用される Graphics オブジェクトに対して有効なスケール変換操作の影響を受けません。幅は常に 1 ピクセルです。
コンストラクターの 2 番目のバージョンでは、
nPenStyle
がPS_GEOMETRIC
場合、幅は論理単位で指定されます。nPenStyle
がPS_COSMETIC
の場合は、幅を 1 に設定する必要があります。
crColor
ペンの RGB 色を含みます。
pLogBrush
LOGBRUSH
構造体を指します。 nPenStyle
がPS_COSMETIC
場合、LOGBRUSH
構造体のlbColor
メンバーはペンの色を指定し、LOGBRUSH
構造体のlbStyle
メンバーをBS_SOLID
に設定する必要があります。 nPenStyle
がPS_GEOMETRIC
の場合は、すべてのメンバーを使用してペンのブラシ属性を指定する必要があります。
nStyleCount
lpStyle
配列の長さを doubleword 単位で指定します。 nPenStyle
がPS_USERSTYLE
されていない場合、この値は 0 である必要があります。
lpStyle
doubleword 値の配列を指します。 最初の値は、ユーザー定義スタイルの最初のダッシュの長さを指定し、2 番目の値は最初のスペースの長さを指定します。 nPenStyle
がPS_USERSTYLE
されていない場合は、このポインターをNULL
する必要があります。
解説
引数なしでコンストラクターを使用する場合は、CreatePen
、CreatePenIndirect
、またはCreateStockObject
メンバー関数を使用して、結果のCPen
オブジェクトを初期化する必要があります。
引数を受け取るコンストラクターを使用する場合、それ以上の初期化は必要ありません。 引数を持つコンストラクターは、エラーが発生した場合に例外をスローできますが、引数のないコンストラクターは常に成功します。
例
// Create a solid red pen of width 2.
CPen myPen1(PS_SOLID, 2, RGB(255, 0, 0));
// Create a geometric pen.
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 255, 0);
CPen myPen2(PS_DOT | PS_GEOMETRIC | PS_ENDCAP_ROUND, 2, &logBrush);
CPen::CreatePen
スタイル、幅、ブラシの属性を指定して、論理的な外観または幾何学的なペンを作成し、 CPen
オブジェクトにアタッチします。
BOOL CreatePen(
int nPenStyle,
int nWidth,
COLORREF crColor);
BOOL CreatePen(
int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount = 0,
const DWORD* lpStyle = NULL);
パラメーター
nPenStyle
ペンのスタイルを指定します。 使用可能な値の一覧については、CPen
コンストラクターの nPenStyle
パラメーターを参照してください。
nWidth
ペンの幅を指定します。
CreatePen
の最初のバージョンでは、値 0 は値 1 と同様に処理されます。ただし、ペンが使用されている Graphics オブジェクトに対して有効なスケール変換操作の影響を受けません。幅は常に 1 ピクセルです。CreatePen
の 2 番目のバージョンでは、nPenStyle
がPS_GEOMETRIC
されている場合、幅は論理単位で指定されます。nPenStyle
がPS_COSMETIC
の場合は、幅を 1 に設定する必要があります。
crColor
ペンの RGB 色を含みます。
pLogBrush
LOGBRUSH
構造体を指します。 nPenStyle
がPS_COSMETIC
場合、LOGBRUSH
構造体のlbColor
メンバーはペンの色を指定し、LOGBRUSH
構造体のlbStyle
メンバーをBS_SOLID
に設定する必要があります。 nPenStyle
がPS_GEOMETRIC
の場合は、すべてのメンバーを使用してペンのブラシ属性を指定する必要があります。
nStyleCount
lpStyle
配列の長さを doubleword 単位で指定します。 nPenStyle
がPS_USERSTYLE
されていない場合、この値は 0 である必要があります。
lpStyle
doubleword 値の配列を指します。 最初の値は、ユーザー定義スタイルの最初のダッシュの長さを指定し、2 番目の値は最初のスペースの長さを指定します。 nPenStyle
がPS_USERSTYLE
されていない場合は、このポインターをNULL
する必要があります。
戻り値
成功した場合は 0 以外、メソッドが失敗した場合は 0。
解説
CreatePen
の最初のバージョンでは、指定したスタイル、幅、色でペンを初期化します。 その後、任意のデバイス コンテキストの現在のペンとしてペンを選択できます。
幅が 1 ピクセルを超えるペンには、常に PS_NULL
、 PS_SOLID
、または PS_INSIDEFRAME
スタイルが必要です。
ペンに PS_INSIDEFRAME
スタイルがあり、論理カラー テーブルの色と一致しない色がある場合、ペンはディザリングされた色で描画されます。 PS_SOLID
ペン スタイルを使用して、ディザリングされた色のペンを作成することはできません。 ペンの幅が 1 以下の場合、 PS_INSIDEFRAME
スタイルは PS_SOLID
と同じです。
2 番目のバージョンの CreatePen
は、スタイル、幅、ブラシの属性を指定した、論理的な外観または幾何学的ペンを初期化します。 化粧品用ペンの幅は常に1です。ジオメトリック ペンの幅は常にワールド単位で指定されます。 アプリケーションは、論理ペンを作成した後、 CDC::SelectObject
関数を呼び出すことによって、そのペンをデバイス コンテキストに選択できます。 ペンをデバイス コンテキストに選択した後、線と曲線を描画するために使用できます。
nPenStyle
がPS_COSMETIC
され、PS_USERSTYLE
されている場合、lpStyle
配列内のエントリは、スタイル単位でダッシュとスペースの長さを指定します。 スタイル単位は、ペンを使用して線を描画するデバイスによって定義されます。nPenStyle
がPS_GEOMETRIC
でPS_USERSTYLE
場合、lpStyle
配列内のエントリは、ダッシュとスペースの長さを論理単位で指定します。nPenStyle
がPS_ALTERNATE
されている場合、スタイル単位は無視され、他のすべてのピクセルが設定されます。
アプリケーションで特定のペンが不要になった場合は、リソースが使用されなくなったように、 CGdiObject::DeleteObject
メンバー関数を呼び出すか、 CPen
オブジェクトを破棄する必要があります。 デバイス コンテキストでペンが選択されている場合、アプリケーションはペンを削除しないでください。
例
CPen myPen1, myPen2;
// Create a solid red pen of width 2.
myPen1.CreatePen(PS_SOLID, 2, RGB(255, 0, 0));
// Create a geometric pen.
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 255, 0);
myPen2.CreatePen(PS_DOT | PS_GEOMETRIC | PS_ENDCAP_ROUND, 2, &logBrush);
CPen::CreatePenIndirect
lpLogPen
が指す構造体で指定されたスタイル、幅、色を持つペンを初期化します。
BOOL CreatePenIndirect(LPLOGPEN lpLogPen);
パラメーター
lpLogPen
ペンに関する情報を含む Windows LOGPEN
構造体を指します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
幅が 1 ピクセルを超えるペンには、常に PS_NULL
、 PS_SOLID
、または PS_INSIDEFRAME
スタイルが必要です。
ペンに PS_INSIDEFRAME
スタイルがあり、論理カラー テーブルの色と一致しない色がある場合、ペンはディザリングされた色で描画されます。 ペンの幅が 1 以下の場合、 PS_INSIDEFRAME
スタイルは PS_SOLID
と同じです。
例
LOGPEN logpen;
CPen cMyPen;
// Get the LOGPEN of an existing pen.
penExisting.GetLogPen(&logpen);
// Change the color to red and the width to 2.
logpen.lopnWidth.x = 2;
logpen.lopnColor = RGB(255, 0, 0);
// Create my pen using the new settings.
cMyPen.CreatePenIndirect(&logpen);
CPen::FromHandle
Windows GDI ペン オブジェクトへのハンドルを指定した CPen
オブジェクトへのポインターを返します。
static CPen* PASCAL FromHandle(HPEN hPen);
パラメーター
hPen
HPEN
ハンドルを Windows GDI ペンに接続します。
戻り値
成功した場合は CPen
オブジェクトへのポインター。それ以外の場合は NULL
。
解説
CPen
オブジェクトがハンドルにアタッチされていない場合は、一時的なCPen
オブジェクトが作成されてアタッチされます。 この一時 CPen
オブジェクトは、アプリケーションがイベント ループで次にアイドル時間を過ぎ、その時点ですべての一時グラフィック オブジェクトが削除されるまでのみ有効です。 つまり、一時オブジェクトは、1 つのウィンドウ メッセージの処理中にのみ有効です。
例
// Convert an HPEN to a CPen*.
// NOTE: hPen is a valid pen handle.
CPen* pPen = CPen::FromHandle(hPen);
CPen::GetExtLogPen
EXTLOGPEN
基になる構造体を取得します。
int GetExtLogPen(EXTLOGPEN* pLogPen);
パラメーター
pLogPen
ペンに関する情報を含む EXTLOGPEN
構造体を指します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
EXTLOGPEN
構造体は、ペンのスタイル、幅、ブラシの属性を定義します。 たとえば、ペンの特定のスタイルに一致するように GetExtLogPen
を呼び出します。
ペン属性の詳細については、Windows SDK の次のトピックを参照してください。
例
次のコード例では、 GetExtLogPen
を呼び出してペンの属性を取得し、同じ色の新しい化粧品用ペンを作成する方法を示します。
EXTLOGPEN extlogpen;
penExisting.GetExtLogPen(&extlogpen);
CPen penOther;
LOGBRUSH LogBrush = { extlogpen.elpBrushStyle, extlogpen.elpColor,
extlogpen.elpHatch };
penOther.CreatePen(PS_COSMETIC, 1, &LogBrush);
CPen::GetLogPen
基になる LOGPEN
構造体を取得します。
int GetLogPen(LOGPEN* pLogPen);
パラメーター
pLogPen
ペンに関する情報を格納する LOGPEN
構造体を指します。
戻り値
正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
解説
LOGPEN
構造体は、ペンのスタイル、色、パターンを定義します。
たとえば、 GetLogPen
を呼び出して、ペンの特定のスタイルに一致させます。
ペン属性の詳細については、Windows SDK の次のトピックを参照してください。
例
次のコード例では、 GetLogPen
を呼び出してペン文字を取得し、同じ色の新しいソリッド ペンを作成する方法を示します。
LOGPEN logpen;
penExisting.GetLogPen(&logpen);
CPen penOther(PS_SOLID, 0, logpen.lopnColor);
CPen::operator HPEN
CPen
オブジェクトの添付 Windows GDI ハンドルを取得します。
operator HPEN() const;
戻り値
成功した場合は、 CPen
オブジェクトによって表される Windows GDI オブジェクトへのハンドル。それ以外の場合は NULL
。
解説
この演算子は、HPEN
オブジェクトの直接使用をサポートするキャスト演算子です。
グラフィック オブジェクトの使用の詳細については、Windows SDK のグラフ オブジェクトに関する記事を参照してください。
例
// Create a solid red pen of width 2.
CPen myPen(PS_SOLID, 2, RGB(255, 0, 0));
// Get the handle of the pen object.
HPEN hPen = (HPEN)myPen;