MFC单文档下使用非模态对话框

由于自己写的程序是自动获取桌面实时图像,所以用模态对话框导致程序出错,目前粗鄙的理解是模态对话框会让对话框所在线程暂停,当关闭对话框后才能继续操作,而非模态对话框可以不必让程序暂停。

下面记录非模态对话框的创建过程:

1 在单文档中新建一个对话框资源并生成对话框类 CRadiusDlg

2 在视图类C**view.cpp中添加对话框的头文件,并添加一个对话框类的指针变量CRadiusDlg *pModalessDlg;

3 在菜单栏添加一个用于显示对话框的菜单项,并在响应事件处,添加事件处理代码:

if(pModalessDlg==NULL)  
	{     pModalessDlg=new CRadiusDlg; //
	pModalessDlg->m_nRadius="100";                 
	pModalessDlg->Create(IDD_DIALOG1,NULL);//创建非模态对话框  
	pModalessDlg->ShowWindow(SW_SHOW);  
  } else    
	  pModalessDlg->SetActiveWindow();//若对话框已创建,只需要激活即可 

经过以上步骤,可以在点击菜单项的时候弹出模态对话框。

接下来进行功能的设置:

a  在对话框类的头文件中加入#define WM_DIALOG WM_USER+1

b  在视图类的头文件中声明消息:

afx_msg LRESULT OnDialog(WPARAM wParam,LPARAM lParam); 

在视图类的CPP文件中添加消息响应:

ON_MESSAGE(WM_DIALOG,OnDialog)

c  在对话框中分别为按钮添加消息处理函数。

当点击任一个按钮时都发送WM_DIALOG消息,响应OnDialog函数进行相应处理。

void CRadiusDlg::OnOK() 
{  // TODO: Add extra validation here 
    UpdateData(true);   
    CFrameWnd* pFrame=GetParentFrame();//获得父窗口框架  
    CView* pView=pFrame->GetActiveView();//获得当前视图   
    pView->PostMessage(WM_DIALOG,IDOK);//向神图发送消息,参数为IDOK    
    CDialog::OnOK(); 

}
void CRadiusDlg::OnCancel()  
{  // TODO: Add extra cleanup here                   //Cancel则不更新数据,直接投递消息   
    CFrameWnd* pFrame=GetParentFrame();   
    CView* pView=pFrame->GetActiveView();   
    pView->PostMessage(WM_DIALOG,IDCANCEL);  
    CDialog::OnCancel(); 
}  

d 在view.cpp中编辑消息处理函数WM_DIALOG的响应函数

LRESULT CthreadView::OnDialog(WPARAM wParam,LPARAM lParam) 
{  switch(wParam) 
{ case IDOK:    
m_para1=pModalessDlg->m_nRadius;//获得对话框编辑控件成员变量的值  
pModalessDlg->DestroyWindow();          //销毁对话框窗口 
delete pModalessDlg;                                        //删除当前的非模态对话框对象    p
pModalessDlg=NULL;                                        //设置非模态对话框不存在标志     
break; case IDCANCEL:   
pModalessDlg->DestroyWindow();     
delete pModalessDlg;   
pModalessDlg=NULL;     
//break;  case IDAPPLY:   //保留非模态对话框    
//m_para1=pModalessDlg->m_nRadius;    
//break;  }  
//Invalidate() ;          //刷新视图
return 0;
} 
}

经过以上步骤,便可以将editcontrl变量的值传给全局变量m_para1。从而实现了取出非模态对话框的控件值的操作。

posted @ 2015-05-20 19:57  千纸鹤的天  阅读(738)  评论(0编辑  收藏  举报