ObjectARX对话框添加颜色下拉组合框

本文介绍如何在Arx中使用CAcUidialog类创建一个带下拉列表的对话框,包括设置OwnerDraw为Fixed、HasStrings为true以及Type为DropList等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

建立Arx基本对话框,最好是基于CAcUidialog类.

首先添加combox控件更改一下属性:

先修改Owner Draw为Fixed,再更改Has Strings 为true

Has Strings 如果不设置,文字会是乱码,

更改Type为Drop List

再添加对话框的变量.

添加这个控件的变量,设置如下图:

 

完成效果:

 

ps:我的是基于vs2010+arx2012wizard,

对于添加变量这个对话框,如果没有CAcUi系列类型,直接输入即可.或者参考我的另一篇博文修改一下添加变量这个页面的classid即可,

详见http://www.cnblogs.com/edata/p/6821379.html

 

转载于:https://www.cnblogs.com/edata/p/6854503.html

<think>好的,用户的问题是关于如何在ObjectARX中获取已打开对话框的句柄。我需要先理解用户的具体需求和背景。ObjectARX是AutoCAD的二次开发工具,通常使用C++进行开发。用户可能正在开发一个AutoCAD插件,需要在某个对话框打开后获取其句柄,以便进行后续的操作,比如修改对话框属性或者监控其状态。 首先,我应该回忆一下Windows API中关于对话框和窗口句柄的知识。每个窗口(包括对话框)在创建后都会被分配一个唯一的句柄(HWND)。用户需要获取这个句柄,可能需要使用FindWindow函数或者EnumWindows函数来遍历当前系统中的窗口。 然后,考虑ObjectARX和AutoCAD的环境。AutoCAD本身是一个多文档界面(MDI)应用程序,每个对话框可能属于不同的文档窗口或应用程序主窗口。因此,在获取对话框句柄时,可能需要指定正确的父窗口句柄,或者根据对话框的类名和标题来查找。 接下来,用户可能遇到的问题是如何确定对话框的类名和标题。如果对话框是使用MFC创建的,类名可能与MFC的对话框类相关;如果是直接使用Win32 API创建的,类名可能是自定义的。用户需要知道对话框的类名或标题才能准确查找。如果用户自己创建了这个对话框,那么他们应该知道这些信息;如果是AutoCAD内置的对话框,可能需要通过其他方式获取,比如使用Spy++工具来查看。 另外,还需要考虑对话框的创建方式。如果对话框是模态的,那么在对话框关闭之前,代码可能不会继续执行,所以获取句柄的时机可能需要放在对话框创建之后但进入消息循环之前。如果是非模态对话框,可能需要通过某种回调或事件来获取句柄。 然后,我应该整理出具体的步骤。首先,使用FindWindow函数,需要类名和窗口标题。如果不知道类名,可能需要枚举所有窗口,通过标题或其他属性来筛选。使用EnumWindows函数配合回调函数,逐个检查窗口的标题是否符合目标对话框的标题。 此外,需要考虑多实例的情况。如果AutoCAD中有多个相同类名和标题的对话框,可能需要更精确的过滤条件,比如父窗口句柄或者其他属性。这时,可能需要结合GetParent函数或者GetWindowLong来获取更多信息。 还有,代码示例部分需要准确。在ObjectARX中,可能需要使用acedGetAcadFrame()来获取AutoCAD主框架窗口的句柄,然后作为FindWindowEx的父窗口参数,以限定搜索范围,避免找到其他应用程序的窗口。 最后,要注意错误处理和边界情况。例如,对话框可能尚未创建,或者已经关闭,这时获取句柄会失败,需要适当的错误提示或检查。 总结一下,回答需要分步骤,先解释原理,再给出具体的代码示例,并提醒用户需要注意的事项,比如类名和标题的获取,以及如何确保对话框已经创建。同时,可能需要建议用户使用工具如Spy++来帮助确定对话框的属性,以便正确使用FindWindow或EnumWindows函数。</think>在ObjectARX中获取已打开对话框的句柄,可以通过以下步骤实现: ### 核心原理 使用Windows API的`FindWindow`函数,通过对话框的类名或标题来查找窗口句柄。 ### 实现步骤 1. **包含头文件** ```cpp #include <Windows.h> ``` 2. **获取主框架句柄** ```cpp HWND hAcadWnd = acedGetAcadFrame()->GetSafeHwnd(); ``` 3. **查找对话框句柄** ```cpp // 方式1:通过类名查找 HWND hDlg = ::FindWindowEx(hAcadWnd, NULL, L"YourDialogClassName", NULL); // 方式2:通过标题查找 HWND hDlg = ::FindWindowEx(hAcadWnd, NULL, NULL, L"Your Dialog Title"); ``` ### 完整示例代码 ```cpp // 获取AutoCAD主窗口句柄 HWND hAcadMain = acedGetAcadFrame()->GetSafeHwnd(); // 查找指定类名的对话框 HWND hTargetDlg = ::FindWindowEx( hAcadMain, NULL, L"AfxFrameOrView140s", // 示例类名(MFC标准对话框) L"ObjectARX Dialog" // 对话框标题 ); if (hTargetDlg != NULL) { acutPrintf(L"\n成功获取对话框句柄: 0x%p", hTargetDlg); } else { acutPrintf(L"\n未找到目标对话框"); } ``` ### 关键注意事项 1. **类名/标题获取方法** - 使用Spy++工具查看对话框属性 - 对于MFC对话框,类名格式通常为`Afx:...` - 对于自定义对话框,需在创建时指定窗口类名 2. **特殊场景处理** - 模态对话框:需在`DoModal()`返回前获取句柄 - 子对话框:使用`FindWindowEx`逐层查找 - 多实例情况:结合`EnumWindows`遍历窗口列表 ### 扩展建议 - 使用`GetWindowThreadProcessId`验证窗口归属 - 通过`SendMessage`与对话框进行交互 - 建议配合`IsWindowVisible`判断可见性 完整代码需要根据实际对话框属性调整类名和标题参数。建议在对话框初始化时存储句柄到全局变量,便于后续操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值