MFC对话框学习笔记之模态对话框转化为非模态

这篇博客介绍了如何将MFC的模态对话框转换为非模态对话框,涉及对话框对象的销毁、循环引用问题及窗口句柄获取。在点击确定按钮时,通过UpdateData获取用户输入并调用View类的OnDraw函数画圆。同时,文章提到了在对话框取消时防止内存泄漏的方法,即在PostNcDestroy函数中释放内存。此外,还讨论了在OnDraw函数中使用Ellipse函数画圆的原理及其坐标系统。
摘要由CSDN通过智能技术生成


模态对话框用起来很方便,直接定义一个对话框对象,然后调用DoModal(); 即可 

如:

void CYuanView::OnSet() 
{
// TODO: Add your command handler code here
CSettingDlg dlg;
if(IDOK==dlg.DoModal())
{
m_x=dlg.m_dlgx;
m_y=dlg.m_dlgy;
m_r=dlg.m_dlgr;
}

	Invalidate();//使得窗口无效 让系统自动调用ondraw()函数 默认参数是true 表示刷新背景 如果是false则不刷新背景
}
      要改成非模态的一般在调用对话框的时候动态new一个对话框对象出来 然后依次调用create 和 showindow函数即可显示出来 

如:

void CYuanView::OnSet() 
{
	// TODO: Add your command handler code here

	if(dlg == NULL)
	{
		dlg = new CSettingDlg;
		dlg->Create(IDD_DIALOG1,this);	
		dlg->ShowWindow(SW_SHOW);
	}
	else
	{
		dlg->SetActiveWindow();
	}
}
为了点击onset对应的按钮时候 只实例化出来一个对话框

在对应的view类中添加一个 对话框对象的指针,并在view的构造函数中初始化其为NULL;

public:CSettingDlg * dlg;

 
CYuanView::CYuanView()
{
	// TODO: add construction code here
	dlg = NULL;//初始化
}
如果dlg != NULL 则把对话框设置为当前的活动窗口

dlg->SetActiveWindow();

这样就能实现点击onset对应的按钮会出现一个对话框出来

接下来要实现的是在点击对话框中的确定按钮的时候 调用view类中ondraw函数来实现画圆的操作

用最简单的关联变量法,先把对话框中的三个edit控件分别关联三个变量,用来接受用户输入的数值,先来看一下,一直说的对话框的样子



当点击确定按钮的时候,要首先通过UpdateData(TRUE)函数获得用户的输入,然后再把用户的输入传给view类,并且调用view的ondraw函数,

我是这样做的 ,给对话框增加一个view类的指针成员变量

public:
	CYuanView * m_pView;
然后通过类向导增加一个OnInitDialog函数(这是一个消息响应函数 WM_INITDIALOG),在这个函数中让m_pView指向当前的活动的view类

BOOL CSettingDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	//AfxMessageBox("aqwe");
	m_pView = (CYuanView*)((CMainFrame*) AfxGetMainWnd())->GetActiveView();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
这样就可以通过m_pView来调用view类中的函数了,如果直接调用OnDraw函数 ,可以看到OnDraw函数有一个CDC *pDoc的指针,暂时不知道怎么获得这个参数。。。

还是通过view类的Invalidate函数来让系统自动调用OnDraw函数.

在调用之前当然要先把刚才获得的用户输入传给view类对应的变量(m_x  , m_y ,m_r)

我们是要在点击确定的时候画圆,所以在对话框的确定函数中调用view类对应的函数

可以在view类中增加一个自定义的函数 My

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值