次の方法で共有


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

参照

参照

CDC クラス

階層図

EnumObjects

その他の技術情報

CDC のメンバー