CAD开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

AutoCAD 2024 开发者帮助

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

2024-5-18 19:13| 发布者: admin| 查看: 17| 评论: 0|原作者: admin|来自: AutoCAD

添加代码以支持新的 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,因此其注册将推迟到运行时。

父主题:

  1. 自定义设计中心

路过

雷人

握手

鲜花

鸡蛋

最新评论

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

GMT+8, 2024-6-27 16:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部