ARX中非模态对话框

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;
}
发布了78 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/zeqi1991/article/details/94597162