添加代码以支持新的 ATL COM 对象
添加代码以支持新接口。首先,将 dcapi.idl 文件的包含添加到 AsdkDesignCenterSamp.idl。这应该在两个默认导入之后进行: import "oaidl.idl"; import "ocidl.idl"; #include "dcapi.idl" 打开 AsdkDcContent.h 头文件,并将新类的派生更改为包含,如下所示:CWindowImplBaseIAcDcContentView class ATL_NO_VTABLE CAsdkDcContent :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAsdkDcContent, &CLSID_AsdkDcContent>,
public ISupportErrorInfo,
public IDispatchImpl<IAsdkDcContent, &IID_IAsdkDcContent,
&LIBID_ASDKDESIGNCENTERSAMPLib>,
public CWindowImplBase,
public IAcDcContentView
{
使用宏将对象的接口输入到 COM 映射中:COM_INTERFACE_ENTRY BEGIN_COM_MAP(CAsdkDcContent) COM_INTERFACE_ENTRY(IAsdkDcContent) COM_INTERFACE_ENTRY(IDispatch) COM_INTERFACE_ENTRY(ISupportErrorInfo) COM_INTERFACE_ENTRY(IAcDcContentView) END_COM_MAP() 将消息映射添加到类中: BEGIN_MSG_MAP(CAsdkDcContent) END_MSG_MAP() 为接口和一些实用工具方法添加以下声明:IAcDcContentView public:
void OpenAndDisplayTextFile();
void OpenAndInsertTextFile();
CString OpenAndReadTextFile(DWORD& length);
STDMETHOD(Initialize)(
/*[in]*/ VARIANT varBrowser,
/*[in]*/ VARIANT varReserved);
STDMETHOD(SetImageLists)();
STDMETHOD(NavigatorNodeExpanding)(
/*[in]*/ VARIANT varhNode
, /*[in]*/ BSTR bstrFullPath);
STDMETHOD(NavigatorNodeCollapsing)(
/*[in]*/ VARIANT varhNode
, /*[in]*/ BSTR bstrFullPath);
STDMETHOD(NavigatorNodeClick)(
/*[in]*/ VARIANT varhNode
, /*[in, string]*/ BSTR bstrFullPath);
STDMETHOD(NavigatorMouseUp)(
/*[in]*/ VARIANT varhNode
, /*[in, string]*/ BSTR bstrFullPath
, /*[in]*/ VARIANT varX
, /*[in]*/ VARIANT varY);
STDMETHOD(PaletteItemClick)(/*[in]*/ BSTR bstrItemText);
STDMETHOD(PaletteItemDblClick)(/*[in]*/ BSTR bstrItemText);
STDMETHOD(PaletteColumnClick)(/*[in]*/ VARIANT varIndex);
STDMETHOD(PaletteMouseUp)(
/*[in]*/ VARIANT varButton
, /*[in]*/ VARIANT varItemTexts
, /*[in]*/ VARIANT varX
, /*[in]*/ VARIANT varY);
STDMETHOD(PaletteMouseDown)(
/*[in]*/ VARIANT varButton
, /*[in]*/ BSTR bstrFullText
, /*[in]*/ VARIANT varX
, /*[in]*/ VARIANT varY);
STDMETHOD(RenderPreviewWindow)(
/*[in]*/ BSTR bstrFullText
, /*[in]*/ VARIANT varhPreviewWindow);
STDMETHOD(PreviewMouseUp)(
/*[in]*/ VARIANT varButton
, /*[in]*/ VARIANT varX
, /*[in]*/ VARIANT varY);
STDMETHOD(Refresh)();
STDMETHOD(PaletteBeginDrag)(
/*[in]*/ VARIANT varItemTexts
, /*[in]*/ VARIANT varX
, /*[in]*/VARIANT varY);
STDMETHOD(ReleaseBrowser)();
STDMETHOD(QueryContextMenu)(
/*[in]*/ VARIANT varhMenu
, /*[in]*/ VARIANT varIndex
, /*[in]*/ VARIANT varCmdFirst
, /*[in]*/ VARIANT varCmdLast
, /*[in]*/ VARIANT varItemTexts);
STDMETHOD(InvokeCommand)(/*[in]*/ VARIANT varMenuID);
STDMETHOD(IsExpandable)(
/* [string][in] */ BSTR bstrItemText
, /* [retval][out] */ VARIANT __RPC_FAR
*pvarIsExpandable);
STDMETHOD(GetLargeImage)(
/* [in] */ BSTR bstrFileName
, /* [out][in] */ VARIANT __RPC_FAR
*pvarhLargeImage);
STDMETHOD(GetSmallImageListForContent)(
/*[in]*/ BSTR bstrFileName
, /*[out]*/ VARIANT *pvarhImageList);
STDMETHOD(GetLargeImageListForContent)(
/*[in]*/ BSTR bstrFileName
, /*[out]*/ VARIANT *pvarhImageList);
STDMETHOD(GetCommandString)(
/* [in] */ VARIANT varMenuID,
/* [in] */ dcMenuInfoFlag __MIDL_0011,
/* [out] */ VARIANT *pvarReserved,
/* [out] */ BSTR *pbstrName);
STDMETHOD(DeleteItemData)(
/* [in] */ dcItemDataSource dcSrc,
/* [in] */ VARIANT varItemDataArray);
private:
char * m_strSelectedItemText;
IAcDcContentBrowser* m_pBrowser;
添加代码以实现刚刚添加到 CPP 文件中的方法。请注意,其中许多方法什么都不做,但对于完成接口是必需的。该示例使用单击 (PaletteItemClick) 和双击 (PaletteItemDblClick) 事件。 Adesk::Boolean append(AcDbEntity* pEntity)
{
AcDbBlockTable *pBlockTable;
AcApDocument* pDoc = acDocManager->curDocument();
Acad::ErrorStatus es = acDocManager->lockDocument(pDoc);
if (es != Acad::eOk) {
acedAlert("Failed to lock the document!");
return Adesk::kFalse;
}
AcDbDatabase* pDb = pDoc->database();
es = pDb->getBlockTable(pBlockTable, AcDb::kForRead);
if (es != Acad::eOk) {
acedAlert("Failed to get block table!");
return Adesk::kFalse;
}
AcDbBlockTableRecord *pBlockRec;
es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockRec,
AcDb::kForWrite);
if (es != Acad::eOk) {
acedAlert("Failed to get block table record!");
pBlockTable->close();
return Adesk::kFalse;
}
es = pBlockRec->appendAcDbEntity(pEntity);
if (es != Acad::eOk) {
acedAlert("Failed to append entity!");
pBlockTable->close();
pBlockRec->close();
delete pEntity;
return Adesk::kFalse;
}
pBlockRec->close();
pBlockTable->close();
acDocManager->unlockDocument(pDoc);
return Adesk::kTrue;
}
STDMETHODIMP CAsdkDcContent::Initialize(VARIANT varBrowser, VARIANT)
{
m_pBrowser = (IAcDcContentBrowser*)varBrowser.punkVal;
m_pBrowser->AddRef();
return S_OK;
}
STDMETHODIMP CAsdkDcContent::Initialize(
VARIANT varBrowser,
VARIANT varReserved)
{
return E_NOTIMPL;
}
STDMETHODIMP CAsdkDcContent::SetImageLists()
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::NavigatorNodeExpanding(
VARIANT varhNode,
BSTR bstrFullPath)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::NavigatorNodeCollapsing(
VARIANT varhNode,
BSTR bstrFullPath)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::NavigatorNodeClick(
VARIANT varhNode,
BSTR bstrFullPath)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::NavigatorMouseUp(
VARIANT varhNode,
BSTR bstrFullPath,
VARIANT varX,
VARIANT varY)
{
return S_OK;
}
CString CAsdkDcContent::OpenAndReadTextFile(DWORD& length)
{
CFile fileText;
fileText.Open(m_strSelectedItemText, CFile::modeRead);
length = (DWORD)fileText.GetLength();
char *strBuff = new char[length];
fileText.Read(strBuff, length);
fileText.Close();
CString cstrBuff(strBuff);
delete strBuff;
cstrBuff.SetAt(length, '\0');
cstrBuff.FreeExtra();
return cstrBuff;
}
void CAsdkDcContent::OpenAndDisplayTextFile()
{
DWORD length;
CString cstrBuff = OpenAndReadTextFile(length);
BSTR bstrBuf = cstrBuff.AllocSysString();
m_pBrowser->SetItemDescription(bstrBuf);
::SysFreeString(bstrBuf);
}
STDMETHODIMP CAsdkDcContent::PaletteItemClick(BSTR bstrItemText)
{
USES_CONVERSION;
m_strSelectedItemText = OLE2T(bstrItemText);
OpenAndDisplayTextFile();
return S_OK;
}
void CAsdkDcContent::OpenAndInsertTextFile()
{
DWORD length;
CString cstrBuff = OpenAndReadTextFile(length);
cstrBuff.Replace("\015\012", "\\P");
struct resbuf resbufViewCtr;
resbufViewCtr.restype = RT3DPOINT;
acedGetVar("VIEWCTR", &resbufViewCtr);
AcGePoint3d pt(resbufViewCtr.resval.rpoint[X],
resbufViewCtr.resval.rpoint[Y],
resbufViewCtr.resval.rpoint[Z]);
AcDbMText *pMText = new AcDbMText();
pMText->setLocation(pt);
pMText->setContents(cstrBuff);
append(pMText);
pMText->downgradeOpen();
pMText->draw();
pMText->close();
}
STDMETHODIMP CAsdkDcContent::PaletteItemDblClick(
BSTR bstrItemText)
{
USES_CONVERSION;
m_strSelectedItemText = OLE2T(bstrItemText);
OpenAndInsertTextFile();
return S_OK;
}
STDMETHODIMP CAsdkDcContent::PaletteColumnClick(
VARIANT varIndex)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::PaletteMouseUp(
VARIANT varButton,
VARIANT varItemTexts,
VARIANT varX,
VARIANT varY)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::PaletteMouseDown(
VARIANT varButton,
BSTR bstrFullText,
VARIANT varX, VARIANT varY)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::RenderPreviewWindow(
BSTR bstrFullText,
VARIANT varhPreviewWindow)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::PreviewMouseUp(
VARIANT varButton,
VARIANT varX,
VARIANT varY)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::Refresh()
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::PaletteBeginDrag(
VARIANT varItemTexts,
VARIANT varX,
VARIANT varY)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::ReleaseBrowser()
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::QueryContextMenu(
VARIANT varhMenu,
VARIANT varIndex,
VARIANT varCmdFirst,
VARIANT varCmdLast,
VARIANT varItemTexts)
{
return S_OK;
}
STDMETHODIMP CAsdkDcContent::InvokeCommand(VARIANT varMenuID)
{
return S_OK;
}
STDMETHODIMP
CAsdkDcContent::IsExpandable(
/* [string][in] */ BSTR bstrItemText,
/* [retval][out] */ VARIANT __RPC_FAR *pvarIsExpandable)
{
pvarIsExpandable->iVal = TRUE;
return S_OK;
}
STDMETHODIMP
CAsdkDcContent::GetLargeImage(
/* [in] */ BSTR bstrFileName,
/* [out][in] */ VARIANT __RPC_FAR *pvarhLargeImage)
{
return E_NOTIMPL;
}
STDMETHODIMP
CAsdkDcContent::GetSmallImageListForContent(
BSTR bstrFileName,
VARIANT *pvarhImageList)
{
return E_NOTIMPL;
}
STDMETHODIMP
CAsdkDcContent::GetLargeImageListForContent(
BSTR bstrFileName,
VARIANT *pvarhImageList)
{
return E_NOTIMPL;
}
STDMETHODIMP
CAsdkDcContent::GetCommandString(
VARIANT varMenuID,
dcMenuInfoFlag __MIDL_0011,
VARIANT *pvarReserved,
BSTR *pbstrName)
{
return E_NOTIMPL;
}
STDMETHODIMP
CAsdkDcContent::DeleteItemData(
dcItemDataSource dcSrc,
VARIANT varItemDataArray)
{
return E_NOTIMPL;
}
在 sdtafx.h 文件中包含相应的头文件。您还需要添加一个定义来取消定义,因为AutoCAD库是非调试的。下面是文件的外观:_DEBUG #if defined(_DEBUG) #undef _DEBUG #endif #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define STRICT #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #define _ATL_APARTMENT_THREADED #include <afxwin.h> #include <afxdisp.h> #include <atlbase.h> // You may derive a class from CComModule and use // it if you want to override something, but do not // change the name of _Module. // extern CComModule _Module; #include <atlcom.h> #include <atlwin.h> #include <adslib.h> #include <dbmain.h> #include <dbsymtb.h> #include <dbmtext.h> #include <acdocman.h> #include <aced.h> #include <rxregsvc.h> #endif 在项目属性中,删除调用regsvr32.exe的生成后步骤。 由于此应用程序依赖于acad.exe,因此其注册将推迟到运行时。 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-11-1 12:24
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.