添加代码以支持新的 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-3-28 16:28
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.