CDC::EnumObjects
枚举钢笔和画笔可在设备上下文。
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**(LPSTR**,LPSTR);
导致编译器发出名称导出的相应导出记录,不带锯齿化。对于大部分工作需要。对于某些特殊情况,例如导出函数的序号或失真导出,您可以在模块定义文件仍需要使用 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));
}
}
要求
Header: afxwin.h