查看单个帖子
旧 2007-05-20, 09:31 AM   #4
yogy
高级会员
 
注册日期: 06-11
帖子: 1527
精华: 15
现金: 6353 标准币
资产: 6353 标准币
yogy 向着好的方向发展
默认 回复: _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;

}
yogy离线中   回复时引用此帖