CDC::EnumObjects
デバイス コンテキストで利用できるペンとブラシを列挙します。
int EnumObjects(
int nObjectType,
int ( CALLBACK * lpfn )( LPVOID, LPARAM ),
LPARAM lpData
);
パラメーター
nObjectType
オブジェクトの型。 OBJ_BRUSH または OBJ_PEN のいずれかの値を持ちます。lpfn
アプリケーション提供のコールバック関数のプロシージャ インスタンス アドレス。 詳細については「解説」を参照してください。lpData
アプリケーション提供のデータへのポインター。 データは、オブジェクト情報と共にコールバック関数に渡されます。
戻り値
CDC::EnumObjects 用コールバック関数が最後に返した値を返します。 その値はユーザーが意味を定義したものです。
解説
指定された型のオブジェクトごとに、そのオブジェクトの情報がコールバック関数への引数として渡されます。 すべてのオブジェクトが列挙されるか、コールバック関数が 0 を返すまで、システムはコールバック関数を呼び出します。
Microsoft Visual C++ の新しい特徴として、EnumObjects に渡す関数に通常の関数が使えることに注意してください。 EnumObjects に渡されるアドレスは EXPORT でエクスポートされ、Pascal 呼び出し規約を使った関数へのポインターです。 プロテクト モード アプリケーションでは、関数を Windows の MakeProcInstance 関数で作成する必要はなく、使用後に Windows の FreeProcInstance 関数を使って解放する必要もありません。
また、関数名をアプリケーションのモジュール定義ファイルの EXPORTS ステートメントでエクスポートする必要もありません。 その代わりに、次のように EXPORT 関数修飾子が使えます。
int CALLBACK EXPORT AFunction**(** LPSTR, LPSTR );
このとき、コンパイラは、エイリアスを使わずに名前によるエクスポートで正しいエクスポート レコードを作成します。 ほとんどの処理は、この機能で対応できます。 特別な場合として、順に関数をエクスポートした場合やエイリアスを使用して関数をエクスポートした場合は、従来どおりモジュール定義ファイルに EXPORTS ステートメントを使用する必要があります。
Microsoft Foundation プログラムをコンパイルするときに、通常は /GA および /GE コンパイラ オプションを使います。 /Gw コンパイラ オプションは MFC では使いません。 Windows の MakeProcInstance 関数を使うときは、返される関数へのポインターを FARPROC から API で要求される型に明示的にキャストする必要があります。コールバック関数の登録インターフェイスは現在はタイプ セーフです。関数のポインターには、特定のコールバックごとに正しい種類の関数へのポインターを渡す必要があります。
また、コールバック関数の外側で例外をスローすることができないので、Windows に戻る前にすべてのコールバック関数は MFC の例外を残らずキャッチする必要があることに注意してください。 例外の詳細については、「例外処理 (MFC)」を参照してください。
使用例
// print some info about a pen we're ready to enumerate
BOOL CALLBACK EnumObjectHandler(LPVOID lpLogObject, LPARAM /* lpData */)
{
LOGPEN* pPen = (LOGPEN*) lpLogObject;
switch (pPen->lopnStyle)
{
case PS_SOLID:
TRACE0("PS_SOLID: ");
break;
case PS_DASH:
TRACE0("PS_DASH: ");
break;
case PS_DOT:
TRACE0("PS_DOT: ");
break;
case PS_DASHDOT:
TRACE0("PS_DASHDOT: ");
break;
case PS_DASHDOTDOT:
TRACE0("PS_DASHDOTDOT: ");
break;
case PS_NULL:
TRACE0("PS_NULL: ");
break;
case PS_INSIDEFRAME:
TRACE0("PS_INSIDEFRAME:");
break;
default:
TRACE0("unk style:");
}
TRACE2("Color: 0x%8.8X, Width: %d\n", pPen->lopnColor, pPen->lopnWidth);
return TRUE;
}
// get the default printer and enumerate the pens it has
void CDCView::OnEnumPens()
{
CPrintDialog dlg(FALSE);
dlg.GetDefaults();
HDC hdc = dlg.GetPrinterDC();
if (hdc != NULL)
{
CDC dc;
dc.Attach(hdc);
VERIFY(dc.EnumObjects(OBJ_PEN, EnumObjectHandler, 0));
}
}
必要条件
**ヘッダー:**afxwin.h