好文档 - 专业文书写作范文服务资料分享网站

Visual_C++MFC入门教程(免费版)

天下 分享 时间: 加入收藏 我要投稿 点赞

木有页眉

使用有模式对话框需要注意一些问题,比如说不要在一些反复出现的事件处理过程中生成有模式对话框,比如说在定时器中产生有模式对话框,因为在上一个对话框还未退出时,定时器消息又会引起下一个对话框的弹出。

同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,如果你希望返回其他的值,你需要调用

CDialog::EndDialog( int nResult );其中nResult会作为DoModal()调用的返回值。 下面的代码演示了如何使用自己的函数来退出对话框:下载例子

void CMy52_s1View::OnLButtonDown(UINT nFlags, CPoint point) {//创建对话框并得到返回值 CView::OnLButtonDown(nFlags, point); CTestDlg dlg; int iRet=dlg.DoModal(); CString szOut; szOut.Format(\ AfxMessageBox(szOut); }

//重载OnOK,OnCancel void CTestDlg::OnOK() {//什么也不做 }

void CTestDlg::OnCancel() {//什么也不做 }

//在对话框中对三个按钮消息进行映射 void CTestDlg::OnExit1() { CDialog::OnOK(); }

void CTestDlg::OnExit2() { CDialog::OnCancel(); }

void CTestDlg::OnExit3() { CDialog::EndDialog(0XFF); }

由于重载了OnOK和OnCancel所以在对话框中按下Enter键或Escape键时都不会退出,只有按下三个按钮中的其中一个才会返回。

此外在对话框被生成是会自动调用BOOL CDialog::OnInitDialog(),你如果需要在对话框显示前对其中的控件进行初始化,你需要重载这个函数,并在其中填入相关的初始化代码。利用ClassWizard可以方便的产生一些默认代码,首先打开ClassWizard,选择相应的对话框类,在右边的消息列表中选择WM_INITDIALOG并双击,如图,

56

木有页眉

ClassWizard会自动产生相关代码,代码如下:

BOOL CTestDlg::OnInitDialog() { /*先调用父类的同名函数*/ CDialog::OnInitDialog(); /*填写你的初始化代码*/ return TRUE; }

有关对对话框中控件进行初始化会在5.4 在对话框中进行消息映射中进行更详细的讲解。

5.3 创建无模式对话框

无模式对话框与有模式对话框不同的是在创建后其他窗口都可以继续接收用户输入,因此无模式对话框有些类似一个弹出窗口。创建无模式对话框需要调用

BOOL CDialog::Create( UINT nIDTemplate, CWnd* pParentWnd = NULL );之后还需要调用

BOOL CDialog::ShowWindow( SW_SHOW);进行显示,否则无模式对话框将是不可见的。相关代码如下:

void CYourView::OnOpenDlg(void) { /*假设IDD_TEST_DLG为已经定义的对话框资源的ID号*/ CTestDlg *dlg=new CTestDlg; dlg->Create(IDD_TEST_DLG,NULL); dlg->ShowWindows(SW_SHOW); /*不要调用 delete dlg;*/ }

57

木有页眉

在上面的代码中我们新生成了一个对话框对象,而且在退出函数时并没有销毁该对象。因为如果此时销毁该对象(对象被销毁时窗口同时被销毁),而此时对话框还在显示就会出现错误。那么这就提出了一个问题:什么时候销毁该对象。我时常使用的方法有两个:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

在对话框退出时销毁自己:在对话框中重载OnOK与OnCancel在函数中调用父类的同名函数,然后调用DestroyWindow()强制销毁窗口,在对话框中映射WM_DESTROY消息,在消息处理函数中调用delete this;强行删除自身对象。相关代码如下: void CTestDlg1::OnOK() { CDialog::OnOK(); DestroyWindow(); }

void CTestDlg1::OnCancel() { CDialog::OnCancel(); DestroyWindow(); }

void CTestDlg1::OnDestroy() { CDialog::OnDestroy(); AfxMessageBox(\ delete this; }

这种方法的要点是在窗口被销毁的时候,删除自身对象。所以你可以在任何时候调用DestroyWindow()以达到彻底销毁自身对象的作用。(DestroyWindow()的调用会引起OnDestroy()的调用)

通过向父亲窗口发送消息,要求其他窗口对其进行销毁:首先需要定义一个消息用于进行通知,然后在对话框中映射WM_DESTROY消息,在消息处理函数中调用消息发送函数通知其他窗口。在接收消息的窗口中利用ON_MESSAGE映射处理消息的函数,并在消息处理函数中删除对话框对象。相关代码如下:

/*更改对话框的有关文件*/

CTestDlg2::CTestDlg2(CWnd* pParent /*=NULL*/) : CDialog(CTestDlg2::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 CTestDlg2::OnOK() {

?

? ? ? ? ? ? ? ? ? ? ? ? ?

58

木有页眉

CDialog::OnOK(); ? DestroyWindow(); ? } ? ? void CTestDlg2::OnCancel() ? { ? CDialog::OnCancel(); ? DestroyWindow(); ? } ? ? void CTestDlg2::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 CMy53_s1View::OnDelDlgMsg(WPARAM wP,LPARAM lP) ? { ? delete (CTestDlg2*)wP; ? return 0; ? } ? /*创建对话框*/ ? void CMy53_s1View::OnTest2() ? { ? CTestDlg2 *dlg=new CTestDlg2(this); ? dlg->Create(IDD_TEST_DLG_2); ? dlg->ShowWindow(SW_SHOW); ? }

在这种方法中我们利用消息来进行通知,在Window系统中利用消息进行通知和传递数据的用法是很多的。

?

同样无模式对话框的另一个作用还可以用来在用户在对话框中的输入改变时可以及时的反映到其他窗口。下面的代码演示了在对话框中输入一段文字,然后将其更新到视图的显示区域中,这同样也是利用了消息进行通知和数据传递。

/*在对话框中取出数据,并向其他窗口发送消息和数据,将数据指针作为一个参数发送*/ void CTestDlg2::OnCommBtn() { char szOut[30];

59

木有页眉

GetDlgItemText(IDC_OUT,szOut,30); m_pParent->SendMessage(WM_DLG_NOTIFY,(WPARAM)szOut); }

/*在消息接收窗口中*/ /*映射消息处理函数*/ ON_MESSAGE(WM_DLG_NOTIFY,OnDlgNotifyMsg)

/*在视图中绘制出字符串 m_szOut*/ void CMy53_s1View::OnDraw(CDC* pDC) { CMy53_s1Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(0,0,\ pDC->TextOut(0,20,m_szOut); }

/*处理通知消息,保存信息并更新显示*/

LONG CMy53_s1View::OnDlgNotifyMsg(WPARAM wP,LPARAM lP) { m_szOut=(char*)wP; Invalidate(); return 0; }

此外这种用法利用消息传递数据的方法对有模式对话框和其他的窗口间通信也一样有效。下载本节例子

5.4 在对话框中进行消息映射

利用对话框的一个好处是可以利用ClassWizard对对话框中各个控件产生的消息进行映射,ClassWizrd可以列出各种控件可以使用的消息,并能自动产生代码。在本节中我们以一个例子来讲解如何在对话框中对子窗口消息进行映射同时还讲解如何对对话框中的子窗口进行初始化。

60

Visual_C++MFC入门教程(免费版)

木有页眉使用有模式对话框需要注意一些问题,比如说不要在一些反复出现的事件处理过程中生成有模式对话框,比如说在定时器中产生有模式对话框,因为在上一个对话框还未退出时,定时器消息又会引起下一个对话框的弹出。同样的在你的对话框类中为了向调用者返回不同的值可以调用CDialog::OnOK()或是CDialog::OnCancel()以返回IDOK或IDCANCEL,
推荐度:
点击下载文档文档为doc格式
5sv4n9qpyw5s23r4ajle
领取福利

微信扫码领取福利

微信扫码分享