70002592 Fire VDF events in CPP COM project

Article 70002592
Type HowTo
Product Engine
Version 1102
Date Added 11/15/2024 12:00:00 AM
Fixed 11.3.2.0 (11/15/2024 12:00:00 AM)
Submitted by VectorDraw Team

Summary

Howto Fire VDF events in CPP COM project

Solution

//NOTE:when using CPP COM project is moe safe to set project->properties->Platform ToolSet to Visual Studio 2010
//Fire VDF events in CPP COM project
Example 1

//In this example we create a CProgressMeterEvents_Imp class that fires the events of vdDocument->MeterProgress

//Import the VDF neccesary tlbs //The folder of VDF libraries must set to the Additional Include Directories of CPP project properties
#import "System.Drawing.tlb"
#import "mscorlib.tlb" rename("ReportEvent","_ReportEvent")
#import "VectorDraw.Serialize.tlb"
#import "VectorDraw.Geometry.tlb" 
#import "VectorDraw.Render.tlb" 
#import "VectorDraw.Actions.tlb"
#import "VectorDraw.Professional.tlb" rename("GetEnvironmentVariable", "GetEnvVar")
#import "vdrawi5.tlb"  \
	rename("RGB","_RGB")  \
	rename("GetOpenFileName","_GetOpenFileName")  \


#include "afxctl.h"

//define the IID of the IProgressMeterEvents interface that defines the method events
#define eventIID  __uuidof(VectorDraw_Serialize::IProgressMeterEvents)
class CProgressMeterEvents_Imp : public CCmdTarget 
{
    DECLARE_DYNCREATE(CProgressMeterEvents_Imp)
    //the vdDocument->MeterProgress object that fire the events
    VectorDraw_Serialize::IProgressMeterPtr mObjectSender;
    //a refernce to the event connection
    DWORD m_dwCookie;
public:
    CProgressMeterEvents_Imp() {
        EnableAutomation();
    }
    //Method that make the connection between meterprogress sender and this object
    void Connect(VectorDraw_Serialize::IProgressMeterPtr pDisp)
    {
        LPUNKNOWN disp = this->GetIDispatch(FALSE);
        BOOL success = AfxConnectionAdvise(pDisp, eventIID, disp, FALSE, &m_dwCookie);
        if (!success) return;
        mObjectSender = pDisp;
    }
    //disconect when finish with them and need any more
    void Disconect()
    {
        if (mObjectSender == NULL) return;
        LPUNKNOWN disp = this->GetIDispatch(FALSE);
        BOOL success = AfxConnectionUnadvise(mObjectSender, eventIID, disp, FALSE, m_dwCookie);
        if (success) disp->Release();
        mObjectSender = NULL;
    }
    // Event override Methods from : VectorDraw_Serialize::IProgressMeterEvents
    void OnProgress(
        const _variant_t& sender,
        __int64 percent,
        LPCTSTR jobDescription)
    {
        VectorDraw_Serialize::IProgressMeterPtr src = sender;
        TCHAR path[100];
        _stprintf_s(path, 100, _T("\njobDescription = %s , percent = %i"), (LPTSTR)src->jobDescription,(int) percent);
        OutputDebugString(path);
    }
    void OnProgressStart(
        const _variant_t& sender,
        LPCTSTR jobDescription,
        __int64 meterLimit) 
    {
        VectorDraw_Serialize::IProgressMeterPtr src = sender;
        TCHAR path[100];
        _stprintf_s(path, 100, _T("\nProgress Started : jobDescription = %s , meterLimit = %i"), (LPTSTR)src->jobDescription, (int)meterLimit);
        OutputDebugString(path);
    }
    void OnProgressStop(
        const _variant_t& sender,
        LPCTSTR jobDescription)
    {
        VectorDraw_Serialize::IProgressMeterPtr src = sender;
        TCHAR path[100];
        _stprintf_s(path, 100, _T("\nProgress Stoped : jobDescription = %s"), jobDescription);
        OutputDebugString(path);
    }
    ~CProgressMeterEvents_Imp() {}
    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
};
IMPLEMENT_DYNCREATE(CProgressMeterEvents_Imp, CCmdTarget)
BEGIN_DISPATCH_MAP(CProgressMeterEvents_Imp, CCmdTarget)
    //Here we define all events of the VectorDraw_Serialize::IProgressMeterEvents interface see DISP_FUNCTION_ID for details
    DISP_FUNCTION_ID(CProgressMeterEvents_Imp, "OnProgress", 1, OnProgress, VT_EMPTY, VTS_VARIANT VTS_I8 VTS_BSTR)
    DISP_FUNCTION_ID(CProgressMeterEvents_Imp, "OnProgressStart", 2, OnProgressStart, VT_EMPTY, VTS_VARIANT VTS_BSTR VTS_I8 )
    DISP_FUNCTION_ID(CProgressMeterEvents_Imp, "OnProgressStop", 3, OnProgressStop, VT_EMPTY, VTS_VARIANT VTS_BSTR)
