高级会员
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
|
回复: _variant_t的使用&VC
R:
Hi,
Welcome.
1)AutoCAD中大多数的文字是AcadMText类型
2)查询子接口一般用
pEnt->QueryInterface(IID_IAcadMText,(void **)&pText);
3) 取VARIANT 中的数组参数时,Point用完后,记得调用SafeArrayUnaccessData(Point.parray);
4) 多去OpenDWG上官方论坛问问,先混个脸熟.
5)遇到取点坐标值时,double类型不行,换float类型试试.
6)你要查函数说明,建议你还是看Arx的帮助文档.
7)你给我的那些帮助看起来都不全,下个Arx开发包,里面的帮助要更完整些.
8)你要是打算用VC6.0, 下载的Arx开发包的版本不要太高,Arx2002~Arx2004就差不多了(记不太得了),再高一点的Arx版本下的例程你可能用VC6.0会打不开了.
PS:
你的代码我修改之后,已经通过编译.
bool CSampleWindow::FillTreeWithBlockEntities(HTREEITEM hParent, IAcadBlock *pBlock)
{
CComPtr<IUnknown> pUnk;
CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum;
CComQIPtr<IAcadEntity, &IID_IAcadEntity> pEnt;
CComQIPtr<IAcadMText, &IID_IAcadText> pText;///我加的
if (SUCCEEDED(pBlock->get__NewEnum(&pUnk)) && pUnk != NULL)
{
VARIANT varItem;
VariantInit(&varItem);
pNewEnum = pUnk;
while (pNewEnum->Next(1, &varItem, NULL) == S_OK)
{
CComBSTR bName;
/////////////////////
CComBSTR bstring;
////////////////////////////////
assert(VT_DISPATCH == varItem.vt);
pEnt = varItem.pdispVal;
// VariantClear(&varItem);
pEnt->get_ObjectName(&bName);
///////////////////////////////////
if(_strcmpi("AcDbMText",(LPCSTR)_bstr_t(bName,false))==0)
{
if (!pEnt)
return false;
try
{
pEnt->QueryInterface(IID_IAcadMText,(void **)&pText);
}
catch(...)
{
}
if (!pText)
return false;
pText->get_TextString(&bstring);
_variant_t Point;
VariantInit(&Point);
pText->get_InsertionPoint(&Point);
//IDispatch *pPnt = NULL;
double *pPnt = NULL;
long ind = 0;
// SafeArrayGetElement(Point.parray, &ind, (void*)&pPnt);
SafeArrayAccessData (Point.parray, (void**)&pPnt);
SafeArrayUnaccessData(Point.parray);
// release Point if no use
VariantClear(&Point);
//InsertItem(m_wndView, (LPCTSTR)_bstr_t(bstring), 0, 1, 111, hParent, TVI_LAST);
}
}
}
return true;
}
|