CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

ObjectARX 开发指南

添加代码以支持新的 ATL COM 对象

2022-12-31 08:32| 发布者: admin| 查看: 694| 评论: 0|来自: AutoCAD

添加代码以支持新接口。首先将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;

Add the code to implement the methods just added to the CPP file. Note that many of these methods do nothing but are necessary to complete the interface. The example makes use of the single-click (PaletteItemClick) and double-click (PaletteItemDblClick) events.

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;
}

Include the appropriate header files in the sdtafx.h file. You will also need to add a definition to undefine , since the AutoCAD libraries are non-debug. Here is what the file should look like:_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,因此其注册将推迟到运行时。


路过

雷人

握手

鲜花

鸡蛋

最新评论

QQ|Archiver|CAD开发者社区 ( 苏ICP备2022047690号-1 )

GMT+8, 2024-5-19 12:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部