[MS C++]如何实现退出keyin命令

老师们好,我们一般可以通过keyin 命令加载自己写的程序。想知道,可否在C++程序里 写一句话,来退出当前命令。  

我不太清楚DgnTool的工作机制。 拿DgnPrimitiveTool来说,Install() --> postinstall() -->  OnDataButton(点击左键)  ,我发现无论是在OnDataButton里return true还是return false,工具都不会调用Oncleanup或者是ExitTool,一定要运行另一个Tool才会退出当前命令。  而我想实现的是工具是,点击一下左键,完成命令后,就退出该工具。   

请问各位老师,这能否实现?

Parents Reply
  • 我这边的产品经理给的需求是 单击鼠标左键画一个钻孔,画好后退出工具。我就在OnDataButton ()里添加了绘制钻孔的代码,最后加一句_ExitTool()  单击左键执行结果是  花了一个钻孔,也调用了_ExitTool() . 然而工具并没有退出,我怀疑这是MS平台机制的问题,必须要切换工具,才会退出当前命令。

Children
  • 能否贴出您OnDataButton的代码,我这边是测试过的,ExitTool调完后就退出当前工具了。

  • bool DrawZuanKong::_OnDataButton(DgnButtonEventCR ev)
    	{
    		System::String^ bianhao=caForm->zuankongBh;
    		System::String^ gaocheng=caForm->kongkouGc;
    		System::String^ kongshen=caForm->zkDepth;
    		DPoint3dCP basePoint=ev.GetPoint();
    		DPoint3d basePointtxt;
    		basePointtxt.x = basePoint->x + 30 * m_uor;
    		basePointtxt.y = basePoint->y;
    		basePointtxt.z = basePoint->z;
    
    		EditElementHandle eeh;
    		EditElementHandle eehTxt;
    		
    		System::String^ zksymbol=caForm->getZkSymbol();
    		WCharCP wcp= SysString2WString(zksymbol);
    		
    	    CreatZkSymbol(eeh,basePoint, wcp, pCellLib); //L"ZK-QT"
            CreatText(eehTxt, &basePointtxt, bianhao, gaocheng, kongshen);  
    		
    		setter->Apply(eeh);
    		setter->Apply(eehTxt);
    		eeh.AddToModel();	   
    		eehTxt.AddToModel();		
           
    		_ExitTool();  
    		return false;				
    	}
    	
    	
    	void   DrawZuanKong::_ExitTool()
    	{
    		printf("%s\n", "on _ExitTool");
    	}

    一共贴了两个函数,郭工请帮我看一下

  • 为什么要重写_ExitTool呢?在基类DgnPrimitiveTool实现的_ExitTool中,完成了启动默认工具即退出当前工具的操作,您这里重写了这个函数,不仅没有自己去实现这些动作,还不调用基类的_ExitTool(__Super::_ExitTool),肯定不行了。把您这个实现删了就可以了。

    Answer Verified By: mkt 

  • 真的是这个问题。^^ 我有点明白了。郭工,那可否这样理解,想要在工具函数原有功能的基础重写这个工具函数,为了保持它原有的功能,必须在函数体里调用它的基类函数 :比如在:_OnPostInstall ()的函数体中调用__super::_OnPostInstall (),再写自定义代码,否则就会破坏了基类的机制,在启动工具时就不会自动调用_OnPostInstall ()了.

  • 不是不会调用_OnPostInstall了,在您调用_InstallTool之后,后台会保存您调用_InstallTool的DgnTool*指针,通过这个指针,后台会调用_OnPostInstall,_OnPostInstall是个虚函数,如果子类重新了_OnPostInstall就会调用子类重新的这个_OnPostInstall函数,没有重写的话调用的就是基类的这个函数。这是c/c++里边多态的一种,还是c/c++学的不过关呀。