CDC::EnumObjects
更新 : 2007 年 11 月
デバイス コンテキストで利用できるペンとブラシを列挙します。
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