ARX中非模态对话框的用法
//类似一个全局变量
CNoModalDlg* pDlg = nullptr;
//资源切换
CAcModuleResourceOverride myResource;
CMDIFrameWnd* pCadWnd = acedGetAcadFrame();
pDlg = new CNoModalDlg;
pDlg->Create(IDD_DIALOG_TEST, pCadWnd);
pDlg->ShowWindow(SW_SHOW);
//重载ONCANCLE,ONOK
void CNoModalDlg::OnCancel()
{
//do somethin
DestroyWindow();//这句话要调用
}
void CNoModalDlg::OnOK()
{
//do somethin
DestroyWindow();//这句话要调用
}
//OnClose()->OnCancel()->DestroyWindow()->OnDestroy()->OnNcDestroy()->PostNcDestroy()->仅/表示时间先后而已
//而OnNcDestroy()最后又调用了PostNcDestroy()
void CNoModalDlg::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;//这句话用来关闭前面new出来的pDlg
}
关于cad与非模态对话框的关系
//autocad总是想取得它的子窗口的输入焦点,因此,当非模态对话框获取cad主动发送的WM_ACAD_KEEPFOCUS消息
//时,如果要保持输入焦点,必须返回TRUE来响应这个消息
//在CNoModalDlg.h中添加
afx_msg LONG onAcadKeepFocus(UINT, LONG);
//WM_ACAD_KEEPFOCUS如果缺少这个宏,需要添加cad开发包的一个头文件
#include "adslib.h"
//或者自定义
#ifndef WM_ACAD_KEEPFOCUS
#define WM_ACAD_KEEPFOCUS 100001
#endif
//在CNoModalDlg.cpp中添加
BEGIN_MESSAGE_MAP(CNoModalDlg, CDialog)
ON_MESSAGE(WM_ACAD_KEEPFOCUS, onAcadKeepFocus)
END_MESSAGE_MAP()
LONG CNoModalDlg::onAcadKeepFocus(UINT wparam, LONG lparam)
{
return TRUE;
}