ObjectARX开发环境下的AutoCAD对话框设计

ObjectARX开发环境下的AutoCAD对话框设计
袁梅李亚萍张竟
(武汉大学城市建设学院,湖北 武汉 430072)
摘要:在ObjectARX开发环境下,AutoCAD支持两种格式的对话框:PDB对话框和Windows机制的对话框。从简单实例出发,本文介绍了这两种格式的对话框设计。
关键词:ObjectARX;AutoCAD;PDB;MFC;对话框
}
以上只给出了主调用函数drive_main()和回调函数print_cb()、ok_cb()的部分代码,相当于ObjectARX应用程序中的用户程序主体函数部分,Mypdb.cpp中头文件部分、函数声明部分和接口函数部分和一般的ObjectARX应用程序要求相同,不再写出。必须注意,头文件中一定要有#include“adsdlg.h”。
Microsoft基础类库(MFC)给软件开发者提供了一种便捷快速建立标准的用户界面的方法。ObjectARX开发环境也提供了一系列基于MFC的用户界面类,我们可以使用这些类设计Windows风格的对话框。使用Windows对话框的ObjectARX应用程序将使自己的界面与AutoCAD内建对话框界面完全一致,且可与其它Windows应用程序紧密集成在一起,共享Windows的各种资源,而且程序的维护也非常方便。在ObjectARX应用程序中使用MFC最明显的优点是可以充分利用MSVC(Microsoft Visual C++)开发环境提供的先进技术和工具,实现程序界面的可视化设计。Windows对话框也是Autodesk极力推荐开发者使用的对话框。
在CAD软件开发中,对话框的设计是软件开发者非常关心的问题之一。AutoCAD除了使用命令行与用户进行交互外,还可使用对话框。对话框是一种边界固定的窗口,也是一种最先进、最流行的人机交互界面。运用对话框可以方便地实现程序设计时的数据传输和信息传输,,所以在当今的几乎所有的软件都要用到对话框界面与用户交流。在CAD的二次开发中,可以采用两种方式使用对话框技术:,一种是PDB格式,即使用AutoCAD系统本身提供的可编程对话框技术,另一种是使用Windows机制的对话框设计技术。
3.2对话框的创建
利用Visual C++提供的应用程序设计向导Application Wizard可以方便、快速地创建Windows对话框。下面以图2所示对话框为例,说明其创建步骤:
1、创建ObjectARX MFC应用程序框架首先在VC++集成开发环境中建立项目文件,从“File”菜单中选择“New”,在弹出的对话框中选择“Project”选项卡,从中选择“MFC AppWizard(dll)”,在“Project name:”编辑框中输入项目名称:Mymfc,在“Location:”中输入路径,单击OK。在随后出现的对话框中选择“MFC Extension DLL(Using shared MFC DLL)”,单击“Finish”。这样就建立了一个基本的项目框架,自动生成了四个基本文件(Mymfc.cpp、Mymfc.def、StdAfx.cpp、StdAfx.h)和两个资源文件(Resource.h、Mymfc.rc)。在建立了项目文件后,还需进行项目设置,以便以后能正确地编译和链接应用程序。
width=25;
height=9;
color=graphics_background;
}
}
ok_cancel;//定义OK和CANCEL按钮
}
/*........................................... MYPDB.DCL文件结束……………......................*/
其中OK_CANCEL按钮是从AutoCAD的BASIC.DCL中自动引用来的按钮。
对话框定义文件可用任意文本编辑器进行编辑。也可在VisualC++集成开发环境中,单击File|NEW菜单,在弹出的对话框中选择“File”选项卡,选择“Text File”,不要核选“Add to project”项,输入文件名为Mypdb.dcl,存放位置可选与对话框驱动程序所在的项目文件路径相同,单击OK。
ads_get_tile(cpkt->dialog, "K1", tbuf, MAX_TILE_STR);
R1=atof(tbuf); //字符串转化为双精度浮点数
acutPrintf("\n R1=%f",R1);
.................. //获取各控件的值,送入相应的变量
ads_done_dialog(cpkt->dialog,1);//正常关闭对话框
3.1 AdUi与AcUi类库
在ObjectARX中,由Autodesk提供的与用户界面UI有关的MFC系统分为两个类库:一个称为AdUi,它是一个MFC扩展动态链接库,用于扩展某些与UI有关的MFC类。这个库是为了使用AutoCAD和其它Autodesk产品而开发的,它包含了核心功能。另一个称为AcUi,它是在AdUi架构基础上建立的,专门用于AutoCAD,提供AutoCAD专用的外观和特性。
在使用MFC建立ObjectARX应用程序时,我们可以选择动态或静态链接MFC库的方式,对于动态方式,我们可以选择常规的DLL方式或扩展的DLL方式。首选方法就是使用动态链接的MFC库,并将其做成扩展DLL,因为这是唯一可以安全使用AdUi和AcUi这两个MFC RX基本类库的方法。
要在基于MFC的应用程序中使用AdUi和AcUi,在Visual C++源文件中必须包含adui.h和acui.h文件,链接时必须与adui15.lib和acui15.lib相链接。在建立使用AdUi和AcUi的ObjectARX应用程序时,关键点有三个:一是要在Visual C++集成开发环境中生成MFC AppWizard(dll)项目类型;二是要与MFC动态链接;三是要在Application Wizard自动创建的原代码中,手工加入与AutoCAD的接口语句。
2.2驱动程序
对话框必须利用驱动程序才能发挥作用,驱动程序由主调用函数和回调函数组成。主调用函数用于装入、显示、交互以及清除对话框;回调函数一般用于对对话框中各控件的值进行提取等操作。ObjectARX提供了一系列用于操作AutoCAD PDB对话框的库函数,它们均以ads_开头。主调用函数与ObjectARX应用程序中的用户函数融为一体,在需要对话框的位置上,加入调用对话框及处理对话框结果的相关函数即可。回调函数一般单独给出,专用于操作对话框中的各控件,常常在函数名前加CALLB以示区别(CALLB实际上是一个空字符),并且它的返回值为void。一般对应于一个对话框有多个回调函数。
2、用Visual C++ App Studio创建MFC对话框选择“Insert/Resource…”菜单项向项目文件中加入对话框资源,在控件工具栏中选择适当的控件资源,插入到新建的空白对话框中,调整对话框的布局,编辑对话框及其控件的特性。
在Visual C++ 6.0中编译Mypdb.cpp,生成Mypdb.arx文件,打开AutoCAD2000加载Mypdb.arx文件,输入相应的外部命令,则弹出图1所示的对话框。在对话框中输入参数,点击“OK”按钮,在AutoCAD的命令提示行会显示刚才输入的参数值,并关闭对话框。
3基于MFC的用户界面设计
ads_start_image(hdlg,"image");
ads_slide_image(0,0,sht1-5,sht2-5,"msld"); //幻灯片名为MSLD.SLD来自ads_end_image();
ads_start_dialog(hdlg, &dlg_status);//启动对话框,让用户与对话框进行交互
以下分别介绍了以ObjectARX为开发工具、在Visual C++ 6.0集成开发环境中AutoCAD2000的这两种格式的对话框设计。
2基于AutoCAD PDB的对话框设计
PDB是可编程对话框(Programmable Dialog Box)的缩写,是从R12开始提供的一种用于与用户交互的可视化界面。开发PDB对话框的关键有两个:,一是掌握DCL语言,二是编写ObjectARX驱动程序。许多已使用DCL对话框的ADS程序,只需对编程接口稍作修改就可移植到AutoCAD2000平台上,并且ObjectARX 2000向下兼容ADS,提供了与之对应的全局函数ADSRX,因此完全可在ObjectARX2000中采用ADSRX函数进行开发。
下面给出图1所示对话框的DCL文件Mypdb.dcl:
dcl_settings:default_dcl_settings {audit_level=0;}
Mypdb: dialog {//定义名为Mypdb的对话框
label = "PDB对话框示例"; //对话框标签
:row {//定义一个行控件
:boxed_column {//定义一个带框列控件
PDB对话框由对话框定义文件和驱动程序两部分组成。对话框定义文件用于定义对话框的外观,包括对话框的风格、位置、尺寸、内部控件及控件初值等。对话框驱动程序用于管理对话框的显示、与用户的交互、关闭以及获取对话框中控件值。
2.1对话框定义文件
对话框定义文件是一种文本文件,其后缀为.dcl,它借助对话框控制语言(Dialog Control Language,简称DCL)来定义对话框的外观。DCL是Autodesk公司创建的专门用于生成对话框的命令语言。在用DCL定义对话框时,对话框中的单一部件称为“控件”,控件的布局、外观和行为借助于控件的属性而规定。对话框采用树型层次结构表示法,树的根节点为对话框本身,在DCL中称为dialog,树的叶节点可由各种控件和控件组构成,装配这些控件的过程就是定义对话框的过程,对话框是控件的有机组合。AutoCAD PDB模块提供了各种预定义的控件、控件组,以及控件的属性。事实上,编写DCL文件就是调用这些控件,并设置控件的属性。
合集下载

详解ObjectARX开发环境的...

详解ObjectARX开发环境的...

详解ObjectARX开发环境的...在⼀个做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⼆次开发⽅⾯有些发展。

转⾏也⾏,呵呵。

到此这篇关于ObjectARX开发环境的创建与开发实例Hello World(VS2005+AutoCad2008+ObjectArx2008)的⽂章就介绍到这了,更多相关ObjectARX环境的创建内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。

运用ObjectARX进行AutoCAD二次开发实例

运用ObjectARX进行AutoCAD二次开发实例
e e u ig I c eo e ae o v n e t , di i ag o x mp e x c t .t a b p r tdc n e in l a o de a l n n yn ts
构和 代 码 , 直接 访 问 Auo A 数 控 库 结构 、 tC D 图形 系
【 要】介绍 了运用 O j cA X进行 A tC D二次开发 摘 b e tR uoA
o Auo f t CAD S c n De eo me t e gn e n a p iai n e o d v lp n i n ie r g p l t . n i c o
的实现 过程 内容 包括建立设备 图库 、 设备 数据库 , 设备 图 对
空 间 内运 行 并 能直 接 利 用 Auo A 核 心 数 据 库 结 tC D
o e aige u p n al r d q i me t t b s . h s x mp e p r t i me t l y a up n a a e T i e a l n q g e n e a d C i c et g h o g d f i g r gse h r c s f n a dr ts t .T r u h mo i n e itr i t e p o e s o e n i y n s t g t i lme t d r c la e y a p ia in a d dr c et ,i mp e n i t o d d b p l t n i e c o n i t e
20 jc A X概 述 betR
在 A tC D 提 供 的各 种 开发工 具 中 , CC + uo A 以 /+ 开发 工具 的效率最 高 、 能最强 。 uo AD使用 一种 功 A tC 特 定 CC +编程 环 境—0b c X。O jc X 包 /+ jt e AR bet AR 含一 组 CC +类 库 , 些库 与 A tC D 在 同一地 址 /+ 这 uo A

关于ObjectArx的建筑设计CAD平台的构建

关于ObjectArx的建筑设计CAD平台的构建

符串然后发送到命令窗口,该条命令就会一步步执行下去。

以多重视口图块为例一createcontent命令的执行过程如图2-6:图2.6-createcontent命令执行过程这里,多视向图块入库的另一关键是要确定多视向图块的名称。

该多视向图块的名称实际上是用户在建立多视向图块文件时所定义的多视向图块样式名,而非含有该多视向图块的DWG图形文件名。

目前,ObjectARX开发包中并没有提供支持ADT对象的接口函数。

ADT从2004版开始通过ActiveXAutomation技术提供部分对象接口,包括与多视向图块有关的若干对象,但也并没有暴露其全都属性和方法。

最后,我们是通过ObjectARX调用使用ActiveX的VB程序加以解决的:用、,B程序识别并返回当前图形中所有可能的多视向图块,让用户选择。

在ADT2006版下,还可初步确定其中的三维多视向图块以供用户优先选择,见图2-7的图块内容。

苎三竺i塑壁墨堡生业兰鱼塑塑垄兰三童壁苎堡生!些!鱼塑薹查堡塑垫查堡垄图2-8图元预览图4-2图层转换器主界面图中列表框“转换自”中的源图层信息取自集团提供的SGS公司实验楼图形文件。

选择映射后需要转换的图层映射关系见图3.3中的列表框“图层转换映射”。

双击某映射图层的颜色、线型等属性字段,可以对这些图层属性进行编辑,编辑界面如图4.3所示。

图4-3图层映射关系表图纠编辑图层属性4.1.2联机图层转换程序LayerControi4.1.2.1程序命令的设计与定制在脱机图层转换器中,我们提供了用*.ysb文件保存图层转换的映射关系的功能。

因此,现在所要实现的AutoCAD内部命令的功能主要是:根据与AutoCAD所打开的DWG文件相适应的ysb文件中所保存的源图层和目标图层的信息,对该DWG文件进行图层的实时转换。

在程序实现中,我们采用第2章中的Objec伽LX开发技术,定制T--个内部命令:●SELYSB:让用户选择打开一个图层转换映射关系表(.YSB)文件,以用于图层的再转换和复原。

ObjectARX环境下的结构建模系统的开发

ObjectARX环境下的结构建模系统的开发

ObjectARX环境下的结构建模系统的开发摘要本文介绍了AutoCAD提供的ObjectARX开发环境,阐述了利用ObjectARX 开发一种新的结构建模系统的思路及方法,即直接利用绘图工具进行结构信息输入。

输入的结构信息可以生成为不同的数据文件,从而大大提高工作效率。

关键词结构建模 ObjectARX 面向对象前言近年来,随着计算机技术的飞速发展,绝大多数的工程设计人员已经采用计算机来进行建筑结构的分析和设计。

在实际应用中,有众多的结构分析软件可供选择,如ANSYS、SAP2000等。

这些软件虽然都能较好地完成分析任务,但它们基本上都是按传统的编程方法实现的,其前后处理功能还有待进一步改进。

结构分析软件中的前后处理部分通常是用户耗时最多的阶段,尤其是结构建模部分更是关键,它直接影响着软件的应用效率。

因此,对结构建模这一功能模块进行专门的研究和开发,使其拥有更强的功能和更高的效率,成为了建筑结构设计及软件开发人员的重点课题。

利用纯Windows风格的AutoCAD2000提供的开发环境ObjectARX来进行结构建模系统的研制,可以充分利用面向对象编程技术的优势,最大限度地提高系统资源的利用率和软件系统的功能,而且也符合广大工程设计人员的使用习惯,有助于设计人员快速地掌握、使用新开发的结构建模系统,提高工作效率。

1 面向对象的开发环境ObjectARXAutoCAD是目前在Windows 98/2000/NT 环境下应用最广泛、使用人数最多的CAD软件,它是广大工程设计人员最为熟悉的工作平台。

AutoCAD2000除了提供一般通用的CAD 功能,如绘图、编辑等,还为用户提供了不同的开发环境,如AutoLISP、VisualLISP、ObjectARX等。

其中,ObjectARX是一种特定的C++编程环境,它是在AutoCAD R13使用的ARX的基础上发展起来的第二代面向对象的编程环境。

ObjectARX应用程序本质上是Windows DLL程序,而AutoCAD本身则是一个典型的Windows程序,因此ObjectARX 应用程序与AutoCAD、Windows之间均采用Windows的消息传递机制直接通信。

基于ObjectARX.net的AutoCAD二次开发及应用

基于ObjectARX.net的AutoCAD二次开发及应用
>N w>Poet。在新 建工程 对 话框 中选 择“ i a C#工程 ” e r c) j Vs l u ,
e . re sae“ l ol ) d W i Me g(HeoWl d ; t s l r”
/ N明要使用 的对象 /
Cicecr l ; r l i e c
d 将 被输 ”
中 圈 分 类 号 : 1 . U4 2 6 文献标 识码 : A
1 O jeA X.e 开发 环境 bet R n t
的 O jc R nt 一 种 特 定 的 . e 编 程 环 境 , bet R n bet X.e 是 A n t O jcA X. e t
用它们 。在 Cas 类 的声 明语 句 ( l l s 位于 Ca 1 C l s .S文件 的顶 部 ) s 之
维普资讯
第3 3卷 第 1 2期 20 0 7 年 4 月
山 西 建 筑
S HANXI ARCHI 兀 瓜 I TE
Vo . 3No. 2 13 1
A t 20 p. 07
・3 1 ・ 6
文章编号:0 96 2 {07 1 .3 10 10 .8 5 20 】20 6 —2
p bi vi Hec r ( u l o u l ) c d d
u i Au o e k. t C sn g td s Au o A . o tr 。 D Ge / Heow0l l d
Edtre i d= o Ap l ain pi t .Do u nM a a e .M dAcie ̄ un n .Edtr c o c me t n g r i t I v re t i ; o
2 创 建一 个面 向对 象 O jen X.e 的 dI 用程 序 betR nt l应

基于objectarx二次开发在autocad中实现QQ抽屉效果

基于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中的应用-ObjectARX(C++)编程-Objec...

简介钩子技术在AutoCAD中的应用-ObjectARX(C++)编程-Objec...本帖最后由 highflybird 于 2009-5-5 01:19 AM 编辑很久没摸arx了,不久看到了一篇介绍钩子技术在 AutoCAD中应用的文章,不敢独享,特此奉献给大家。

钩子技术是很有用的一种技术,它如同给函数挂上一个钩子(我们自己的函数),让它在执行前先执行我们挂的钩子(我们挂接的函数),从而达到拦截事件和函数调用等的目的。

在autocad中,利用钩子技术可以为我们做很多事情:如建立快捷键(不希望更改已有菜单),等待或者触发特定消息(如鼠标,键盘),可以获得比反应器更强大的功能,等等。

objectARX提供了几种向autocad注册钩子函数的ARX API函数,见下面:acedRegisterFilterWinMsg,注册一个钩子函数acedRemoveFilterWinMsg,注销一个钩子函数acedRegisterWatchWinMsg, 监测钩子函数acedRemoveWatchWinMsg, 移除监测函数其具体用法各位不妨参考帮助文件。

下面函数提供一个例程,该例程定义了一个快捷命令Ctrl+I,当用户按下快捷键时候,autocad 将执行appload命令。

我这里采用了向导方式创建了一个新工程Hook采不采用MFC对这个程序没有影响.在acrxEntryPoint.cpp 中开头添加如下代码:1.#include <aced.h> //仅因为版本较低,所以加了这两个2.#include <rxmfcapi.h> //对于高版本无须此两个复制代码并申明函数:1.//------------------------------------------------------------------------------------------------2.//函数原型及其全局变量申明3.void sendCommandToAutoCAD(HWND hWndAcad,CString cmd); //向AutoCAD窗口发送字符串命令(cmd)4.void watchCtrlI(const MSG * pMsg); //钩子监测函数5.void Accelerator(void); //快捷键注册函数6.static BOOL filterCtrlKeyDone = FALSE;7.//------------------------------------------------------------------------------------------------复制代码函数定义1.void Accelerator(void)2.{3.if(filterCtrlKeyDone == TRUE)4.{5.acutPrintf(_T("Hook has already been registered!\n")); //如果钩子已经注册,则返回6.return;7.}8.if(acedRegisterWatchWinMsg(watchCtrlI) == FALSE)9.acedPrompt(_T("Hook can't be registered!\n")); //无法注册钩子10.else11.{12.acedPrompt(_T("Shortcut Ctrl+I has been defined!\n")); //快捷命令Ctrl + I 已经定义13.filterCtrlKeyDone = TRUE;14.}15.return;16.}17.//钩子监测函数,监测Ctrl+I键盘消息18.void watchCtrlI(const MSG *pMsg)19.{20.if (pMsg->message == WM_CHAR && pMsg->wParam == 9) //发生键盘Ctrl + I消息21.{22.sendCommandToAutoCAD(adsw_acadMainWnd(),_T("appload\n"));23.//这里可以是你自己定义的任何函数24.}25.return;26.}27.//向AutoCAD窗口发送字符串命令(cmd)28.void sendCommandToAutoCAD(HWND hWndAcad,CString cmd)29.{30.if(! hWndAcad)31.return;32.COPYDATASTRUCT cmdMsg;33.cmdMsg.dwData = (DWORD)1;34.cmdMsg.cbData = (DWORD)_tcslen(cmd) + 1;35.cmdMsg.lpData = cmd.GetBuffer(cmd.GetLength() + 1);36.SendMessage(hWndAcad,WM_COPYDATA,(WPARAM) hWndAcad, (LPARAM)& cmdMsg);37.return;38.}复制代码修改一下初始化入口On_kInitAppMsg和卸载函数On_kUnloadAppMsg1.virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {2.// TODO: Load dependencies here3.// You *must* call On_kInitAppMsg here4.AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;5.6.// TODO: Add your initialization code here7.//我在这里添加到了初始化,如果你感觉不好的话,可以定义到命令组里8.Accelerator();9.10.return (retCode) ;11.}12.virtual AcRx::AppRetCode On_kUnloadAppMsg (void*pkt) {13.// TODO: Add your code here14.// You *must* call On_kUnloadAppMsg here15.AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;16.// TODO: Unload dependencies here17.18.//卸载arx程序前卸载钩子函数19.if(filterCtrlKeyDone == TRUE)20.{21.acedRemoveWatchWinMsg(watchCtrlI);22.acutPrintf(_T("\nHook has been removed!\n"));23.}24.25.return (retCode) ;26.}复制代码编译后,形成arx,加载hook.arx,然后当你用快捷键的时候,你就会发现弹出appload对话框了。

运用ObjectARX进行AutoCAD二次开发实例

社,2000. 【2】 [ 美 ]David J. Kruglinski, Scot Wingo, George Shepherd,希望图书创作室,译,Visual C++6.0 技术内 幕[M].北京:希望电子出版社,1999. 【3】张君,周杰,等.InstallShield6.X/VB/VC/Delphi 安装程序设 计与制作[M].北京:北京希望电子出版社,2001.
运用 Object ARX 进行 Aut oCAD 二次开发实例
■席世亮(中国中元国际工程公司,北京 100089)
【摘 要】 介绍了运用 Obj ect ARX进行 Aut oCAD二次开发 的实现过程。内容包括建立设备图库、设备数据库,对设备图 库、数据库进行操作。本实例可以直接安装,安装过程中通过 修改注册表,实现应用程序直接加载,直接运行,操作简便,是 工程应用中对 Aut oCAD进行二次开发的一个很好的范例。 【关键词】Obj ect ARX; Aut oCAD;二次开发 【中图分类号】TU17 ;TP311 【文献标志码】 A
32建立设备参数数据库在工艺设计中常常需要了解各种工艺设备的9f1设备插入对话框技术参数为了方便设计人员查阅各种设备的技术参数我们建立了设备参数数据库并在控制程序中设置了数据库管理系统实现对数据库的存储查询检索安全保护等功能
公用工程设计
Public Utilities Design
【文章编号】1007-9467(2010)11-0088-04
图 1 设备插入对话框
3. 1. 2 制作图库的管理界面 本系统借助 AutoCAD 的菜单来管理和使用图
库中的设备样块。AutoCAD2000 以上支持部分菜单 加载机制,也就是说在不退出现有菜单的基础上,可

ObjectARX与MFC结合开发AutoCAD应用程序


F b2 o e .O 7
V0 . NO. 124 1
文章编号 :0 7—18 (0 7 0 — 0 8— 3 10 35 20 ) 1 02 0
O jc R bet X与 MF A C结 合 开 发 A tC D应 用 程 序 uo A
崔秀 丽 鲁 墨武 邢 艳秋 胡乾 坤
( 沈阳航空工业学院 C D C M工程中心 , A/ A 辽宁 沈阳 10 3 ) 10 4
O jc R 是 A tds be t X A uo ek公 司 针 对 A tC D uo A
MF C库允 许开 发者快 速地 建 立标 准 的用户 界 面 。 Ojc R bet X环境 提 供 了一 组 类 , 得 开 发 者 能 够 A 使 创 建基 于 MF C的用户 界 面 , 外 观 和 内建 于 u 其 A— t A o D的用 户 界 面完 全 相 同 。与 其 应 用 程 序 如 C A S和 Ls D i p相 比 , betR 充 分 利 用 了 Wi— O jc X A n
摘
要: 介绍 了 M C, F 一个基于 Mi oo i a C++环境下编程的程序框架 , c sfVsl r t u 以及 O jcA X的 b tR e
基 于 Mi oo i a C+ +语 言 环境 下 的 A t A c sfVsl r t u uo D二 次 开 发 软 件 包 。 讨 论 了如 何 将 MF C C与 O - b
应 用程 序 的方法 。
间, 并且无须使用繁琐的 D L语 言, C 就可 以做 出 符 Widw n o s规范 的美观界 面 。
由于 A tC D试 图 把 注 意 力 从 所 有 的 子 窗 uo A 口转 移开 , 得非 模 式 对话 框 有 特 殊 的要 求 。在 使

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消息响应。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档