创建无模式对话框 收藏
在MFC的对话框程序中,对于初学者来说我们经常调用的是无模式对话框,因为它比较常见,而且简单,那么如何创建无模式对话框呢?
首先我们通过资源编辑器生成对话框资源,具体过程为:
menu->insert->resource->选中Dialog然后new。
然后我们通过类向导生成一个新的类。
下面就可以进行mode和modeless对话框的创建了:
模式对话框
假设我们生成的类是CTestDialog,资源ID为IDD_TEST_DIALOG
CTestDialog m_TestDialog;
m_TestDialog.DoModal();
模式对话框退出时自动销毁
无模式对话框
对于无模式对话框的创建,首先要注意它的两个Create函数:
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
BOOL Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );
其中nIDTemplate就是我们上面创建的资源ID:IDD_TEST_DIALOG
lpszTemplateName是包含一个对话框资源模板的非空字符串。
可以把ID用MAKEINTRESOURCE宏转换为资源名
我们看一下源码就清楚了:
AFXWIN_INLINE BOOL CDialog::Create(UINT nIDTemplate, CWnd* pParentWnd)
{ return Create(MAKEINTRESOURCE(nIDTemplate), pParentWnd); }
MAKEINTRESOURCE的宏是这样定义的.
#define MAKEINTRESOURCE(i) (LPTSTR) ((DWORD) ((WORD) (i)))
由此可以看出lpszTemplateName是指向内部缓冲区的一个字符串。而该字符串是被保护的
该创建无模式对话框了:
CTestDlg *dlg=new CTestDlg;
dlg->Create(IDD_TEST_DLG,NULL);
dlg->ShowWindows(SW_SHOW);
一定要注意退出时要销毁,不然下回再创建时会报错的
1.类的内部进行销毁:
在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下:
void CTestDlg::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg::OnDestroy()
{
CDialog::OnDestroy();
delete this;
}
这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)
2.类的外部进行销毁:
通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:
/*更改对话框的有关文件*/
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{/*m_pParent为一成员变量,用于保存通知窗口的指针,所以该指针不能是一个临时指针*/
ASSERT(pParent);
m_pParent=pParent;
//{{AFX_DATA_INIT(CTestDlg2)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CTestDlg::OnOK()
{
CDialog::OnOK();
DestroyWindow();
}
void CTestDlg::OnCancel()
{
CDialog::OnCancel();
DestroyWindow();
}
void CTestDlg::OnDestroy()
{
CDialog::OnDestroy();
/*向其他窗口发送消息,将自身指针作为一个参数发送*/
m_pParent->PostMessage(WM_DELETE_DLG,(WPARAM)this);
}
/*在消息接收窗口中添加消息映射*/
/*在头文件中添加函数定义*/
afx_msg LONG OnDelDlgMsg(WPARAM wP,LPARAM lP);
/*添加消息映射代码*/
ON_MESSAGE(WM_DELETE_DLG,OnDelDlgMsg)
END_MESSAGE_MAP()
/*实现消息处理函数*/
LONG CMyView::OnDelDlgMsg(WPARAM wParam,LPARAM lParam)
{
delete (CTestDlg*)wP;
return 0;
}
3.在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。
同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。
/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/
void CTestDlg::OnCommBtn()
{
char szOut[30];
GetDlgItemText(IDC_OUT,szOut,30);
m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut);
}
/*在消息接收窗口中*/
/*映射消息处理函数*/
ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)
/*在视图中绘制出字符串 m_szOut*/
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(0,0,"Display String");
pDC->TextOut(0,20,m_szOut);
}
/*处理通知消息,保存信息并更新显示*/
LONG CMyView::OnDlgNotifyMsg(WPARAM wParam,LPARAM lParam)
{
m_szOut=(char*)wP;
Invalidate();
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jia_xiaoxin/archive/2008/09/04/2878436.aspx