END_DISPATCH_MAP()
BEGIN_INTERFACE_MAP(CProgressMeterEvents_Imp, CCmdTarget)
    INTERFACE_PART(CProgressMeterEvents_Imp, eventIID, Dispatch)
END_INTERFACE_MAP()

//code:
//suppose we already have a CVdraw object control created 
CVdraw vdraw;
//get the default document of the control
VectorDraw_Professional::IvdDocumentPtr doc = vdraw->GetActiveDocument().GetWrapperObject();
//create a new document object
VectorDraw_Professional::IvdDocumentPtr tmpdoc = doc->Activator->CreateInstance("vdDocument");
//create the connection event object
CProgressMeterEvents_Imp* eventsVd1 = new CProgressMeterEvents_Imp();
//connect new document progress with our connection object
eventsVd1->Connect((VectorDraw_Serialize::IProgressMeterPtr)tmpdoc->MeterProgress);
//open a file to see the procedure progress to fire inside the connection object methods
tmpdoc->Open(_bstr_t(sourceFilePath));
//disconect
eventsVd1->Disconect();

Example 2 vdDocument events
//Import the VDF neccesary tlbs //The folder of VDF libraries must set to the Additional Include Directories of CPP project properties
#import "System.Drawing.tlb"
#import "mscorlib.tlb" rename("ReportEvent","_ReportEvent")
#import "VectorDraw.Serialize.tlb"
#import "VectorDraw.Geometry.tlb" 
#import "VectorDraw.Render.tlb" 
#import "VectorDraw.Actions.tlb"
#import "VectorDraw.Professional.tlb" rename("GetEnvironmentVariable", "GetEnvVar")
#import "vdrawi5.tlb"  \
	rename("RGB","_RGB")  \
	rename("GetOpenFileName","_GetOpenFileName")  \


#include "afxctl.h"

