`
weihe6666
  • 浏览: 440419 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MFC--简单实例

    博客分类:
  • MFC
 
阅读更多
MFC--简单实例


本实例可以作为MFC编程的入门实例:
基本框架:
             1.Frame
             2.Doc
             3.View
             4.App
             5.Dialog
基本思想是:建立Dialog对话框,输入自定义字符串-->Doc获得对话框的字符串-->对话框发送消息到View-->View的消息处理函数更新View显示界面。

一、建立Dialog对话框

在资源里添加Dialog对话框,并更改其Caption和ID,然后再添加相应的Tool,比如静态框和编辑框。

UI布置好之后,为Dialog添加相应的操作类,利用ClassWizard会自动添加。本例中我添加的类为MyTextShow,那么程序中会出现MyTextShow.h和MyTextShow.cpp文件,其内容如下:
// MyTextShow.h
#pragma once

// MyTextShow dialog

class MyTextShow : public CDialog
{
	DECLARE_DYNAMIC(MyTextShow)

public:
	MyTextShow(CWnd* pParent = NULL);   // standard constructor
	virtual ~MyTextShow();

// Dialog Data
	enum { IDD = IDD_SHOWTEXT };

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

	DECLARE_MESSAGE_MAP()
};

// MyTextShow.cpp
#include "MyShowText.h"
#include "MyTextShow.h"


// MyTextShow dialog

IMPLEMENT_DYNAMIC(MyTextShow, CDialog)

MyTextShow::MyTextShow(CWnd* pParent /*=NULL*/)
	: CDialog(MyTextShow::IDD, pParent)
{

}

MyTextShow::~MyTextShow()
{
}

void MyTextShow::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(MyTextShow, CDialog)
END_MESSAGE_MAP()


// MyTextShow message handlers


上面的代码只是建立一个Dialog空壳,但其中的代码值得研究,尤其是下面的宏,构成了Dialog在整个程序中的动态生成机制以及消息映射机制。
DECLARE_DYNAMIC(MyTextShow)
DECLARE_MESSAGE_MAP()
IMPLEMENT_DYNAMIC(MyTextShow, CDialog)
BEGIN_MESSAGE_MAP(MyTextShow, CDialog)
END_MESSAGE_MAP()

DoDataExchange虚函数是Dialog的数据交换函数:
virtual void DoDataExchange(CDataExchange* pDX);

二、获取Dialog对话框的信息

利用Wizard添加CString MyInput变量,并让此变量和IDC_MYEDIT(Dialog对话框中的编辑框)关联起来,程序中的代码变化如下:
//MyShowText.h
...
protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

	DECLARE_MESSAGE_MAP()
[b]public:
	CString MyInput;[/b]

//MyShowText.cpp
void MyTextShow::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	[b]DDX_Text(pDX, IDC_MYEDIT, MyInput);[/b]
}   


这时对话框中的编辑框中的内容就会自动保存到MyInput中。

三、Doc获得Dialog中保存变量的值

为了显示的保存Dialog中的值到Doc中,我在Menu中添加应用菜单,依此来触动Doc中的响应函数来保存相应的值。

利用Event Handle Wizard建立事件处理函数。

其代码修改如下:
// MyShowTextDoc.h
public:
	afx_msg void OnInput();

// MyShowTextDoc.cpp
BEGIN_MESSAGE_MAP(CMyShowTextDoc, CDocument)
	ON_COMMAND(ID_INPUT, &CMyShowTextDoc::OnInput)
END_MESSAGE_MAP()

void CMyShowTextDoc::OnInput()
{
	// TODO: Add your command handler code here
}


这样就把菜单按钮和OnInput()处理函数联系在一起。

然后再OnInput()函数里添加要处理的代码:
// MyShowTextDoc.h添加
CString MyInput;

// MyShowTextDoc.cpp
void CMyShowTextDoc::OnInput()
{
	// TODO: Add your command handler code here
	MyTextShow Dlg;

	if(Dlg.DoModal() == IDOK)
	{
		MyInput = Dlg.MyInput;
	}
}


这样就可以保存Dialog编辑框中的变量。

四、刷新CView界面,显示Doc中保存的变量值

当点击对话框的OK按钮时,发送一个消息到View类,View类中的相应的响应函数接收到消息后调用刷新函数来刷新界面。

这个消息发送是有Dialog-->CView

如何发送消息?又如何接收消息?
这里的消息是用户自定义消息,不是系统的消息。

那么用户如何定义自己的消息:
#define WM_自定义消息名 WM_USER+k 这里的k可以是任意的数,只要不和其他自定义消息相重即可,比如我自定义消息为:
#define WM_SHOWMESSAGE WM_USER+1

1.在 MyTextShow.h中自定义消息
#define WM_SHOWMESSAGE WM_USER+1

2.添加ok按钮的响应函数,并添加代码如下:
void MyTextShow::OnBnClickedOk()
{
	// TODO: Add your control notification handler code here
	OnOK();
	CMainFrame* pMF=(CMainFrame*)AfxGetApp()->m_pMainWnd;  //先通过获取当前框架指针
	CView * active = pMF->GetActiveView();//才能获取当前视类指针
	if(active != NULL)  //获取了当前视类指针才能发送消息
		active->PostMessage(WM_SHOWMESSAGE,0,0);   //使用PostMessage发送消息
}

active->PostMessage(WM_SHOWMESSAGE,0,0);  是获得CView的指针后,通过PostMessage把自定义的消息WM_SHOWMESSAGE发送出去。

3.CView接收发送的消息

在 MyShowTextView.h头文件中添加代码如下:

1)自定义消息,这个自定义消息和Dialog中的自定义消息相同
#define WM_SHOWMESSAGE WM_USER+1

2)添加相应函数
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);
注意这个响应函数的格式,afx_msg表示这是一个消息处理函数,返回值必需是LRESULT。

3)添加BEGIN_MESSAGE_MAP消息映射图
ON_MESSAGE(WM_SHOWMESSAGE, OnMyMessage)
这里是自定义的消息,必需用ON_MESSAGE

4)在响应函数里添加刷新函数
LRESULT CMyShowTextView::OnMyMessage( WPARAM wParam, LPARAM lParam )
{
	Invalidate();
	return 0;
}


五、利用OnDrow函数里显示接收的消息

其中OnDraw的代码更改如下:
void CMyShowTextView::OnDraw(CDC* pDC)
{
	CMyShowTextDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: add draw code for native data here
	CRect rect;
	GetClientRect (&rect);

	pDC->DrawText (pDoc->MyInput, &rect,
		DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}



到此整个程序设计完毕。
分享到:
评论

相关推荐

    MFC-calculator-master.rar

    MFC-calculator-master项目是一个基于MFC的简单计算器程序,它展示了如何利用MFC框架来开发用户界面友好、功能完善的桌面应用。在这个项目中,我们将深入探讨MFC的基本原理,以及如何运用它来实现一个计算器。 1. *...

    mfc-1.rar_mfc小程序实例

    ”程序,展示了如何创建一个简单的MFC应用。它会创建一个对话框,上面只有一个静态文本控件显示欢迎信息。 2. **DialogBasedApp**:对话框为基础的应用程序实例,通常用于收集用户输入。该程序可能包含一个自定义的...

    MFC-MDI程序

    MiniDraw2,根据文件名推测,可能是这个MDI程序的示例或实例,它可能是一个简单的绘图应用,允许用户在同一窗口内创建和编辑多个图形文档。通过查看和分析MiniDraw2的源代码,我们可以深入了解MFC-MDI程序的实现细节...

    MFC-简易聊天系统(socket).zip

    总结来说,“MFC-简易聊天系统(socket)”是一个结合了MFC和Socket编程技术的实例,通过它,我们可以学习到如何构建一个基本的网络通信系统,理解客户端-服务器架构,以及掌握MFC库在Windows应用程序开发中的应用。...

    MFC-class.rar_MFC

    CWinApp是MFC中的核心类,代表一个应用程序实例。它负责初始化和结束应用程序,管理文档模板和应用程序的生命周期。每个MFC程序至少有一个CWinApp派生类。 CWnd是所有窗口类的基类,包括窗口、对话框、控件等。CWnd...

    MFC实现的简单计算器实例

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来实现一个简单的计算器程序。MFC 是 Microsoft 提供的一个 C++ 类库,它为 Windows 应用程序开发提供了一种结构化的框架,使得开发者可以更...

    MFC-case.rar_mfc case

    - **基本窗口应用**:展示如何创建一个简单的MFC应用程序,包括初始化、消息循环和窗口创建。 - **对话框程序**:介绍如何设计和使用对话框,包括输入验证和控件交互。 - **文件操作**:演示如何利用MFC的文档/视图...

    MFC-简易向导程序WizardDemo

    在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC) 库来创建一个简易的向导程序,正如“MFC-简易向导程序WizardDemo”这个项目所展示的。MFC 是 Microsoft 提供的一个 C++ 类库,它封装了 Windows ...

    MFC--加法计算器

    这个"加法计算器"项目是一个基础的MFC应用实例,适合初学者学习MFC的基本原理和实践。 首先,我们需要了解MFC的基本结构。MFC 应用程序通常基于框架类(Framework Class),如CWinApp、CWnd、CFrameWnd、CDialog等...

    MFC-simple-calculator.zip_MFC计算器

    **MFC简单计算器详解** MFC(Microsoft Foundation Classes)是微软提供的一套C++类库,用于构建Windows应用程序。这个"MFC-simple-calculator.zip"压缩包包含了一个基于MFC实现的简单计算器程序,它能够执行基本的...

    mfc-ado-database.zip_MFC DataBase_mfc 数据库

    这个压缩包中的“mfc ado database.pdf”很可能详细讲解了以上概念,并提供了实例代码,帮助读者理解如何在MFC项目中集成ADO进行数据库操作。通过学习这份资料,开发者能够熟练地在MFC环境中构建数据库应用,实现...

    MFC-Control.rar_MFC vs2008_mfc control_vs2008 MFC

    压缩包内的"MFC简单控件"很可能是一个包含多个子项目的文件夹,每个子项目对应一个特定的控件或控件组合的示例。通过这些示例,你可以学习到如何创建控件对象,如何在代码中引用它们,以及如何处理各种控件事件,如...

    MFC实例-3内部处理实例

    MFC将这些底层的消息映射到C++成员函数上,使得处理消息变得简单。每个MFC窗口类(如CWnd)都有一个消息映射表,开发者可以在这里定义对特定消息的响应。例如,WM_PAINT消息用于更新窗口,而WM_COMMAND消息则与用户...

    MFC编程实例-3

    这个编程实例“MFC编程实例-3”显然是针对已经有一定C++基础,并希望深入学习MFC技术的开发者设计的。下面将详细介绍MFC的核心概念、主要组件以及如何在VC++环境中使用MFC进行开发。 MFC的全称是Microsoft ...

    MFC-ADO.zip_MFC_mfc 数据库

    然而,由于ADO的出现,MFC也提供了对ADO的支持,因为ADO提供了更高级的功能和更简单的API。 1. **MFC ADO基础**:MFC中的CDatabase类是与数据库连接的核心,它代表了数据库连接。使用CDatabase类,你可以打开、关闭...

    MFC实例-2用户界面实例

    本实例集中于用户界面的设计,涵盖了MFC中关于用户交互的各种关键元素。 首先,我们来看"005应用程序与环境.PDF",这部分主要讲述的是MFC应用程序的基础框架。MFC通过CWinApp类来代表整个应用程序,负责初始化、...

    MFC- CFile类实现下拉菜单读写实例

    在本例中,考虑到下拉菜单的数据相对简单,我们可能选择二进制模式,因为这样可以更有效地存储和恢复数据。 写入文件的过程如下: 1. 创建一个CFile对象,并调用Open()函数以写入模式打开文件。 2. 遍历下拉菜单的...

    MFC-library-Chinese-manual.rar_mfc手册

    5. **数据库支持(Database Support)**:MFC包含了一组ODBC(Open Database Connectivity)类,如CDatabase、CRecordset和CRecordView,使得数据库操作变得简单。 6. **动态链接库(DLLs)**:MFC支持创建和使用两...

    VC-MFC编程实例

    使用MFC可以快速创建功能丰富的图形用户界面,并且提供了事件驱动编程模型,使得程序响应用户交互变得更加简单。 2. **MFC基本组件** - **CWinApp**: 应用程序类,是所有MFC应用程序的基类,负责应用程序的初始化...

Global site tag (gtag.js) - Google Analytics