Добавьте Код, чтобы Поддержать Новый Объект COM ATL
1 Теперь мы должны добавить код, чтобы поддержать новый интерфейс. Сначала добавьте включающийся для dcapi.idl файла AsdkDesignCenterSamp .idl. Это включает, должен быть сделан после двух заданного по умолчанию импорта:
import "oaidl.idl";
import "ocidl.idl";
#include "dcapi.idl"
2 Открывают AsdkDcContent .h файл заголовка и изменяют{*заменяют*} образование для нового класса, чтобы включить CWINDOWIMPLBASE и IAcDcContentView следующим образом:
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
{
3 Теперь вводят интерфейсы объекта в карту 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()
4 Добавляют карту сообщения к классу:
BEGIN_MSG_MAP(CAsdkDcContent)
END_MSG_MAP()
5 Добавляют следующие объявления для интерфейса IAcDcContentView и некоторых сервисных методов:
public:
void OpenAndDisplayTextFile();
void OpenAndInsertTextFile();
CString OpenAndReadTextFile(DWORD& length);
STDMETHOD(Initialize)(/*[in]*/ VARIANT varBrowser);
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);
private:
char * m_strSelectedItemText;
IAcDcContentBrowser* m_pBrowser;
6 Добавляют код, чтобы осуществить методы, только добавленные. Обратите внимание, что многие из этих методов только необходимы закончить интерфейс. Пример использует одиночный щелчок (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)
{
m_pBrowser = (IAcDcContentBrowser*)varBrowser.punkVal;
m_pBrowser->AddRef();
return S_OK;
}
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 = 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;
}
7 Теперь включают соответствующие файлы заголовка в sdtafx.h файл. Вы будете также должны добавить определение, чтобы неопределить _DEBUG, так как библиотеки AutoCAD - не-отладка. Имеется то, что файл должен напомнить:
#if defined(_DEBUG) && !defined(ARX_DEBUG)
#undef _DEBUG
#define ARX_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>
#ifdef ARX_DEBUG
#undef ARX_DEBUG
#define _DEBUG
#endif