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 オブジェクト」を参照してください。

継承階層

CObject

CGdiObject

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 外接する四角形 (たとえば、 EllipseRectangleRoundRectPie、および 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 番目のバージョンでは、 nPenStylePS_GEOMETRIC場合、幅は論理単位で指定されます。 nPenStylePS_COSMETICの場合は、幅を 1 に設定する必要があります。

crColor
ペンの RGB 色を含みます。

pLogBrush
LOGBRUSH構造体を指します。 nPenStylePS_COSMETIC場合、LOGBRUSH構造体のlbColorメンバーはペンの色を指定し、LOGBRUSH構造体のlbStyleメンバーをBS_SOLIDに設定する必要があります。 nPenStylePS_GEOMETRICの場合は、すべてのメンバーを使用してペンのブラシ属性を指定する必要があります。

nStyleCount
lpStyle配列の長さを doubleword 単位で指定します。 nPenStylePS_USERSTYLEされていない場合、この値は 0 である必要があります。

lpStyle
doubleword 値の配列を指します。 最初の値は、ユーザー定義スタイルの最初のダッシュの長さを指定し、2 番目の値は最初のスペースの長さを指定します。 nPenStylePS_USERSTYLEされていない場合は、このポインターをNULLする必要があります。

解説

引数なしでコンストラクターを使用する場合は、CreatePenCreatePenIndirect、または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 番目のバージョンでは、nPenStylePS_GEOMETRICされている場合、幅は論理単位で指定されます。 nPenStylePS_COSMETICの場合は、幅を 1 に設定する必要があります。

crColor
ペンの RGB 色を含みます。

pLogBrush
LOGBRUSH構造体を指します。 nPenStylePS_COSMETIC場合、LOGBRUSH構造体のlbColorメンバーはペンの色を指定し、LOGBRUSH構造体のlbStyleメンバーをBS_SOLIDに設定する必要があります。 nPenStylePS_GEOMETRICの場合は、すべてのメンバーを使用してペンのブラシ属性を指定する必要があります。

nStyleCount
lpStyle配列の長さを doubleword 単位で指定します。 nPenStylePS_USERSTYLEされていない場合、この値は 0 である必要があります。

lpStyle
doubleword 値の配列を指します。 最初の値は、ユーザー定義スタイルの最初のダッシュの長さを指定し、2 番目の値は最初のスペースの長さを指定します。 nPenStylePS_USERSTYLEされていない場合は、このポインターをNULLする必要があります。

戻り値

成功した場合は 0 以外、メソッドが失敗した場合は 0。

解説

CreatePenの最初のバージョンでは、指定したスタイル、幅、色でペンを初期化します。 その後、任意のデバイス コンテキストの現在のペンとしてペンを選択できます。

幅が 1 ピクセルを超えるペンには、常に PS_NULLPS_SOLID、または PS_INSIDEFRAME スタイルが必要です。

ペンに PS_INSIDEFRAME スタイルがあり、論理カラー テーブルの色と一致しない色がある場合、ペンはディザリングされた色で描画されます。 PS_SOLIDペン スタイルを使用して、ディザリングされた色のペンを作成することはできません。 ペンの幅が 1 以下の場合、 PS_INSIDEFRAME スタイルは PS_SOLID と同じです。

2 番目のバージョンの CreatePen は、スタイル、幅、ブラシの属性を指定した、論理的な外観または幾何学的ペンを初期化します。 化粧品用ペンの幅は常に1です。ジオメトリック ペンの幅は常にワールド単位で指定されます。 アプリケーションは、論理ペンを作成した後、 CDC::SelectObject 関数を呼び出すことによって、そのペンをデバイス コンテキストに選択できます。 ペンをデバイス コンテキストに選択した後、線と曲線を描画するために使用できます。

  • nPenStylePS_COSMETICされ、PS_USERSTYLEされている場合、lpStyle配列内のエントリは、スタイル単位でダッシュとスペースの長さを指定します。 スタイル単位は、ペンを使用して線を描画するデバイスによって定義されます。

  • nPenStylePS_GEOMETRICPS_USERSTYLE場合、lpStyle配列内のエントリは、ダッシュとスペースの長さを論理単位で指定します。

  • nPenStylePS_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_NULLPS_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;

関連項目

CGdiObject クラス
階層図
CBrush クラス