ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Добавьте Код, чтобы Поддержать Новый Объект 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


Содержание раздела