分享

CDC::EnumObjects

 春夜喜雨LBR 2017-07-30
int EnumObjects( 
   int nObjectType, 
   int ( CALLBACK * lpfn )( LPVOID, LPARAM ), 
   LPARAM lpData 
);

nObjectType

指定目标类型。 它可以具有值 OBJ_BRUSH 或 OBJ_PEN

lpfn

由应用程序提供的回调函数的程序实例地址。 请参见“备注”以下各节。

lpData

指向由应用程序提供的数据。 该数据传递给回调函数与对象信息。

指定 回调函数返回的最后一个值。 其含义是用户定义的。

对于给定类型的每个对象,通过调用回调函数调用与该对象的信息。 系统调用回调函数,它就对象或回调函数返回0。

请注意Microsoft Visual C++新功能允许您使用普通函数作为函数传递给 EnumObjects 该地址传递给 EnumObjects 是指向函数的指针导出与EXPORT 和使用Pascal调用约定。 在保护模式应用程序,因此不必使用Windows MakeProcInstance 函数创建此功能或释放函数使用后使用FreeProcInstance Windows功能。

您也不必导出在一个 EXPORTS 语句的函数名在应用程序的模块定义文件。 可以使用 EXPORT 功能修饰符,为

int CALLBACK EXPORT AFunction(LPSTRLPSTR);

导致编译器发出名称导出的相应导出记录,不带锯齿化。 对于大部分工作需要。 对于某些特殊情况,例如导出函数的序号或失真导出,您可以在模块定义文件仍需要使用 EXPORTS 语句。

对于生成的Microsoft基础程序,通常使用/GA和/GEs编译器选项。 /Gw编译器选项不使用Microsoft基础选件类。 (如果使用Windows功能MakeProcInstance,您将需要显式转换从 FARPROC 的返回的函数指针到此API需要的类型。)回调注册接口现在为类型安全的(在指向正确类型的特定回调的函数)的函数指针必须通过。

另外请注意所有回调函数必须在返回之前捕获Microsoft基础异常。Windows中,因为异常不能在回调边界时引发。 有关异常的更多信息,请参见文章 异常

// 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));
   }
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多