1、ARX中对话框通常继承自CAcUiDialog,CAcUiDialog 构造函数有个参数 HINSTANCE hInstance,默认为 NULL,指定了对话框资源所在DLL进程。如果没有指定该参数,在创建对话框(DoModal或Create)前,需要切换资源,一般是定义一个变量:CAcModuleResourceOverride res; 这个类的特点是创建的时候自动切换资源空间为当前模块,析构的时候自动切换回之前的资源空间。对于模态对话框(DoModal),在对话框存续期间,res变量也持续存在,所以,除非对话框内部要使用其他模块的资源,否则不需要再额外处理。对于非模态对话框(Create),随着创建对话框的函数结束,res变量也结束生命周期,会换回之前的资源空间,此时对话框仍然持续,在对话框内部使用资源的时候,需要再次切换资源空间。
2、CAcUiDialog 会记住上次的位置信息,如果没有进行窗口位置(最大化、居中等)操作,对话框会显示在上次退出时的位置。
3、CAcUiDialog 在模态对话框显示期间可以通过命令 BeginEditorCommand 和 CompleteEditorCommand / CancelEditorCommand 与图形进行交互,调用 BeginEditorCommand,会暂时隐藏对话框,此时可以对图形进行操作,操作完毕之后,调用CompleteEditorCommand / CancelEditorCommand 恢复显示或退出对话框。
4、CAcUiDialog 显示非模态对话框(Create),对话框会自动失去焦点,无法进行需要焦点的操作(输入、选中列表等),焦点自动切换到了图形界面。此问题的解决方法是增加一个消息处理函数:
afx_msg LRESULT OnAcadKeepFocus(WPARAM wParam, LPARAM lParam);
消息映射为:ON_MESSAGE(WM_ACAD_KEEPFOCUS, OnAcadKeepFocus)
实现:LRESULT CXXXDlg::OnAcadKeepFocus(WPARAM, LPARAM) { return TRUE; }
5、对于继承自CDialog的非模态对话框,有一个解决失去焦点的方法是,设置对话框样式(Style)为 Overlapped,而非 Popup。(不是设置Overlapped Window属性)

本文深入探讨了在ARX开发中创建和使用对话框的过程。通过实例,详细解释了如何集成对话框到应用程序中,涉及到了对话框的设计、控件添加以及用户交互的实现,对于理解ARX应用程序的扩展具有指导意义。
410

被折叠的 条评论
为什么被折叠?



