2024年3月21日发(作者:)

计算机图形学 交互式程序设计心得

Mfc对话框学习

对于无模式对话框接收的输入信息,我们可以以向父窗口发送消息的方式进行。下面

以Vc++6.0来用实例来说明无模式对话框的使用。

1、 建立mfc appwizard(exe)工程,用AppWizard生成一个单文档应用程序,取名

dream

确定-》选择单文档-》完成即可。

2、 点ResoucreView中的Dialog,右击-》插入-》选中对话框-》新建,创建一个

如图所示的对话框资源,选中对话框,右击-》属性,将对话框命名为IDD_DREAM。并依

次给对话框资源添加控件。

关闭对话框,为对话框添加控件。编辑框、按钮、静态文本等

通过点击控件的属性来,修改其标题和ID值。

3、 启动MFC ClassWizard添加一个新类,右击对话框-建立类向导-》确定:如图

将类命名为cdtestdream,然后点击确定,即可!

4.用MFC ClassWizard为新建类CDtestdlmy的编辑控件添加对应的成员变量,如图。

双击你要添加变量的ID号,然后设置变量名和变量类型。点击确定!

4、在头文件dtestdream.h中为类Cdtestdream添加成员变量CWnd *m_pParent;

在中为构造函数时添加如下黑体部分

Cdtestdream::Cdtestdream(CWnd* pParent /*=NULL*/)

: CDialog(Cdtestdream::IDD, pParent)

{

//{{AFX_DATA_INIT(Cdtestdream)

m_x = 0;

m_y = 0;

//}}AFX_DATA_INIT

ASSERT(pParent);

m_pParent=pParent; //保存父窗口指针

}

5、用MFC ClassWizard为新建类CDtestdream的按钮控件添加对应的成员函数,

如图。

在dtestdream里面会加入相应的函数:修改此函数:

void Cdtestdream::OnMuice()

{

// TODO: Add your control notification handler code here

float FV_i;

FV_i=1; //不同按钮返回不同值,让其父窗口可以识别是哪个按钮按下

UpdateData(true); //强制数据交换,以更新控件对应的变量值

m_pParent->SendMessage(WM_DLG_CREATE,(WPARAM)FV_i);

//向父窗口发送消息WM_DLG_CREATE,并传送FV_i

}

6、在头文件dtestdream.h中添加自定义消息

#define WM_DLG_CREATE WM_USER+ 0X34

至此,对于新加进类dtestdream的处理已完成,下面处理调用Cdtestdream的

CdreamlView类。

7、在ResoucreView中的双击Menu资源IDR_MAINFRAME,添加菜单“对话框测

试”,ID为ID_EDIT_TEST,如图所示。

8、在头文件dreamView.h中为CtestdlView类添加成员变量并引入头文件

#include "dreamView.h"

Cdtestdream* testdlmy;黄色区域要符合自己的类名!

int x,y;

在CTestdlView::CTestdlView()构造函数中添加如下代码:

CTestdlView::CTestdlView()

{

// TODO: add construction code here

testdlmy=new Cdtestdream(this);

x=0;y=0;

}

9、利用类向导CdreamView类添加响应ID_EDIT_TEST的函数

CDreamView::OnEditTest。如图所示

在函数中添加如下代码:

void CDreamView::OnEditTest()

{

// TODO: Add your command handler code here

testdlmy->Create(IDD_DREAM,NULL); //创建无模式对话框,黄色区域名字要根

据工程名修改!

testdlmy->ShowWindow(SW_SHOW); //显示无模式对话框

}

到此时,程序运行就可以显示对话框了,运行结果如图所示:

但还没有添加对应动作,下面添加响应动作。

9、手动为CdreamView类添加消息响应函数

在头文件dreamView.h中添加

afx_msg void OnDlgNotifyMsg(WPARAM wP);

在的消息响应表中添加黑体部分

IMPLEMENT_DYNCREATE(CDreamView, CView)

BEGIN_MESSAGE_MAP(CDreamView, CView)

//{{AFX_MSG_MAP(CDreamView)

ON_COMMAND(ID_EDIT_TEST, OnEditTest)

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

ON_MESSAGE(WM_DLG_CREATE,OnDlgNotifyMsg)

//当接收到WM_DLG_CREATE消息时,执行函数OnDlgNotifyMsg

END_MESSAGE_MAP()

为OnDlgNotifyMsg添加如下代码:

void CDreamView::OnDlgNotifyMsg(WPARAM wP)

{

if((float)wP==1.0) //加法按钮按下

{

x=testdlmy->m_x;

y=testdlmy->m_y;

}

else if((float)wP==2.0) //减法按钮按下

{

x=testdlmy->m_x;

y=testdlmy->m_y;

}

Invalidate(true); //强制重画客户区

}

10、重载CTestdlView::OnDraw(CDC* pDC)函数,加入代码如下:

void CDreamView::OnDraw(CDC* pDC)

{

CDreamDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

pDC->TextOut(10,20,"减法:");

pDC->TextOut(10,40,"加法:");

char buff[10];

float s,d;

s=x-y;d=x+y;

sprintf(buff,"%5.2f",s);

pDC->TextOut(60,20,buff,strlen(buff));

sprintf(buff,"%5.2f",d);

pDC->TextOut(60,40,buff,strlen(buff));

}

至此,所有代码均已完成,编译连接后执行程序,运行结果如下图: