2 Затем добавляют необходимые изменения, чтобы делать проект ObjectARX совместимым.
Это включает добавление следующего входного кода в конец AsdkDesignCenterSamp. cpp file:
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)
{
switch(msg)
{
case AcRx::kInitAppMsg:
acrxRegisterAppMDIAware(appId);
break;
case AcRx::kUnloadAppMsg:
break;
default:
break;
}
return AcRx::kRetOK;
}
3 Вы будете также должны добавить соответствующие назначения к проекту и экспортировать следующие символы в файле определения (.def):
acrxEntryPoint
_SetacrxPtp
acrxGetApiVersion
Добавьте Поддержку Системного реестра и Новый Объект COM ATL
1 Добавляют следующую функцию инициализации системного реестра к AsdkDesignCenterSamp. cpp. Эта функция основает системный реестр, основанный на ресурсах системного реестра, которые будут добавлены в более позднем шаге.
void registerAppInfo(HINSTANCE hInstance)
{
USES_CONVERSION;
HRESULT hRes = S_OK;
CComPtr<IRegistrar> p;
hRes = CoCreateInstance(CLSID_Registrar, NULL,
CLSCTX_INPROC_SERVER, IID_IRegistrar, (void**)&p);
if(SUCCEEDED(hRes))
{
// Get the AutoCAD Product key from the
// registry into a CString.
//
CString csProdKey = acrxProductKey();
// Use CStrings to obtain the authorization
// stamp from the registry.
//
CString csPath = "SOFTWARE\\Autodesk\\AutoCAD\\R15.0\\";
CString csStamp = csProdKey. Right(csProdKey. GetLength()
- csPath. GetLength());
_TCHAR szRegKey[_MAX_PATH];
_tcscpy(szRegKey, csStamp);
LPOLESTR pszId = T2OLE("AUTH");
// do a runtime swap of the registry key value.
//
p->AddReplacement(pszId, T2OLE(szRegKey));
_TCHAR szModule[_MAX_PATH];
GetModuleFileName(hInstance, szModule, _MAX_PATH);
LPCOLESTR szType = OLESTR("REGISTRY");
LPOLESTR pszModule = T2OLE(szModule);
// Pull the registry entries from the resource ID.
//
hRes = p->ResourceRegister(pszModule, IDR_REGISTRY1,
szType);
if(FAILED(hRes))
AfxMessageBox("Error registering the app info.");
}
}
2 Теперь добавляют новый Объект ATL, который поддержит интерфейс IAcDcContentView.
В Visual C++, выберите Вставку, Новый Объект ATL. В диалоге выбирают Объекты и выбирают Простой Объект. Нажмите Next, и введите имя для Объекта ATL. Для этого примера, назовите это AsdkDcContent. Теперь выберите позицию табуляции Names, и щелчок поддерживает ISupportErrorInfo. Нажмите OK, чтобы создать объект.
3 Затем мы должны добавить некоторую информацию системного реестра к секции ресурса проекта. Сначала создайте новый файл по имени AsdkDesignCenterSamp. rgs. Следующая распечатка должна быть изменена для вашего определенного проекта, где ID класса (CLSID) должен быть скопирован с вашего файла IDL. Используйте CLSID, который соответствует интерфейсу IAsdkDcContent. Так как они - значения GUID, они отличны для каждого нового проекта. Также для других проектов, Вы будете должны изменить секции расширений и также добавлять имя вашего определенного класса. Снова, этот пример использует AsdkDcContent.
HKLM
{
NoRemove ’SOFTWARE’
{
NoRemove ’Autodesk’
{
NoRemove ’AutoCAD’
{
NoRemove ’R15.0’
{
NoRemove ’%AUTH%’
{
NoRemove ’AutodeskApps’
{
NoRemove ’AcadDC’
{
NoRemove ’Extensions’
{
ForceRemove ’.txt’
{
val CLSID = s ’{<Your CLSID>}’
IconIndex = d ’0’
}
}
NoRemove ’Applications’
{
ForceRemove ’AsdkDcContent’
{
’Extensions’
{
.txt
{
val CLSID = s ’{<Your CLSID>}’
val IconIndex = d ’0’
}
}
CustomView = s ’Yes’
}
}
}
}
}
}
}
}
}
}
Сохраните этот файл, и в Visual C++ приносят ResourceView вперед. Откройте распечатку ресурсов, и разверните узла “REGISTRY”. Правый щелчок и импорт файл системного реестра. Это должно дать ресурсу ID IDR_REGISTRY1, но если это делает не, переименуйте это так, чтобы это соответствовало запросу в registerAppInfo.
Добавьте Код, чтобы Поддержать Новый Объект 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);
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


