AUTOCAD二次开发笔记(ObjectARX)---全部
ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad 2008+ObjectArx2008)在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。
有必要研究一下公司的产品开发,以利发展。
一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。
二、安装ObjectArx2008直接打开解压缩到某个目录即可。
比如C:\ObjectARX 2008然后打开C:\ObjectARX 2008\utils\ObjARXWiz目录,运行ArxWizards.msi这样在新建C++项目的时候会出现ObjectARX项目,如图三、包含文件工具->选项->项目和解决方案->VC++目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a>按钮,然后新建一个命令。
如图:只需要修改Internation Name与Localized Name为testcmd即可添加完成后,会在acrxEntryPoint.cpp中自动添加一句如下的代码:然后添加一句AfxMessageBox(_T("this is a test command."));五、加载与运行在项目中win32\debug目录下,把ArxProject2.arx复制到桌面,注意先生成一下。
打开cad08输入命令:ap打开加载对话框。
找到.arx文件即可加载。
如图:然后输入自己的命令testcmd就能运行了。
如图:公司高手如云,希望能在CAD二次开发方面有些发展。
转行也行,呵呵。
凡事以大气象去面对,优秀是一种习惯。
CAD二次开发学习笔记一(画一条直接)ARX内部是不需要调用cad命令的。
调用ARX 函数或对象就可以象CAD一样绘制、编辑实体。
在AutoCAD中画直接的命令是line0,01000,100通过ObjectARX画,新建一个命令cmd1代码如下:代码// ----- ArxProject2.cmd1 commandstatic void ArxProject2cmd1(void){// Add your code for command ArxProject2._MyCommand1 hereacutPrintf(_T("Hello World"));//在内存上创建一个新的AcDbLine对象AcGePoint3d ptStart(0,0,0);AcGePoint3d ptEnd(10000,10000,0);AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);/*基于AutoCAD内部的实现机制,必须在堆上创建对象。
acdbHostApplicationServices()->workingDatabase()获得指向当前活动的图形数据库的指针。
*///获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTa ble,AcDb::kForRead);//获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);//将AcDbLine类的对象添加到块表记录中AcDbObjectId lineId;pBlockTableRecord->appendAcDbEntity(lineId,pLine);//关闭图形数据库的各种对象pBlockTable->close();pBlockTableRecord->close();pLine->close();}ap加载然后cmd1运行。
凡事以大气象去面对,优秀是一种习惯。
CAD二次开发学习笔记二(创建一个对话框)打开资源视图->右击->添加资源->Dialog双击对话框,弹出MFC类向导,输入类名FirstClass,确定,创建对话框类。
FirstClass.h与FirstClass.cpp需要在FirstClass.h中包含#include "Resource.h"代码如下:大气象#pragma once// FirstClass 对话框#include "Resource.h"//这里包含资源头文件class FirstClass : public CDialog{DECLARE_DYNAMIC(FirstClass)public:FirstClass(CWnd* pParent = NULL); // 标准构造函数virtual ~FirstClass();// 对话框数据enum { IDD = IDD_DIALOG1 };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()};新建一个cad命令,在acrxEntryPoint.cpp添加如下代码:大气象static void ArxProject2cmd2(void)记得包含对话框头文件#include "FirstClass.h"然后ap加载cmd2运行凡事以大气象去面对,优秀是一种习惯。
CAD二次开发学习笔记三(封装添加实体到数据库函数)学会查看ObjectARX帮助文档。
AcGe开头图形计算。
AcDb图形数据库。
在acrxEntryPoint.cpp添加如下代码:大气象static Acad::ErrorStatus AddToDb(AcDbEntity* ent, AcDbObjectId& objId){Acad::ErrorStatus es;AcDbBlockTable* pBlockTable;AcDbBlockTableRecord* pSpaceRecord;if ((es = acdbHostApplicationServices()->workingDatabase()->getBlockTabl e(pBlockTable, AcDb::kForRead))!= Acad::eOk) {return es;}if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,pSpaceRecord,AcDb::kForWrite)) != Acad::eOk) {return es;}if ((es = pBlockTable->close()) != Acad::eOk) {return es;}if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) { return es;}return pSpaceRecord->close();}public:// - ArxProject2.cmd3 command (do not rename)static void ArxProject2cmd3(void){// Add your code for command ArxProject2.cmd3 hereAcGePoint3d ptStart(0,0,0);AcDbCircle *pCircle=new AcDbCircle();pCircle->setCenter(ptStart);pCircle->setRadius(1000);//也可以这样定义圆//AcDbCircle *pCircle=new AcDbCircle(ptStart,AcGeVector3d(0,0,1),100 );AcDbObjectId circleId;//调用画实体函数if(AddToDb(pCircle,circleId)!=Acad::eOk)//传入指针,传出idAfxMessageBox( _T("加入实体到数据库失败!"));pCircle->close();}凡事以大气象去面对,优秀是一种习惯。
CAD二次开发学习笔记四(得到选中的实体,修改实体,如等分线段)AcGeVector3d是点阵的集合,通过等分点的差集得到。
新的点可以通过点与点阵相差得到。
大气象public:// - ArxProject2.partLine command (do not rename)static void ArxProject2partLine(void){// Add your code for command ArxProject2.partLine hereads_name entName;ads_point pt;acedEntSel( _T("\n选择:"),entName,pt);//得到选中的实体AcDbObjectId ObjId;//得到实体IDif( acdbGetObjectId(ObjId,entName) != Acad::eOk )//如果没有选中的实体则返回{acutPrintf( _T("\nno"));return;}AcDbEntity* pEnt;//得到实体if( acdbOpenObject(pEnt,ObjId,AcDb::kForRead) == Acad::eOk){acutPrintf( _T("\nok"));AcDbLine* pLine = (AcDbLine* )pEnt;//强制转换AcGePoint3d ptStart = pLine->startPoint();//得到起点AcGePoint3d ptEnd = pLine->endPoint();pEnt->close();//根据点和线的方向生成点组,绘制线段int nPart = 5;//五等分AcGeVector3d Vect = (ptEnd - ptStart)/nPart;//矩阵,点与点的差集平分可得到for (int n=0; n<nPart; n++){AcDbObjectId ObjIdNew;MakeLine(ptStart+n*Vect,ptStart+(n+1)*Vect,ObjIdNew);//等分线段的方法}//将选中的线段删除,if( acdbOpenObject(pEnt,ObjId,AcDb::kForWrite) == Acad::eOk ){pEnt->erase();pEnt->close();}}}//将实体添加到数据库//cad中的实体最终都要添加到数据库中才能被显示(图纸其实是一个数据库格式的),所以它的作用就是添加实体到数据库中static Acad::ErrorStatus AddToDb(AcDbEntity* ent, AcDbObjectId& objId) {Acad::ErrorStatus es;AcDbBlockTable* pBlockTable;AcDbBlockTableRecord* pSpaceRecord;if ((es = acdbHostApplicationServices()->workingDatabase()->getBlock Table(pBlockTable, AcDb::kForRead))!= Acad::eOk) {return es;}if ((es = pBlockTable->getAt(ACDB_MODEL_SPACE,pSpaceRecord,AcDb::kForWrite)) != Acad::eOk) {return es;}if ((es = pBlockTable->close()) != Acad::eOk) {return es;}if ((es = pSpaceRecord->appendAcDbEntity(objId, ent)) != Acad::eOk) {return es;}return pSpaceRecord->close();}private://画线函数static void MakeLine(AcGePoint3d ptStart,AcGePoint3d ptEnd,AcDbObjec tId lineId){AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);if(AddToDb(pLine,lineId)!=Acad::eOk)//传入指针,传出idAfxMessageBox( _T("加入实体到数据库失败!"));pLine->close();}另外是几个CAD用法:1.移动命令的使用输入m然后选择线段,或者线段的端点,就出现移动的辅助线。
ObjectARX
ObjectARX1. ObjectARX的介绍:ObjectARX是AutoDesk公司针对AutoCAD平台上的二次开发而推出的一个开发软件包,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速的访问AutoCAD图形数据库。
与以往的AutuCAD 二次开发工具AutoLISP 和ADS不同,ObjectARX应用程序是一个DLL(动态链接库),共享AutoCAD的地址空间,对AutoCAD进行直接函数调用。
所以,使用ARX编程的函数的执行速度得以大大提高。
ARX 类库采用了标准的C++类库的封装形式,这也大大提高了程序员编程的可靠度和效率。
ObjectARX目前最新的版本是ObjectARX2002,它在原有Obj ectARX的基础上,特别增加了XML的支持。
XML是可扩展标记语言(eXtensible Markup Language)。
它是应用软件与Internet的接口。
通过支持XML,为Object ARX开发网络协作应用提供了有力的支持。
2. 开发环境的设置:运用ObjectARX进行二次开发,必须首先设置好ObjectARX的开发环境。
目前常用的开发环境是Microsoft Visual C++ 6.0。
同时,还需要安装ObjectARX SDK,ObjectARX SDK可以在AutoDesk公司的网站上免费下载。
不同的AutoCAD版本对应相应的ObjectARX SDK的版本,目前常用的是ObjectARX SDK for AutoCAD R14和ObjectARX SDK for AutoCAD2000i。
这两个开发工具在设置上略有不同,将进行对比介绍。
安装好VC++和ObjectARX后,就可以开始设置开发环境了。
1)设置INC和LIB文件寻找路径INC和LIB文件寻找路径为VC++的环境参数,设置一次即可,对以后的所有项目均有效。
选择Tools→Options …,出现Option对话框,选择Directories页,在Show Directories for中选择Include files,然后在Directo ries中加上ARX的INC目录路径c:\objectarx\inc(假定ARX的开发工具在c:\objec tarx\中)。
objectarx开发笔记2
刷新显示屏幕问题 (2)自定义实体时添加variable时相关问题 (2)用acdbOpenAcDbEntity打开实体后一定要关闭 (2)WCS到UCS的坐标转换 (2)选择过程中判断用户右键操作 (2)如何实现自定义实体Undo? (3)关于动态拖动的讨论 (3)刷新显示屏幕问题有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, "REGEN", RTNONE);虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢,这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了,显然这不合理.解决方法:// 刷新显示屏幕actrTransactionManager->flushGraphics();acedUpdateDisplay();自定义实体时添加variable时相关问题问:用ObjectARX2007的Add Member Variable Wizard时出现页面错误怎么办?答:用vs2005自身的class view中的add variable就可以了。
用acdbOpenAcDbEntity打开实体后一定要关闭用acdbOpenAcDbEntity打开实体,不管是只读还是编辑方式,操作后都要关闭实体,否则再次打开时只能以只读方式打开。
WCS到UCS的坐标转换mbp为当前坐标(ads_point mbp),可以以下方法转换为wcs坐标。
struct resbuf wcs, ucs;wcs.restype = RTSHORT;wcs.resval.rint = 0;ucs.restype = RTSHORT;ucs.resval.rint = 1;acedTrans(mbp,&ucs,&wcs,0,mbp);选择过程中判断用户右键操作观察Acad2002的命令:mledit,这个命令运行后,用户需要选择操作对象,可是这个命令的选择功能有点特殊: 可以判断用户点了右键(等同直接按回车),,如果点了右键(或按回车),程序会退出.现在有个程序,也要选择一个对象,并且也想实现用户按回车(点击右键)后直接退出,我用的是acedEntSel函数,可是这些函数(包含acedNEntSelP..等.)都只能返回RENORM(正确选中),RTEROR(没有选中),用户按回车(点击右键)也是返回RTERROR请教下这里有没有解决的办法.int rc=acedEntSel("\nChoose a entity:",ent,pt);switch(rc){case RTCAN:acutPrintf("\nUser canceled.");break;case RTERROR:acutPrintf("\nNothing selected.");break;}如何实现自定义实体Undo?undo和redo实际上是调用了自定义实体的dwgInFields和dwgOutFields,你必须重载这个函数。
AutoCAD二次开发培训_讲义
Cre
Cre
Upd
AutoCAD's APIs
Add
Cre
Tota
6
在AutoCAD中存储数据
不同API方式的比较
Time in seconds
数据容器存储性能比较
400 350 300 250 200 150 100
50 0 Xrecord Custom Object
Xdata
ObjectARX .NET LISP
ObjectARX 入门培训材料--Labs
▪ ObjectARX/arxlabs/ObjectARXLabs.chm
ObjectARX
© 2008 Autodesk
16
ARXDBG ! (ARX Debug)
© 2008 Autodesk
17
.ARX = .DLL + 2 输出函数
acrxEntryPoint acrxGetApiVersion
按需加载
▪ 启动
▪ acad.rx 文件 每行列出一个ARX名。AUTOCAD每次启动时都会在搜索路径下查找这个文 件,如果有,则顺序加载列表中的ARX程序
▪ Registry ▪ (arxload) in acad.lsp
▪ 命令调用
▪ Registry:通过注册表
▪ 按请求
▪ 从其他程序
▪ 代理检测
34
用户交互API acedInitGet
▪ 控制其后的一个acedGetXXX()函数的用户输入 ▪ int acedInitGet (int val, const ACHAR *kwl) ▪ val设定输入数据的范围和方式, 控制位组合只控制紧随其后的一个
acedGetXXX()函数的输入,之后立即失效
CAD二次开发笔记
利用VBA二次开发CAD笔记一开发环境和准备工作1.开发环境:windowsXP系统(其他系统未测试)2.编程语言:VBA语言3.CAD版本:安装CAD2004,2006,2007版本,可直接运行。
安装2010以上版本需要单独安装VBA,由于2010以上版本的VBA,官方已经不再绑定安装VBA,因此需要安装独立的VBA。
4. 打开一个CAD文件,打开菜单》工具》宏,Visual Basic编辑器,添加对象,窗体等等,保存工程文件,文件名.dvb,其中dvb是后缀。
把该文件放在CAD的安装目录下。
5. 自动加载dvb文件,大约有如下几种方法:(1)vba自己加载法。
将你的vba工程文件改名为acad.dvb,放在cad的安装目录下,vba初始化后自动加载。
(2)startup加载法。
将vba文件放到cad的安装目下。
cad安装目录下和suport目录下搜索acad.lsp 文件,如果不存在,用windows记事本在安装目录下新建一个acad.lsp文件(如果已经存在,用记事本打开它),在该文件中添加如下内容:注意:(如果文件名为acad.lsp,CAD运行时自动搜索并运行acad.lsp,但如果运行了目录下的acad.exe,此文件会被覆盖。
建议此文件用别的名字,用别的名字想自动运行就需要把该文件加入启动组。
方法如下:打开一个CAD文件,打开菜单》工具》加载应用程序,点击内容(提包样的图标),添加放在CAD目录下的“filename.lsp”文件,关闭对话框。
关闭CAD文件(此设置为每次打开CAD 文件自动运行filename.lsp)(defun S::STARTUP()(command "_VBALOAD" "myproj.dvb")自动加载dvb文件,注意:(如果文件名为acad.dvb,此行省略,否则启动时弹出对话框有提示已经加载。
)(command "_-VBARUN" "ThisDrawing.main"))自动运行dvb文件中的宏,ThisDrawing.main,ThisDrawing是CAD对象,main是ThisDrawing 下的一个主入口。
基于objectarx二次开发在autocad中实现QQ抽屉效果
基于objectarx二次开发在autocad中实现QQ抽屉效果操作步骤:1.在vs2005中创建一个基于objectarx的应用程序,程序名为:WPJ-STRUCTURE。
2.添加基于CAcUiDockControlBar的类CDockControlBar,添加后,程序会增加类文件“DockControlBarChildDlg.h”和“DockControlBarChildDlg.cpp”,并在资源中自动添加ID为“IDD_DOCKCONTROLBAR”的对话框面板,同时生成类文件“DockControlBarChildDlg.h”和“DockControlBarChildDlg.cpp”。
3.添加GfxGroupEdit.cpp、GfxGroupEdit.h、GfxPopupMenu.cpp、GfxPopupMenu.h、GfxOutBarCtrl.cpp、GfxOutBarCtrl.h到工程中,在文件GfxGroupEdit.cpp和GfxPopupMenu.cpp中添加如下代码:#include "DockControlBarChildDlg.h"。
4.在资源文件中导入三个光标文件,分别命名其ID为:IDC_DRAGGING、IDC_HANDCUR、IDC_NODRAGGING;并添加Icon资源,分别命名其ID为:ID_GFX_LARGEICON、ID_GFX_REMOVEITEM、ID_GFX_RENAMEITEM、ID_GFX_SMALLICON。
5.在“DockControlBarChildDlg.h”文件中添加:#define IDC_LST_MENU WM_USER+1000#include "resource.h"#include "GfxOutBarCtrl.h"6.在“DockControlBarChildDlg.h”文件中添加变量:CGfxOutBarCtrl wndBar;7.在“DockControlBarChildDlg.h”文件中添加消息函数:afx_msg long OnOutbarNotify(WPARAM wParam, LPARAM lParam);8.在“DockControlBarChildDlg.cpp”文件中添加代码:ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)9.在“DockControlBarChildDlg.cpp”文件中添加OnOutbarNotify函数具体代码:long CDockControlBarChildDlg::OnOutbarNotify(WPARAM wParam, LPARAM lParam){switch (wParam){case NM_OB_ITEMCLICK:// cast the lParam to an integer to get the clicked item{int index = (int) lParam;CString cs, cs1;cs1 = wndBar.GetItemText(index);int iFloder = wndBar.GetSelFolder();cs.Format(_T("Clicked on %d Floder -> %d :: <%s>"), iFloder, (int)lParam, cs1);AfxMessageBox(cs);}return 0;case NM_OB_ONLABELENDEDIT:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Editing item %d, new text:%s\n"), pOI->index, pOI->cText);}return 1;case NM_OB_ONGROUPENDEDIT:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Editing folder %d, new text:%s\n"), pOI->index, pOI->cText);}return 1;case NM_OB_DRAGITEM:// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items// return 1 to do the change and 0 to cancel it{OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;TRACE2(_T("Drag item %d at position %d\n"), pOI->iDragFrom, pOI->iDragTo);}return 1;}return 0;}10.在“DockControlBarChildDlg.cpp”文件中添加抽屉控件的初始化代码:DWORD dwf = CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups|CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation;wndBar.Create(WS_CHILD|WS_VISIBLE,CRect(0,0,150-5,450-30),this,IDC_LST_MENU,dwf);wndBar.SetOwner(this);wndBar.AddFolder(_T("Folder 1"), 0);wndBar.AddFolder(_T("Folder 2"), 1);wndBar.AddFolder(_T("Folder 3"), 2);wndBar.AddFolder(_T("Folder 4"), 3); wndBar.SetSelFolder(1);wndBar.SetIfQueryRemove(true); 11.最终在autocad2007下的运行效果:附件:源代码GfxGroupEdit.h// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 4 lines.// Strongly based on article "Inplace edit control" of Mario Contestabile and "Editable subitems" of Zafir// #if !defined(AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_)#define AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000// GfxGroupEdit.h : header file///////////////////////////////////////////////////////////////////////////////// CGfxGroupEdit windowclass CGfxGroupEdit : public CEdit{// Constructionpublic:CGfxGroupEdit();// Attributespublic:BOOL bEscapeKey;CString text;WPARAM msgSend;bool bNoDown;// Operationspublic:// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CGfxGroupEdit)public:virtual BOOL PreTranslateMessage(MSG* pMsg);protected:virtual void PostNcDestroy();//}}AFX_VIRTUAL// Implementationpublic:int iIndex;virtual ~CGfxGroupEdit();// Generated message map functionsprotected://{{AFX_MSG(CGfxGroupEdit)afx_msg void OnKillFocus(CWnd* pNewWnd);afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);//}}AFX_MSGDECLARE_MESSAGE_MAP()};///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}// Microsoft Developer Studio will insert additional declarations immediately before the previous line.#endif// !defined(AFX_GFXGROUPEDIT_H__CA5BB022_1277_11D2_843A_0000B43382FE__INCLUDED_)GfxGroupEdit.cpp// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 4 lines.// Strongly based on article "Inplace edit control" of Mario Contestabile and "Editable subitems" of Zafir// // GfxGroupEdit.cpp : implementation file//#include"stdafx.h"#include"DockControlBarChildDlg.h"#include"GfxGroupEdit.h"#include"GfxOutBarCtrl.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CGfxGroupEditCGfxGroupEdit::CGfxGroupEdit(){bEscapeKey = FALSE;iIndex = -1;msgSend = NM_OB_ONGROUPENDEDIT;bNoDown = false;}CGfxGroupEdit::~CGfxGroupEdit(){}BEGIN_MESSAGE_MAP(CGfxGroupEdit, CEdit)//{{AFX_MSG_MAP(CGfxGroupEdit)ON_WM_KILLFOCUS()ON_WM_CREATE()ON_WM_CHAR()//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CGfxGroupEdit message handlersvoid CGfxGroupEdit::OnKillFocus(CWnd* pNewWnd){PostMessage(WM_CLOSE, 0, 0);if (!bEscapeKey){GetWindowText(text);if (text != "") GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, msgSend, (LPARAM) this);}}BOOL CGfxGroupEdit::PreTranslateMessage(MSG* pMsg){if (pMsg->wParam == VK_RETURN){PostMessage(WM_CLOSE, 0, 0);return TRUE;}else if (pMsg->wParam == VK_ESCAPE){PostMessage(WM_CLOSE, 0, 0);return bEscapeKey = TRUE;}return CEdit::PreTranslateMessage(pMsg);}void CGfxGroupEdit::PostNcDestroy(){CEdit::PostNcDestroy();delete this;}int CGfxGroupEdit::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CEdit::OnCreate(lpCreateStruct) == -1)return -1;SendMessage(WM_SETFONT,(WPARAM) GetStockObject(DEFAULT_GUI_FONT),MAKELPARAM(TRUE,0));return 0;}void CGfxGroupEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags){if (msgSend == NM_OB_ONGROUPENDEDIT){CEdit::OnChar(nChar, nRepCnt, nFlags);return;}if (nChar == VK_ESCAPE || nChar == VK_RETURN){if (nChar == VK_ESCAPE) bEscapeKey = TRUE;GetParent()->SetFocus();return;}CEdit::OnChar(nChar, nRepCnt, nFlags);CString str;CRect rect, parentrect;GetClientRect(&rect);GetParent()->GetClientRect(&parentrect);ClientToScreen(&rect);GetParent()->ScreenToClient(&rect);GetWindowText(str);CWindowDC dc(this);CFont *pFont = GetParent()->GetFont();CFont *pFontDC = dc.SelectObject(pFont);CRect szrc(rect);szrc.bottom = szrc.top;if (bNoDown == true){dc.DrawText(str, szrc, DT_CALCRECT);if (szrc.right >= parentrect.right - 1) rect.right = parentrect.right - 1;else rect.right = szrc.right;MoveWindow(&rect);return;}dc.DrawText(str, szrc, DT_WORDBREAK|DT_CENTER|DT_CALCRECT);dc.SelectObject(pFontDC);CSize size = szrc.Size();if (size.cx > rect.Width()){if (size.cx + rect.left < parentrect.right) rect.right = rect.left + size.cx;else rect.right = parentrect.right;MoveWindow(&rect);}else if (size.cy > rect.Height()){if (size.cy + rect.bottom < parentrect.bottom) rect.bottom = rect.top + size.cy;else rect.bottom = parentrect.bottom;MoveWindow(&rect);}}GfxPopupMenu.h// GfxPopupMenu.h: interface for the CGfxPopupMenu class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_) #define AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000class CGfxPopupMenu : public CMenu{public:struct ToolBarData{ // struct for toolbar resource; guess you already know it ;)WORD wVersion;WORD wWidth;WORD wHeight;WORD wItemCount;};struct SpawnItem{int iImageIdx;int iCmd;wchar_t cText[128];};struct ImageItem{int iImageIdx;int iCmd;};CGfxPopupMenu();virtual ~CGfxPopupMenu();HFONT hMenuBoldFont;bool CreateBoldFont();HFONT hMenuFont, hGuiFont;CSize szImage;int FindImageItem(const int cmd);SpawnItem * AddSpawnItem(const wchar_t * txt, const int cmd);void AddImageItem(const int idx, WORD cmd);void RemapMenu(CMenu * pMenu);CImageList ilList;CImageList ilOther;COLORREF crMenuText, crMenuTextSel;COLORREF cr3dFace, crMenu, crHighlight, cr3dHilight, cr3dShadow, crGrayText;COLORREF m_clrBtnFace, m_clrBtnHilight, m_clrBtnShadow;int iSpawnItem;SpawnItem ** pSpawnItem;int iImageItem;ImageItem * pImageItem;bool LoadToolBarResource(unsigned int resId);bool AddToolBarResource(unsigned int resId);void EnableMenuItems(CMenu * pMenu, CWnd * pParent);virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);};#endif// !defined(AFX_GFXPOPUPMENU_H__F2CEE8B2_014D_11D2_83E4_0000B43382FE__INCLUDED_)GfxPopupMenu.cpp// GfxPopupMenu.cpp: implementation of the CGfxPopupMenu class.////////////////////////////////////////////////////////////////////////#include"stdafx.h"#include"DockControlBarChildDlg.h"#include"GfxPopupMenu.h"#ifdef _DEBUG#undef THIS_FILEstatic wchar_t THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif////////////////////////////////////////////////////////////////////// // Construction/Destruction//////////////////////////////////////////////////////////////////////CGfxPopupMenu::CGfxPopupMenu(){crMenuText = GetSysColor(COLOR_MENUTEXT);crMenuTextSel = GetSysColor(COLOR_HIGHLIGHTTEXT);cr3dFace = GetSysColor(COLOR_3DFACE);crMenu = GetSysColor(COLOR_MENU);crHighlight = GetSysColor(COLOR_HIGHLIGHT);cr3dHilight = GetSysColor(COLOR_3DHILIGHT);cr3dShadow = GetSysColor(COLOR_3DSHADOW);crGrayText = GetSysColor(COLOR_GRAYTEXT);m_clrBtnFace = GetSysColor(COLOR_BTNFACE);m_clrBtnHilight = GetSysColor(COLOR_BTNHILIGHT);m_clrBtnShadow = GetSysColor(COLOR_BTNSHADOW);iSpawnItem = 0;pSpawnItem = NULL;iImageItem = 0;pImageItem = NULL;szImage = CSize(20,20);hMenuFont = NULL;/* COLORMAP cMap[3] = {{ RGB(128,128,128), cr3dShadow },{ RGB(192,192,192), cr3dFace },{ RGB(255,255,255), cr3dHilight }};CBitmap bmp;bmp.LoadMappedBitmap(IDB_MENUCHK, 0, cMap, 3);ilOther.Create(19, 19, ILC_COLOR4|ILC_MASK, 1, 0);ilOther.Add(&bmp, cr3dFace);bmp.DeleteObject();*/NONCLIENTMETRICS ncm;memset(&ncm, 0, sizeof(ncm));ncm.cbSize = sizeof(ncm);::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, (PVOID) &ncm, 0);hGuiFont = ::CreateFontIndirect(&ncm.lfMenuFont);// David 08/04/98 - start - bold font handlinghMenuBoldFont = NULL;CreateBoldFont();// David 08/04/98 - end - bold font handling}CGfxPopupMenu::~CGfxPopupMenu(){if (iSpawnItem > 0){for (int t = 0; t < iSpawnItem; t++)if (pSpawnItem[t]) delete pSpawnItem[t];GlobalFree((HGLOBAL) pSpawnItem);}if (iImageItem > 0){GlobalFree((HGLOBAL) pImageItem);}if (hMenuFont) ::DeleteObject((HGDIOBJ)hMenuFont);if (hMenuBoldFont) ::DeleteObject((HGDIOBJ)hMenuBoldFont);}void CGfxPopupMenu::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct){// CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);// CRect rcItem(lpDrawItemStruct->rcItem);// pDC->FillSolidRect(rcItem, RGB(255,0,0));if (lpDrawItemStruct->CtlType == ODT_MENU){UINT id = lpDrawItemStruct->itemID;UINT state = lpDrawItemStruct->itemState;bool bEnab = !(state & ODS_DISABLED);bool bSelect = (state & ODS_SELECTED) ? true : false;bool bChecked = (state & ODS_CHECKED) ? true : false;// David 08/04/98 - start - bold font handlingbool bBold = (state & ODS_DEFAULT) ? true : false;// David 08/04/98 - end - bold font handlingSpawnItem * pItem = (SpawnItem *) lpDrawItemStruct->itemData;if (pItem){CDC * pDC = CDC::FromHandle(lpDrawItemStruct->hDC);CFont * pft;// David 08/04/98 - start - bold font handlingif (!bBold) pft = CFont::FromHandle((HFONT) hMenuFont ? hMenuFont : hGuiFont);else pft = CFont::FromHandle((HFONT) hMenuBoldFont ? hMenuBoldFont : hGuiFont);// David 08/04/98 - end - bold font handlingCFont * of = pDC->SelectObject(pft);CRect rc(lpDrawItemStruct->rcItem);CRect rcImage(rc), rcText(rc);rcImage.right = rcImage.left + rc.Height();rcImage.bottom = rc.bottom;if (pItem->iCmd == -3) // is a separator{CPen pnDk(PS_SOLID,1,cr3dShadow);CPen pnLt(PS_SOLID,1,cr3dHilight);CPen * opn = pDC->SelectObject(&pnDk);pDC->MoveTo(rc.left + 2, rc.top + 2);pDC->LineTo(rc.right - 2, rc.top + 2);pDC->SelectObject(&pnLt);pDC->MoveTo(rc.left + 2, rc.top + 3);pDC->LineTo(rc.right - 2, rc.top + 3);pDC->SelectObject(opn);}else if (pItem->iCmd == -4) // is a title item{CString cs(pItem->cText), cs1;CRect rcBdr(rcText);if (bSelect && bEnab){rcText.top ++;rcText.left += 2;}pDC->FillSolidRect(rcText, crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_CENTER|DT_SINGLELINE);if (bSelect && bEnab) pDC->Draw3dRect(rcBdr,cr3dShadow,cr3dHilight); }else{rcText.left += rcImage.right + 1;int obk = pDC->SetBkMode(TRANSPARENT);COLORREF ocr;if (bSelect){if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))pDC->FillSolidRect(rcText, crHighlight);elsepDC->FillSolidRect(rc, crHighlight);ocr = pDC->SetTextColor(crMenuTextSel);}else{if (pItem->iImageIdx >= 0 || (state & ODS_CHECKED))pDC->FillSolidRect(rcText, crMenu);elsepDC->FillSolidRect(rc/*rcText*/, crMenu);ocr = pDC->SetTextColor(crMenuText);}if (pItem->iImageIdx >= 0){int ay = (rcImage.Height() - szImage.cy) / 2;int ax = (rcImage.Width() - szImage.cx) / 2;if (bSelect && bEnab)pDC->Draw3dRect(rcImage,cr3dHilight,cr3dShadow);else{pDC->Draw3dRect(rcImage,crMenu,crMenu);}if (bEnab){ilList.Draw(pDC, pItem->iImageIdx, CPoint(rcImage.left + ax, rcImage.top +ay), ILD_NORMAL);}else{HICON hIcon = ilList.ExtractIcon( pItem->iImageIdx );pDC->DrawState( CPoint(rcImage.left + ax, rcImage.top + ay ), szImage, (HICON)hIcon, DST_ICON | DSS_DISABLED, (CBrush *)NULL );}}else{if (bChecked){int ay = (rcImage.Height() - szImage.cy) / 2;int ax = (rcImage.Width() - szImage.cx) / 2;ilOther.Draw(pDC, 0, CPoint(rcImage.left + ax, rcImage.top + ay - 2), ILD_NORMAL);}}CString cs(pItem->cText), cs1;CSize sz;sz = pDC->GetTextExtent(cs);int ay1 = (rcText.Height() - sz.cy) / 2;rcText.top += ay1;rcText.left += 2;rcText.right -= 15;int tf = cs.Find('\t');if (tf >= 0){cs1 = cs.Right(cs.GetLength() - tf - 1);cs = cs.Left(tf);if (!bEnab){if (!bSelect){CRect rcText1(rcText);rcText1.InflateRect(-1,-1);pDC->SetTextColor(cr3dHilight);pDC->DrawText(cs, rcText1, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText1, DT_VCENTER|DT_RIGHT);pDC->SetTextColor(crGrayText);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}else{pDC->SetTextColor(crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}}else{pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT);pDC->DrawText(cs1, rcText, DT_VCENTER|DT_RIGHT);}}else{if (!bEnab){if (!bSelect){CRect rcText1(rcText);rcText1.InflateRect(-1,-1);pDC->SetTextColor(cr3dHilight);pDC->DrawText(cs, rcText1,DT_VCENTER|DT_LEFT|DT_EXPANDTABS);pDC->SetTextColor(crGrayText);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}else{pDC->SetTextColor(crMenu);pDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}}elsepDC->DrawText(cs, rcText, DT_VCENTER|DT_LEFT|DT_EXPANDTABS);}pDC->SetTextColor(ocr);pDC->SetBkMode(obk);}pDC->SelectObject(of);}}}void CGfxPopupMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct){// lpMeasureItemStruct->itemWidth = 200;// lpMeasureItemStruct->itemHeight = 25;bool res = false;if (lpMeasureItemStruct->CtlType == ODT_MENU){UINT id = lpMeasureItemStruct->itemID;SpawnItem * pItem = (SpawnItem *) lpMeasureItemStruct->itemData;if (pItem){if (pItem->iCmd == -3) // is a separator{lpMeasureItemStruct->itemWidth = 10;lpMeasureItemStruct->itemHeight = 6;}else{CString cs(pItem->cText);if (!cs.IsEmpty()){CClientDC dc(AfxGetMainWnd());CFont * pft = CFont::FromHandle(hMenuFont ? hMenuFont : hGuiFont);CFont * of = dc.SelectObject(pft);CSize osz = dc.GetOutputTabbedTextExtent(cs,0,NULL);if (pItem->iCmd == -4){CRect rci(0,0,0,0);dc.DrawText(cs, rci,DT_CALCRECT|DT_TOP|DT_VCENTER|DT_SINGLELINE);lpMeasureItemStruct->itemHeight = rci.Height();lpMeasureItemStruct->itemWidth = rci.Width();}else{lpMeasureItemStruct->itemHeight = szImage.cy + 5;if (osz.cy > (int) lpMeasureItemStruct->itemHeight) lpMeasureItemStruct->itemHeight = (int) osz.cy;lpMeasureItemStruct->itemWidth = osz.cx + 2 + 15;lpMeasureItemStruct->itemWidth +=lpMeasureItemStruct->itemHeight > (UINT) szImage.cx ? (UINT) lpMeasureItemStruct->itemHeight : (UINT) szImage.cx;}dc.SelectObject(of);}else{lpMeasureItemStruct->itemHeight = szImage.cy + 5;lpMeasureItemStruct->itemWidth = 100;}}}}}bool CGfxPopupMenu::CreateBoldFont(){if (hMenuBoldFont)::DeleteObject((HGDIOBJ)hMenuBoldFont);LOGFONT lgFont;::GetObject (hMenuFont ? hMenuFont : hGuiFont, sizeof (lgFont), &lgFont);lgFont.lfWeight = FW_BOLD;hMenuBoldFont = CreateFontIndirect (&lgFont);return !!hMenuBoldFont;}bool CGfxPopupMenu::AddToolBarResource(unsigned int resId){// David 08/04/98 - start - put CMenuSpawn in DLLHINSTANCE hInst = AfxFindResourceHandle (MAKEINTRESOURCE(resId), RT_TOOLBAR);if (!hInst)return false;// David 08/04/98 - end - put CMenuSpawn in DLLHRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);if (hRsrc == NULL) return false;HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);if (hGlb == NULL) return false;ToolBarData* pTBData = (ToolBarData*) ::LockResource(hGlb);if (pTBData == NULL) return false;ASSERT(pTBData->wVersion == 1);CBitmap bmp;bmp.LoadBitmap(resId);int nBmpItems = ilList.Add(&bmp, RGB(192,192,192));bmp.DeleteObject();WORD* pItem = (WORD*)(pTBData+1);for(int i=0; i<pTBData->wItemCount; i++, pItem++){if(*pItem != ID_SEPARATOR)AddImageItem(nBmpItems++, (WORD) *pItem);}// ** it seem that Windows doesn't free these resource (from Heitor Tome)::UnlockResource(hGlb);::FreeResource(hGlb);// **return true;}bool CGfxPopupMenu::LoadToolBarResource(unsigned int resId){//David 08/04/98 - start - put CMenuSpawn in DLLHINSTANCE hInst = AfxFindResourceHandle (MAKEINTRESOURCE(resId), RT_TOOLBAR);if (!hInst)return false;//David 08/04/98 - end - put CMenuSpawn in DLLHRSRC hRsrc = ::FindResource(/*AfxGetResourceHandle()*/hInst, MAKEINTRESOURCE(resId), RT_TOOLBAR);if (hRsrc == NULL) return false;HGLOBAL hGlb = ::LoadResource(/*AfxGetResourceHandle()*/hInst, hRsrc);if (hGlb == NULL) return false;ToolBarData* pTBData = (ToolBarData*) ::LockResource(hGlb);if (pTBData == NULL) return false;ASSERT(pTBData->wVersion == 1);szImage.cx = (int) pTBData->wWidth;szImage.cy = (int) pTBData->wHeight;if(ilList.Create(szImage.cx, szImage.cy, ILC_COLOR4|ILC_MASK, pTBData->wItemCount, 0) == false)return false;ilList.SetBkColor(cr3dFace);CBitmap bmp;bmp.LoadBitmap(resId);ilList.Add(&bmp, RGB(192,192,192));bmp.DeleteObject();WORD* pItem = (WORD*)(pTBData+1);int nBmpItems = 0;for(int i=0; i<pTBData->wItemCount; i++, pItem++){if(*pItem != ID_SEPARATOR)AddImageItem(nBmpItems++, (WORD) *pItem);}// ** it seem that Windows doesn't free these resource (from Heitor Tome)::UnlockResource(hGlb);::FreeResource(hGlb);// **return true;}void CGfxPopupMenu::AddImageItem(const int idx, WORD cmd){if (iImageItem == 0)pImageItem = (ImageItem *) GlobalAlloc(GPTR, sizeof(ImageItem));elsepImageItem = (ImageItem *) GlobalReAlloc((HGLOBAL) pImageItem, sizeof(ImageItem) * (iImageItem + 1), GMEM_MOVEABLE|GMEM_ZEROINIT);ASSERT(pImageItem);pImageItem[iImageItem].iCmd = (int) cmd;pImageItem[iImageItem].iImageIdx = idx;iImageItem ++;}void CGfxPopupMenu::RemapMenu(CMenu * pMenu){static int iRecurse = 0;iRecurse ++;ASSERT(pMenu);int nItem = pMenu->GetMenuItemCount();while ((--nItem)>=0){UINT itemId = pMenu->GetMenuItemID(nItem);if (itemId == (UINT) -1){CMenu *pops = pMenu->GetSubMenu(nItem);if (pops) RemapMenu(pops);if (iRecurse > 0){CString cs;pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);if (cs != ""){SpawnItem * sp = AddSpawnItem(cs, (iRecurse == 1) ? -4 : -2);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW, (UINT) -1, (LPCTSTR)sp);}}}else{if (itemId != 0){UINT oldState = pMenu->GetMenuState(nItem,MF_BYPOSITION);if (!(oldState&MF_OWNERDRAW) && !(oldState&MF_BITMAP)){ASSERT(oldState != (UINT)-1);CString cs;pMenu->GetMenuString(nItem, cs, MF_BYPOSITION);SpawnItem * sp = AddSpawnItem(cs, itemId);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW|oldState, (LPARAM)itemId, (LPCTSTR)sp);}}else{UINT oldState = pMenu->GetMenuState(nItem,MF_BYPOSITION);if (!(oldState&MF_OWNERDRAW) && !(oldState&MF_BITMAP)){ASSERT(oldState != (UINT)-1);SpawnItem * sp = AddSpawnItem(_T("--"), -3);pMenu->ModifyMenu(nItem,MF_BYPOSITION|MF_OWNERDRAW|oldState, (LPARAM)itemId, (LPCTSTR)sp);}}}}iRecurse --;}CGfxPopupMenu::SpawnItem * CGfxPopupMenu::AddSpawnItem(const wchar_t * txt, const int cmd) {if (iSpawnItem == 0)pSpawnItem = (SpawnItem **) GlobalAlloc(GPTR, sizeof(SpawnItem));elsepSpawnItem = (SpawnItem **) GlobalReAlloc((HGLOBAL) pSpawnItem, sizeof(SpawnItem) * (iSpawnItem + 1), GMEM_MOVEABLE|GMEM_ZEROINIT);ASSERT(pSpawnItem);SpawnItem * p = new SpawnItem;ASSERT(p);pSpawnItem[iSpawnItem] = p;lstrcpy(p->cText, txt);p->iCmd = cmd;if (cmd >= 0) p->iImageIdx = FindImageItem(cmd);else p->iImageIdx = cmd;iSpawnItem ++;return p;}int CGfxPopupMenu::FindImageItem(const int cmd){for (int t = 0; t < iImageItem; t++)if (pImageItem[t].iCmd == cmd) return pImageItem[t].iImageIdx;return -1;}void CGfxPopupMenu::EnableMenuItems(CMenu * pMenu, CWnd * pParent){ASSERT(pMenu);ASSERT(pParent);int nItem = pMenu->GetMenuItemCount();CCmdUI state;state.m_pMenu = pMenu;state.m_nIndex = nItem-1;state.m_nIndexMax = nItem;while ((--nItem)>=0){UINT itemId = pMenu->GetMenuItemID(nItem);if (itemId == (UINT) -1){CMenu *pops = pMenu->GetSubMenu(nItem);if (pops) EnableMenuItems(pops, pParent);}else{if (itemId != 0){state.m_nID = itemId;pParent->OnCmdMsg(itemId, CN_UPDATE_COMMAND_UI, &state, NULL);state.DoUpdate(pParent, true);}}state.m_nIndex = nItem-1;}}GfxOutBarCtrl.h// Copyright (c) Iuri Apollonio 1998// Use & modify as you want & need, and leave those 3 lines.// #if !defined(AFX_GFXOUTBARCTRL_H__28FA2CA4_11B7_11D2_8437_0000B43382FE__INCLUDED_)#define AFX_GFXOUTBARCTRL_H__28FA2CA4_11B7_11D2_8437_0000B43382FE__INCLUDED_#if _MSC_VER >= 1000#pragma once#endif// _MSC_VER >= 1000// GfxOutBarCtrl.h : header file///////////////////////////////////////////////////////////////////////////////// CGfxOutBarCtrl window#include<afxcoll.h>#define WM_OUTBAR_NOTIFY WM_USER + 1#define NM_OB_ITEMCLICK 1#define NM_OB_ONLABELENDEDIT 2#define NM_OB_ONGROUPENDEDIT 3#define NM_OB_DRAGITEM 4#define NM_FOLDERCHANGE 5struct OUTBAR_INFO{int index;const wchar_t * cText;int iDragFrom;int iDragTo;};class CGfxOutBarCtrl : public CWnd{// ConstructionDECLARE_DYNCREATE(CGfxOutBarCtrl)public:CGfxOutBarCtrl();enum { fSmallIcon = 1 << 0, fLargeIcon = 1 << 1, fEditGroups = 1 << 2, fEditItems = 1 << 3,fRemoveGroups = 1 << 4, fRemoveItems = 1 << 5, fAddGroups = 1 << 6,fDragItems = 1 << 7, fAnimation = 1 << 8, fSelHighlight = 1 << 9 };enum { ircIcon = 1, ircLabel = 2, ircAll = 3 };// Attributespublic:COLORREF crBackGroundColor, crBackGroundColor1;COLORREF crTextColor;COLORREF cr3dFace, crLightBorder, crHilightBorder, crShadowBorder, crDkShadowBorder;int iFolderHeight;int xSmallIconLabelOffset, yLargeIconLabelOffset;int ySmallIconSpacing, yLargeIconSpacing;int xLeftMargin, yTopMargin;bool bUpArrow, bDownArrow, bUpPressed, bDownPressed;CRect rcUpArrow, rcDownArrow;bool bLooping;int iHitInternal1, iHitInternal2;long lAnimationTickCount;int iLastSel, iSelAnimTiming;int iSelAnimCount;DWORD dwFlags;CPtrArray arFolder;int iLastFolderHighlighted;int iLastSelectedFolder;int iFirstItem;int iLastItemHighlighted;bool bPressedHighlight;int iLastDragItemDraw, iLastDragItemDrawType;class CBarItem{public:CBarItem(const wchar_t * name, const int image, DWORD exData);virtual ~CBarItem();int iImageIndex;wchar_t * cItem;。
AutoCAD软件的二次开发
7. 1 VisualLISP简介 VisualLISP简介
五、VisualLISP: Autodesk公司为增强AutoLISP程序开发能力而设 计的软件工具。
Visual LISP集成开发环境的组成部分: LISP集成开发环境的组成部分 集成开发环境的组成部分: 语法检查器: 语法检查器:可识别错误的AutoLISP结构和内部函数调用中不合适的参数。 文件编译器: 文件编译器:可改善程序的执行速度并提供一个有效的开发平台。 资源管理器: 资源管理器:允许用户在一个窗口中一步步地执行AutoLISP程序源代码,并在AutoCAD 图形窗口中显示代码执行结果。 AutoLISP格式工具:可重新安排程序格式,增强程序可读性。 格式工具: 格式工具 检查和观察工具: 检查和观察工具:可方便地访问变量和表达式的值,还可浏览AutoCAD图形实体的各项 属性值。 上下文相关菜单: 上下文相关菜单:提供有关AutoLISP函数信息以及对符号名的搜索。 项目管理系统: 项目管理系统:使用户可以更方便地管理多文件应用程序。编译过的AutoLISP文件将被 封装为一个单独的模块。 窗口保护和恢复功能:使用户可以保存并再次使用任一Visual LISP情景窗口环境。 窗口保护和恢复功能 智能化的控制台窗口:基本功能对应于AutoCAD文本屏幕窗口,同时提供了一些交互特 智能化的控制台窗口: 性。
CAD系统二次开发-ObjectARX中的实体造型技术解析
一、基本三维实体生成技术
3、生成基本三维实体的函数
基本的三维实体是指长方体(Box)、平截头体(Frustum)、球体(Sphere)、 圆环体(Torus) 、契体(Wedge)等,生成向营实体的AcDb3dSolid函数原型为: ①、长方体:生成一个中心在坐标原点,长、宽、高分别与X、Y、Z轴平 行的长方体,函数原型如下: virtual Acad::ErrorStatus ateBox(double xLen,double yLen,double zLen); 如果长方体的边长小于1E-6,函数返回Acad::eOutOfRange,如果生成失 败,函数返回Acad::eGeneralModelingFailure。
一、基本三维实体生成技术
3、生成基本三维实体的函数
③、球体:生成一个质心在WCS坐标原点的球体。函数原型如下:
virtual Acad::ErrorStatus createSphere(double radius);
④、圆环体:生成一个质心在WCS坐标原点的圆环体,Z轴为圆环中心线。 函数原型如下: virtual Acad::ErrorStatus createTorus(double majorRadius,double minorRadius); 其中MajorRadius、minorRadius分别代表圆环半径和圆管半径。
ObjectARX二次开发的实例
用ARX向导创建螺钉实例的程序步骤(1)启动VS2005,选择【File/New/Project】,系统弹出如图1所示的对话框。
从项目列表中选择【ObjectARX/DBX/OMF Project】选项,输入ScutStds作为项目名称,指定适当的保存位置,单击【OK】。
图1(2)系统弹出如图2所示的对话框,输入你的注册名称(不要以数字开头),注意在MFC Support这一项选择AutoCAD MFC Extension Support选项,其他选项都使用默认值,单击【Finish】,完成项目的创建。
图2(3)在项目中增加一个类来封装自定义函数,选择【Project/Add Class】,弹出的对话框中选择【C++ Class】,单击【Add】,系统弹出如图3所示的对话框,输入CUtilEnts作为新类的名称,单击【Finish】完成。
图3(4)在左侧栏中进入Class View,选中刚刚新建的类CUtilEnts右键点击【Add/Add Function】,这类里增加一个函数AppendEntity,弹出如图所示的对话框,参照图中所示修改其属性。
单击【Finish】完成。
图4此时系统自动生成一个UtilEnts.h的头文件和一个UtilEnts.cpp的源文件。
//此函数将实体添加到图形数据库的模型空间,这样才能使创建的实体被显示出来AcDbObjectId AppendEntity(AcDbEntity *pEnt); //函数实现(在源文件UtilEnts.cpp中) { //获得指向块表的指针AcDbBlockTable *pBlockTable;acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable,AcDb::kForRead); //获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord *pBlockTableRecord;pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord,AcDb::kForWrite); //将AcDbLine类的对象添加到块表记录中AcDbObjectId EntityId;pBlockTableRecord->appendAcDbEntity(EntityId, pEnt);//关闭图形数据库的各种对象pEnt->close();pBlockTable->close();pBlockTableRecord->close();return EntityId;}如同上述步骤再添加一个函数DrawLine,见如图所示的操作。
CAD二次开发学习笔记五(在ObjectARX中使用MFC)
CAD二次开发学习笔记五(在ObjectARX中使用MFC)要实现的功能是:执行ArxModal命令,弹出如图所示对话框,选择点,则得到点坐标,选择角度则得到角度值。
步骤一:新建基于MFC的ObjectArx项目,参考:/greatverve/archive/2010/05/31/ObjectARX-HelloWorld.html 打开资源视图添加一个对话框ID修改为IDD_ARX_MODAL(右击资源视图中的对话框打开属性面板,可以修改ID)设计如图界面,ID如下:IDC_BUTTON_POINTIDC_BUTTON_ANGLEIDC_EDIT_XPTIDC_EDIT_YPTIDC_EDIT_ZPTIDC_EDIT_ANGLE选择两个Button把Owner Draw设置为True完成界面。
步骤二:打开类视图,右击项目->添加类(这里不是右击对话框添加类)这张图有点小错误,这里Dialog ID:IDD_ARX_MODAL Class name:CArxDialog 在类视图中右击CArxDialog类添加变量这样会在头文件中生成源文件中生成可以直接修改这两处代码添加其他变量。
private:CAcUiPickButton m_btnAngle;CAcUiPickButton m_btnPoint;CAcUiNumericEdit m_editXpt;CAcUiNumericEdit m_editYpt;CAcUiNumericEdit m_editZpt;CAcUiAngleEdit m_editAngle;void CArxDlg::DoDataExchange (CDataExchange *pDX) { CAcUiDialog::DoDataExchange (pDX) ;DDX_Control(pDX, IDC_BUTTON_POINT, m_btnPoint);DDX_Control(pDX, IDC_BUTTON_ANGLE, m_btnAngle);DDX_Control(pDX, IDC_EDIT_XPT, m_editXpt);DDX_Control(pDX, IDC_EDIT_YPT, m_editYpt);DDX_Control(pDX, IDC_EDIT_ZPT, m_editZpt);DDX_Control(pDX, IDC_EDIT_ANGLE, m_editAngle); }步骤三:为CArxDialog添加InitDialog消息响应。
AUTOCAD二次开发笔记(ObjectARX)---全部
AUTOCAD二次开发笔记(ObjectARX)---全部编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(AUTOCAD二次开发笔记(ObjectARX)---全部)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为AUTOCAD二次开发笔记(ObjectARX)---全部的全部内容。
ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)在一个做CAD二次开发的公司做Web开发,感觉可提升的空间很小。
有必要研究一下公司的产品开发,以利发展。
一、首先安装好vs05与cad2008安装cad的时候也没有什么特别,加载到虚拟光驱,安装过程中有个错误提示,不影响继续。
二、安装ObjectArx2008直接打开解压缩到某个目录即可。
比如C:\ObjectARX 2008然后打开C:\ObjectARX 2008\utils\ObjARXWiz目录,运行ArxWizards.msi这样在新建C++项目的时候会出现ObjectARX项目,如图三、包含文件工具—〉选项—>项目和解决方案-〉VC++目录,如图所示:包含文件(添加图中前两个目录即可)库文件(添加图中前两个目录即可)四、新建ObjectARX项目,完成后添加MFC支持,如图所示:然后直接点finish打开acrxEntryPoint.cpp点击左上角的a>按钮,然后新建一个命令。
如图:只需要修改Internation Name与Localized Name为testcmd即可添加完成后,会在acrxEntryPoint。