#define documenteventIID  __uuidof(VectorDraw_Professional::IvdDocumentEvents)
class CvdDocumentEvents_Imp : public CCmdTarget
{
    DECLARE_DYNCREATE(CvdDocumentEvents_Imp)
    //the vdDocument object that fire the events
    VectorDraw_Professional::IvdDocumentPtr mObjectSender;
    //a refernce to the event connection
    DWORD m_dwCookie;
public:
    CvdDocumentEvents_Imp() {
        EnableAutomation();
    }
    //Method that make the connection between document sender and this object
    void Connect(VectorDraw_Professional::IvdDocumentPtr pDisp)
    {
        LPUNKNOWN disp = this->GetIDispatch(FALSE);
        BOOL success = AfxConnectionAdvise(pDisp, documenteventIID, disp, FALSE, &m_dwCookie);
        if (!success) return;
        mObjectSender = pDisp;
    }
    //disconect when finish with them and need any more
    void Disconect()
    {
        if (mObjectSender == NULL) return;
        LPUNKNOWN disp = this->GetIDispatch(FALSE);
        BOOL success = AfxConnectionUnadvise(mObjectSender, documenteventIID, disp, FALSE, m_dwCookie);
        if (success) disp->Release();
        mObjectSender = NULL;
    }
    // Event override Methods from :VectorDraw_Professional::IvdDocumentEvents
    void OnIsValidOpenFormat(
        IDispatch* sender,
        LPCTSTR extension,
        VARIANT_BOOL* success){}
    void OnGetOpenFileFilterFormat(
        BSTR* openFilter){
        //Write your code here
    }
    void OnGetSaveFileFilterFormat(
        BSTR* saveFilter) {
        //Write your code here
    }
    void OnUndoStoreValue(
        IDispatch* sender,
        VARIANT_BOOL isRedo,
        const _variant_t& propObject,
        LPCTSTR propName,
        const _variant_t& value,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnAfterUndoStoreValue(
        IDispatch* sender,
        VARIANT_BOOL isRedo,
        const _variant_t& propObject,
        LPCTSTR propName,
        const _variant_t& value) {
        //Write your code here
    }
    void OnLoadUnknownFileName(
        IDispatch* sender,
        LPCTSTR FileName,
        VARIANT_BOOL* success) {
        //Write your code here
    }
    void OnSaveUnknownFileName(
        IDispatch* sender,
        LPCTSTR FileName,
        VARIANT_BOOL* success) {
        //Write your code here
    }
    void OnProgress(
        IDispatch* sender,
        __int64 percent,
        LPCTSTR jobDescription) {
        //Write your code here
    }
    void OnBeforeOpenDocument(
        IDispatch* sender) {
        //Write your code here
    }
    void OnAfterOpenDocument(
        IDispatch* sender) {
        //Write your code here
    }
    void OnAfterNewDocument(
        IDispatch* sender) {
        //Write your code here
    }
    void OnOpenUrl(
        IDispatch* sender,
        BSTR* urlname,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnNoFileFind(
        IDispatch* sender,
        BSTR* FileName,
        VARIANT_BOOL* success) {
        //Write your code here
    }
    void OnResizeControlWindow(
        IDispatch* sender,
        long cx,
        long cy,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnScroll(
        IDispatch* sender,
        double* cx,
        double* cy,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnPrompt(
        IDispatch* sender,
        BSTR* promptstr) {
        //Write your code here
    }
    void GripSelectionModified(
        IDispatch* sender,
        struct IvdLayout* layout,
        struct IvdSelection* gripSelection) {
        //Write your code here
    }
    void ActionLayoutActivated(
        IDispatch* sender,
        struct IvdLayout* deactivated,
        struct IvdLayout* activated) {
        //Write your code here
    }
    void GetDimensionText(
        IDispatch* sender,
        BSTR* newText) {
        //Write your code here
    }
    void ActionError(
        IDispatch* sender,
        LPTSTR actionName) {
        //Write your code here
    }
    void ActionEnd(
        IDispatch* sender,
        LPTSTR actionName) {
        //Write your code here
    }
    void ActionStart(
        IDispatch* sender,
        LPTSTR actionName,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void GetPassWord(
        IDispatch* sender,
        LPCTSTR drawingname,
        BSTR* password,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void GenericError(
        IDispatch* sender,
        LPCTSTR Membername,
        LPCTSTR errormessage) {
        //Write your code here
    }
    void OnPolarTrackToolTip(
        IDispatch* sender,
        struct VectorDraw_Geometry::IgPoint* referencePoint,
        struct VectorDraw_Geometry::IgPoint* currentPoint,
        BSTR* tooltipText,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnPolarTrackAngleValidate(
        IDispatch* sender,
        struct VectorDraw_Geometry::IgPoint* referencePoint,
        struct VectorDraw_Geometry::IgPoint* currentPoint,
        double DefaultEquality,
        double* NewTrackingAngle,
        VARIANT_BOOL* isValid,
        VARIANT_BOOL* Cancel) {
        //Write your code here
    }
    void OnObjectHandleChanged(
        IDispatch* sender,
        struct IvdObject* obj,
        LPCTSTR ExistingHandleHEX) {
        //Write your code here
    }
    void OnRequestLicVal(
        IDispatch* sender,
        LPCTSTR UrlFileName,
        BSTR* LicenseValue) {
        //Write your code here
    }
    void OnFilterOsnap(
        IDispatch* sender,
        struct IFilterOsnapEventArgs* args) {
        //Write your code here
    }
    void LoadUnknownObjects(
        const _variant_t& sender,
        struct ILoadUnknownObjectsEventArgs* eventArgs) {
        //Write your code here
    }
    void OnActionMouseMove(
        IDispatch* sender,
        struct VectorDraw_Actions::IBaseAction* action) {
        //Write your code here
    }
    void OnFigureMouseOver(
        IDispatch* sender,
        struct IFigureMouseEventArgs* args) {
        //Write your code here
    }
    void OnViewCubeClick(
        IDispatch* sender,
        struct IViewCubeClickArgs* args) {
        //Write your code here
    }
    void FilterActionPoint(
        IDispatch* sender,
        IDispatch* action,
        struct VectorDraw_Geometry::IgPoint** Pt) {
        //Write your code here
    }
    void OnBeforeDocumentClear(
        struct IvdDocument* sender) {
        //Write your code here
    }
    ~CvdDocumentEvents_Imp() {}
    DECLARE_DISPATCH_MAP()
    DECLARE_INTERFACE_MAP()
};
IMPLEMENT_DYNCREATE(CvdDocumentEvents_Imp, CCmdTarget)
BEGIN_DISPATCH_MAP(CvdDocumentEvents_Imp, CCmdTarget)
    //Here we define all events of the VectorDraw_Professional::IvdDocumentEvents interface see DISP_FUNCTION_ID for details
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnIsValidOpenFormat", 60001, OnIsValidOpenFormat, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnGetOpenFileFilterFormat", 60003, OnGetOpenFileFilterFormat, VT_EMPTY, VTS_PBSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnGetSaveFileFilterFormat", 60004, OnGetSaveFileFilterFormat, VT_EMPTY, VTS_PBSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnUndoStoreValue", 60005, OnUndoStoreValue, VT_EMPTY, VTS_DISPATCH VTS_BOOL VTS_VARIANT VTS_BSTR VTS_VARIANT VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnAfterUndoStoreValue", 60006, OnAfterUndoStoreValue, VT_EMPTY, VTS_DISPATCH VTS_BOOL VTS_VARIANT VTS_BSTR VTS_VARIANT )
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnLoadUnknownFileName", 60007, OnLoadUnknownFileName, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnSaveUnknownFileName", 60008, OnSaveUnknownFileName, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnProgress", 60009, OnProgress, VT_EMPTY, VTS_DISPATCH VTS_I8 VTS_BSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnBeforeOpenDocument", 60010, OnBeforeOpenDocument, VT_EMPTY, VTS_DISPATCH )
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnAfterOpenDocument", 60011, OnAfterOpenDocument, VT_EMPTY, VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnAfterNewDocument", 60012, OnAfterNewDocument, VT_EMPTY, VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnOpenUrl", 60013, OnOpenUrl, VT_EMPTY, VTS_DISPATCH VTS_PBSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnNoFileFind", 60022, OnNoFileFind, VT_EMPTY, VTS_DISPATCH VTS_PBSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnResizeControlWindow", 60032, OnResizeControlWindow, VT_EMPTY, VTS_DISPATCH VTS_I4 VTS_I4 VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnScroll", 60033, OnScroll, VT_EMPTY, VTS_DISPATCH VTS_PR8 VTS_PR8 VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnPrompt", 60034, OnPrompt, VT_EMPTY, VTS_DISPATCH VTS_PBSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "GripSelectionModified", 60036, GripSelectionModified, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "ActionLayoutActivated", 60037, ActionLayoutActivated, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "GetDimensionText", 60040, GetDimensionText, VT_EMPTY, VTS_DISPATCH VTS_PBSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "ActionError", 60041, ActionError, VT_EMPTY, VTS_DISPATCH VTS_BSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "ActionEnd", 60042, ActionEnd, VT_EMPTY, VTS_DISPATCH VTS_BSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "ActionStart", 60043, ActionStart, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "GetPassWord", 60044, GetPassWord, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "GenericError", 60045, GenericError, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_BSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnPolarTrackToolTip", 60047, OnPolarTrackToolTip, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_PBSTR VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnPolarTrackAngleValidate", 60048, OnPolarTrackAngleValidate, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_DISPATCH VTS_R8 VTS_PR8 VTS_PBOOL VTS_PBOOL)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnObjectHandleChanged", 60049, OnObjectHandleChanged, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_BSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnRequestLicVal", 60050, OnRequestLicVal, VT_EMPTY, VTS_DISPATCH VTS_BSTR VTS_PBSTR)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnFilterOsnap", 60051, OnFilterOsnap, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "LoadUnknownObjects", 60052, LoadUnknownObjects, VT_EMPTY, VTS_VARIANT VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnActionMouseMove", 60053, OnActionMouseMove, VT_EMPTY, VTS_DISPATCH VTS_UNKNOWN)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnFigureMouseOver", 70001, OnFigureMouseOver, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnViewCubeClick", 70151, OnViewCubeClick, VT_EMPTY, VTS_DISPATCH VTS_UNKNOWN)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "FilterActionPoint", 70152, FilterActionPoint, VT_EMPTY, VTS_DISPATCH VTS_DISPATCH VTS_PDISPATCH)
    DISP_FUNCTION_ID(CvdDocumentEvents_Imp, "OnBeforeDocumentClear", 80011, OnBeforeDocumentClear, VT_EMPTY, VTS_DISPATCH )
END_DISPATCH_MAP()
BEGIN_INTERFACE_MAP(CvdDocumentEvents_Imp, CCmdTarget)
    INTERFACE_PART(CvdDocumentEvents_Imp, documenteventIID, Dispatch)
END_INTERFACE_MAP()

//code:
//suppose we already have a CVdraw object control created 
CVdraw vdraw;
//get the default document of the control
VectorDraw_Professional::IvdDocumentPtr doc = vdraw->GetActiveDocument().GetWrapperObject();
vdraw->FreezeDrawEvents(0);
vdraw->FreezeEntityEvents(0);
vdraw->SetFreezeDrawEntityEvents(FALSE);
vdraw->FreezeEvents(FALSE);
vdraw->SetDisableMouseStockEvents(TRUE);
vdraw->SetUndoMode(TRUE);
doc->GlobalRenderProperties->SelectionPreview = VectorDraw_Render::SelectionPreviewFlags::SelectionPreviewFlags_ON;//for mouse over entity
doc->ViewCube->Display = VectorDraw_Professional::ViewCubeDisplayFlags::ViewCubeDisplayFlags_VisibleAll;
//create the connection event object
 CvdDocumentEvents_Imp* eventsVd = new CvdDocumentEvents_Imp();
eventsVd->Connect(doc);
//Use drawing VDF control editor to open drawings create / edit entities to see how the CvdDocumentEvents_Imp method events are called

Send comments on this topic.