实验三 MFC 消息映射编程实验

合集下载

mfc 消息机制

mfc 消息机制

mfc消息机制
MFC(Microsoft Foundation Class)是微软开发的一种面向对象的C++框架,用于Windows操作系统的应用程序开发。

MFC消息机制是MFC框架的核心之一,其基本原理是在窗口、控件等对象之间传递消息,以便处理事件和交互。

具体而言,MFC消息机制包括以下几个方面:1.消息循环:MFC使用一个消息循环来接受和处理Windows操作系统发送的Windows消息,处理完消息后将处理结果反馈给Windows操作系统。

2.消息映射:MFC中的控件和窗口都有一个关联的消息映射表,用于将Windows消息映射到应用程序代码中的相应处理函数上。

当某个控件或窗口收到消息后,根据消息类型在相应的消息映射表中查找对应的消息处理函数,并调用相应的处理函数处理消息。

3.消息类型:MFC处理的Windows消息类型包括键盘和鼠标消息、定时器消息、系统负载消息、窗口大小变化消息等等,具体的消息类型可以在MFC框架的文档中查找。

4.消息处理函数:MFC中的消息处理函数是C++成员函数,定义为afx_msg 修饰的函数,Windows消息处理函数命名时需要遵循一定的命名规则,例如OnPaint()函数用于处理绘图事件。

需要注意的是,MFC消息机制是针对Windows操作系统设计的,其他操作系统可能具有不同的消息机制。

此外,MFC框架已经不是微软推荐的最先进的应用程序开发框架,已经逐渐被其他框架和技术所取代,例如.NET Framework,WPF,UWP等。

消息映射机制的剖析

消息映射机制的剖析
的机制。
完成画线的功能
方法一:用API函数
从CWnd派生出来的类中都有 一个数据成员m_hWnd保存了 跟C++类对象相关的窗口句柄
在MFC中如果要调用SDK的函数的话,要加::前缀
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
完成画线的功能
实现画笔中画线的功能,就是鼠标移动过程中画一系 列临时的直线,鼠标左键释放时画一条永久直线。 【作图模式及应用】 SetRop2可设置作图模式 作图模式R2_NOT下画的直线是通过反转屏幕当前颜色 作出的;在某一位置首次画一条直线时,它是可见的, 但是在相同的位置第二次画直线时,就变为不可见的。
完成画线的功能
实现画笔中画线的功能,就是鼠标移动过程中画一系 列临时的直线,鼠标左键释放时画一条永久直线。 在OnMouseMove中
if(m_bDraw==TRUE) { dc.SetROP2(R2_NOT); dc.MoveTo(m_ptOrigin); dc.LineTo(m_ptOld); dc.MoveTo(m_ptOrigin); dc.LineTo(point); m_ptOld=point; }
LineTo(hdc,point.x,point.y); ::ReleaseDC(m_hWnd,hdc);
完成画线的功能
方法二:用CDC类 有一个数据成员m_hDC,它保存设备描述表,也就是 与CDC这个类相关的句柄,就像m_hWnd保存窗口句柄 一样。
CDC *pDC=GetDC(); /* CWnd中的成员函数 */ pDC->MoveTo(m_ptOrigin); pDC->LineTo(point); ReleaseDC(pDC); /* CWnd类的成员函数 */

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序

MFC实现简单网络聊天程序MFC(Microsoft Foundation Classes)是微软公司提供的一个应用程序框架,用于开发Windows系统上的图形用户界面程序。

在此基础上,我们可以利用MFC来实现简单的网络聊天程序。

首先,我们需要创建一个MFC应用程序项目。

使用Visual Studio打开,选择MFC应用程序向导,选择对话框风格。

然后,设置对话框的布局,包括聊天消息显示框、消息输入框、发送按钮等控件。

接下来,我们需要使用Socket编程来实现网络通信功能。

MFC提供了CSocket类,我们可以使用它来处理数据的发送和接收。

在对话框类中添加成员变量m_socket,类型为CSocket。

在OnInitDialog函数中,我们需要创建Socket,并进行连接。

可以通过使用Create函数创建CSocket对象,并调用Connect函数来连接指定的地址和端口号。

例如,可以连接到本地主机上的一些端口,这样就可以进行本地测试。

然后,我们需要添加事件处理函数来处理发送和接收消息。

当发送按钮被点击时,可以通过调用Socket对象的Send函数将消息发送给服务器。

可以使用CString类来处理字符串数据。

当接收到消息时,可以通过调用Socket对象的Receive函数将消息接收到的缓冲区中。

为了提供实时地聊天消息显示功能,我们需要使用SetWindowText函数将数据显示到聊天消息显示框中。

当接收到消息时,可以将消息显示在聊天消息显示框中,同时可以使用UpdateData函数实时更新界面。

在程序结束时,我们需要断开连接并销毁Socket对象。

在析构函数中,可以调用Shutdown函数来关闭连接,然后销毁Socket对象。

除了基本的发送和接收消息功能,我们还可以添加一些其他的功能,比如可以使用菜单栏来选择连接和断开服务器,可以添加登录和注册功能等。

这些可以根据实际需求进行扩展。

总结起来,通过使用MFC应用程序框架和Socket编程,我们可以实现简单的网络聊天程序。

MFC对话框与对话框之间的参数传递实例

MFC对话框与对话框之间的参数传递实例

MFC对话框与对话框之间的参数传递实例在MFC中,对话框(dialog)是一种用户界面的组件,用于与用户进行交互。

对话框通常包含各种控件,如按钮、文本框、列表框等,用户可以通过这些控件输入信息或执行操作。

有时候我们需要在不同的对话框之间传递参数,以实现数据共享或在对话框之间传递信息。

下面通过一个实例来说明如何在MFC中实现对话框之间的参数传递。

以一个学生信息管理系统为例,假设我们有两个对话框,一个用于输入学生基本信息(对话框A),一个用于显示学生信息(对话框B)。

我们希望在对话框A中输入学生信息后,能够在对话框B中显示该学生的信息。

在对话框A的头文件中,定义一个结构体用于保存学生信息:```struct StudentInfoCString name;int age;CString gender;};```然后在对话框A的代码中,添加一个成员变量用于保存学生信息:```StudentInfo m_studentInfo;``````m_ = "";m_studentInfo.age = 0;m_studentInfo.gender = "";GetDlgItem(IDC_EDIT_NAME)->SetWindowText(m_);GetDlgItem(IDC_EDIT_AGE)->SetWindowText(m_studentInfo.age);GetDlgItem(IDC_EDIT_GENDER)->SetWindowText(m_studentInfo.gender);```在对话框A的代码中,添加一个按钮的响应函数OnOK(,在此函数中将学生信息传递给对话框B:```void CDialogA::OnOKGetDlgItem(IDC_EDIT_NAME)->GetWindowText(m_);GetDlgItem(IDC_EDIT_AGE)->GetWindowText(m_studentInfo.age);GetDlgItem(IDC_EDIT_GENDER)->GetWindowText(m_studentInfo.gender);CDialogB dlgB;dlgB.SetStudentInfo(m_studentInfo); // 将学生信息传递给对话框BdlgB.DoModal(; // 打开对话框BCDialog::OnOK(;```在对话框B的头文件中,添加一个成员变量用于保存学生信息:```StudentInfo m_studentInfo;```在对话框B的头文件中,添加一个函数用于接收学生信息```void CDialogA::SetStudentInfo(const StudentInfo& studentInfo) m_studentInfo = studentInfo;GetDlgItem(IDC_STATIC_NAME)->SetWindowText(m_);GetDlgItem(IDC_STATIC_AGE)->SetWindowText(m_studentInfo.age);GetDlgItem(IDC_STATIC_GENDER)->SetWindowText(m_studentInfo.gender);```通过以上代码,我们实现了在对话框A中输入学生信息后,在对话框B中显示该学生的信息。

MFC编程基础

MFC编程基础

9
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project Empty project 在共享 DLL 中使用 MFC
10
2 最简单的MFC应用程序

学习MFC程序的组织方式,生成一个工程。 创建工程要点

Win32 Project,Empty project,在共享 DLL 中使用 MFC
2 最简单的MFC应用程序
2 最简单的MFC应用程序
13
2 最简单的MFC应用程序


WinMain()函数,由MFC库后台自动提供; CWinApp类:



对基于MFC的程序重要,其对象包括启动、初始化、运行 和关闭应用程序所需的一切代码。 需要由CWinApp派生出工程自己的应用程序类 虚函数InitInstance(),需要重写,包含创建和显示应用程序 窗口的代码,由WinMain()函数调用; 该类继承的其它成员不变。


2014-5-17
26
消息映射例 class CSketcherApp : public CWinAppEx { public: 为了使用消息映射宏,还需要在类声明 的结尾用DECLARE_MESSAGE_MAP宏, CSketcherApp(); 该宏对类实现源文件中所定义的消息映 // 重写 射进行初始化。 public: virtual BOOL InitInstance(); virtual int ExitInstance(); // 实现 UINT m_nAppLook; virtual void PreLoadState(); 用于区分消息处 virtual void LoadCustomState(); 理函数和类中 virtual void SaveCustomState();

mfcwindows程序设计

mfcwindows程序设计

mfcwindows程序设计全文共四篇示例,供读者参考第一篇示例:MFC(Microsoft Foundation Class)是微软公司提供的基于Windows操作系统的C++类库,用于开发Windows应用程序。

MFC 为开发者提供了丰富的类和函数,简化了Windows应用程序的开发过程,使开发者能够快速地创建功能强大的Windows桌面应用程序。

MFC的设计目标是提供一种易于使用的框架,使开发者能够专注于应用程序的逻辑功能而不必过多关心底层的Windows API。

MFC提供了一些基本的类,如CWinApp、CWinFrameWnd、CDialog等,开发者可以继承这些类并重载其成员函数来实现自己的逻辑。

MFC的开发流程通常是这样的:首先创建一个MFC应用程序工程,然后在工程中添加需要的资源和类文件,并通过类向导生成相应的类,最后编写具体的逻辑代码。

MFC应用程序通常包括菜单、工具栏、对话框、工具栏等界面元素,开发者可以通过拖拽控件来设计界面,通过消息映射机制来处理用户操作。

MFC的优点之一是它与Visual Studio集成得很好,可以通过IDE 直观地进行开发、调试和部署。

开发者可以使用可视化编辑器来设计界面,利用自动生成的代码框架来实现业务逻辑,以及通过调试工具来调试程序。

MFC还提供了强大的文档视图架构,使得开发者可以轻松地实现文档的编辑、显示和保存。

MFC还提供了许多方便的类和函数,如文件操作类CFile、字符串处理类CString、图形绘制类CDC等,这些类和函数大大简化了开发者的工作,提高了开发效率。

MFC还提供了许多常用控件和常用对话框,如按钮、编辑框、列表框、进度条,以及文件对话框、颜色对话框、字体对话框等,使开发者可以快速地实现各种功能。

MFC也有其局限性。

随着技术的不断发展,MFC的功能和性能已经逐渐落后于现代的开发框架,如WPF、WinRT等。

MFC的界面设计相对较为传统,不够现代化,而且在跨平台开发上也存在问题。

mfc 中nm_rclick的用法

mfc 中nm_rclick的用法

mfc 中nm_rclick的用法在MFC中,nm_rclick是指当用户右键点击某个控件时触发的消息。

nm_rclick 是通过向父窗口发送NM_RCLICK消息来实现的。

下面将详细介绍nm_rclick 的用法。

首先,需要了解一些基本概念。

在MFC中,控件是通过CWnd类的派生类来表示的,处理控件的消息一般是在父窗口中进行的。

通过向父窗口发送消息的方式来实现对控件的操作。

当用户在控件上右键点击时,控件会发送一条NM_RCLICK消息给父窗口。

父窗口可以通过处理该消息来执行相应的操作。

nm_rclick消息的处理方式有两种:消息映射和自定义处理。

一、消息映射的方式:在父窗口的消息映射表中添加对NM_RCLICK消息的映射。

示例如下:ON_NOTIFY(NM_RCLICK, IDC_LIST, OnRclickList)上述代码表示当ID为IDC_LIST的列表控件接收到NM_RCLICK消息时,调用OnRclickList函数进行处理。

在OnRclickList函数中可以对右击事件进行相应的处理,例如显示一个右键菜单或执行其他操作。

void CMyDialog::OnRclickList(NMHDR* pNMHDR, LRESULT* pResult) {处理右键点击事件TODO: 添加代码*pResult = 0;}二、自定义消息处理的方式:在父窗口中重载PreTranslateMessage函数,在该函数中判断是否接收到了NM_RCLICK消息,并进行相应的处理。

示例如下:BOOL CMyDialog::PreTranslateMessage(MSG* pMsg){if (pMsg->message == WM_RBUTTONDOWN){HWND hWnd = ::GetForegroundWindow();CWnd* pWnd = CWnd::FromHandle(hWnd);if (pWnd != NULL && pWnd->GetDlgCtrlID() == IDC_LIST){处理右键点击事件TODO: 添加代码return TRUE; 拦截消息}}return CDialog::PreTranslateMessage(pMsg);}上述代码中,首先判断当前接收消息的窗口是否为打开的对话框,并且判断窗口ID是否为IDC_LIST,表示列表控件。

mfc实验报告

mfc实验报告

mfc实验报告MFC实验报告引言:MFC(Microsoft Foundation Class)是一种用于开发Windows桌面应用程序的框架,它提供了丰富的类库和工具,简化了Windows应用程序的开发过程。

本文将介绍我在进行MFC实验过程中的经验和收获。

一、实验背景MFC作为一种常用的开发框架,被广泛应用于Windows平台的软件开发中。

通过学习和实践MFC,可以更好地理解Windows应用程序的开发原理和方法。

二、实验目的本次实验的目的是通过开发一个简单的MFC应用程序,掌握MFC的基本使用方法和开发流程。

同时,通过实践了解MFC的一些重要概念和特性。

三、实验过程1. 环境搭建首先,需要安装Visual Studio,选择合适的版本并按照提示进行安装。

安装完成后,打开Visual Studio,创建一个新的MFC应用程序项目。

2. 界面设计在MFC应用程序中,界面设计是一个重要的环节。

通过使用Visual Studio提供的可视化设计工具,我们可以方便地创建和布局界面元素,如按钮、文本框等。

3. 事件处理在MFC应用程序中,用户的操作往往会触发一些事件,如点击按钮、输入文本等。

我们需要编写相应的事件处理函数,来响应这些事件并执行相应的操作。

在实验中,我学会了如何编写事件处理函数,并与界面元素进行关联。

4. 数据处理在实际应用中,数据的处理是不可或缺的一部分。

通过学习MFC,我了解到如何在应用程序中进行数据的输入、输出和处理。

MFC提供了丰富的类库和接口,可以方便地进行数据操作。

5. 调试与测试在开发过程中,调试和测试是必不可少的环节。

通过使用Visual Studio提供的调试工具,我学会了如何定位和修复程序中的错误,并进行功能测试和性能测试。

四、实验结果经过一段时间的学习和实践,我成功地开发了一个简单的MFC应用程序。

该程序可以实现基本的界面显示和数据处理功能。

通过实验,我对MFC的使用有了更深入的了解,并且掌握了一些常用的开发技巧和方法。

mfc程序实验报告

mfc程序实验报告

mfc程序实验报告篇一:MFC实验报告实验日期:2013 年05 月18 日一、实验目的1、熟悉Visual C++的基本操作。

2、基本了解基于对话框的windows 应用程序的编写过程。

3、对于Windows Socket编程建立初步概念。

二、实验要求1、应用Visual C++中MFC CSocket 类,实现网络数据传输。

2、仿照本实验步骤,制作实用的局域网一对一聊天程序。

三、实验原理设置加入连接的数目,通过更改IP 地址和端口号,成为不同的客户端,与服务器端连接,实现用户间的聊天功能。

1.程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。

当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。

2.客户端(Client)客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。

3.服务器端(Server)服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

4.用户图形界面用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用户的使用,直观清晰,简洁明了,友好美观。

四、实验内容一个最简单的点对点聊天程序客户机/服务器模式是socket点对点网络程序典型的模式,以下这个实验就是实现一个简单的点对点通信的聊天程序。

它用到的方法也是面向连接TCP连接的套接字MFC典型方式。

其工作过程是:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行信息通信。

MFC消息机制详解

MFC消息机制详解

消息映射的实现Windows消息概述Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。

这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。

消息的分类队列消息和非队列消息从消息的发送途径上看,消息分两种:队列消息和非队列消息。

队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。

这里,对消息队列阐述如下:Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。

鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。

Windows 每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。

线程消息队列接收送给该线程所创建窗口的消息。

线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。

除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。

这些队列消息以外的绝大多数消息是非队列消息。

系统消息和应用程序消息从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。

系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。

消息结构和消息处理消息的结构为了从消息队列获取消息信息,需要使用MSG结构。

基于mfc的实验报告

基于mfc的实验报告

基于mfc的实验报告摘要本实验旨在通过使用MFC(Microsoft Foundation Classes)开发框架,实现一个简单的图形化界面程序。

通过这次实验,我深入理解了MFC框架的基本原理和开发流程,并成功完成了一个简单的图形化界面程序。

1. 引言MFC是微软公司开发的一套C++类库,用于创建Windows平台上的应用程序。

它建立在Windows API之上,简化了Windows操作系统的编程方式。

MFC 提供了一系列的类和函数,包括窗口(Window)、对话框(Dialog)、消息映射(Message Map)等,极大地简化了Windows应用程序的开发过程。

2. 实验目的本实验主要目的是熟悉MFC框架的基本原理和开发流程,实现一个简单的图形化界面程序。

通过本实验,能够掌握MFC框架中的窗口创建、消息处理、界面设计等基本概念和操作。

3. 实验过程3.1 环境配置首先,需要在计算机上安装Visual Studio和MFC组件。

打开Visual Studio,创建一个新的MFC应用程序项目,并选择对话框类型作为项目的基础结构。

3.2 窗口创建在MFC应用程序中,窗口是最基本的界面单位。

通过菜单选择“添加类”的方式,创建一个新的对话框类,并继承自CDialog类。

在新建的对话框类中,可以定义与界面相关的成员变量和控件。

3.3 控件添加在对话框设计界面中,可以通过拖拽和调整控件的方式,向对话框中添加各种控件,如按钮、文本框、列表框等。

每个控件都有自己的属性和事件响应函数。

3.4 消息映射消息映射是MFC框架的核心概念之一。

通过消息映射,可以将用户的操作(如点击按钮)与特定的函数关联起来。

在对话框类中,可以通过DECLARE_MESSAGE_MAP和BEGIN_MESSAGE_MAP宏定义来实现消息映射关系的建立。

3.5 编译和运行完成界面设计和消息映射后,即可对程序进行编译和运行。

在编译过程中,MFC 会自动将资源文件编译成可执行的文件。

【初学VC讲稿】第2篇:MFC消息映射

【初学VC讲稿】第2篇:MFC消息映射

CMyApp theApp; //应用程序对象
好了,请大家按照上篇的方法运行一下修改后的程序,是不是已经响应了鼠标左键
按下的消息。
ON_WM_PAINT()//响应WM_PAINT消息
END_MESSAGE_MAP()
【3】消息响应函数[afx_msg void OnPaint();]:即处理消息的函数。
afx_msg只是将函数标记为消息响应函数,你把它去掉程序也可以正常
运行,只不过是习惯的标记罢了!
【4】当MFC程序要处理消息时,你要告诉MFC你要处理什么消息以及在
};
//消息映射表
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//响应WM_PAINT消息,将会调用OnPaint()
ON_WM_LBUTTONDOWN() //响应鼠标左键按下消息,ags, CPoint point)
}
这些工作你也可以手动完成(如第1篇看到的,只不过在那一篇中我们把这些
东西都放在了MyApp.cpp文件中,应该把声名放在".h"文件中,把实现放在
".CPP"文件中,VC中就是这样管理每一个类的)!
【5】MFC程序中消息的种类:
(A)窗口消息(Window Message):
这种消息一般与窗口的内部运作有关,如创建窗口、绘制窗口和销毁窗口等。
响应函数:
//MyApp.cpp
#include <afxwin.h>//必要的包含文件
//主窗口类
class CMyFrameWnd : public CFrameWnd

实验报告

实验报告

实验报告实验一vc6.0集成开发环境1、在VC++中,工程与各种源文件之间是什么关系?答:在VC++中,工程与各种源文件之间是包含与被包含的关系,即若要对一个或多个源文件进行编译和运行,必须将其插入到相应的工程中去。

2、一个VC++工程下会有3个文件夹,这3个文件夹分别是什么?以.cpp为后缀的文件会添加到哪个文件夹中?以.h为后缀文件会添加到哪个文件夹中?答:这3个文件夹分别是Source Files、Header Files和Resource Files,以.cpp 为后缀的文件添加到Source Files 中,为后缀文件会添加到以.h Files Header中。

3、以win32 console application工程为例,简述工程的建立,文件的添加,工程的编译和链接及工程的执行过程。

答:(1)创建VC6工程①点击“文件”菜单,选择“新建”菜单项,弹出“新建…”窗口;②切换“新建”窗口选项卡为“工程”选择,“Win32 Console Application”;③在“位置:”下的文本框内填入工程保存的文件夹位置,也可以点其右侧的“…”按钮来定位文件夹;④在“工程名称:”下的文本框内填入工程的名称,例如Prj1。

其它设置不用更改;⑤点“确定”后,出现“Win32 Console Application”设置向导窗口,选“一个空工程”,点“完成”,再点“确定”后,工程创建结束。

这时,一个空的Win32 Console Application工程就创建好了。

2)新建C 或C++源文件并插入工程的方法①点击“文件”菜单,选择菜单项“新建…”,弹出“新建”窗口;②选择“新建”窗口“文件”选项卡,选择“C++ Source File”;③在“文件”下的文本框内填入带后缀的源文件名,后缀为.c 或是.cpp,分别代表C源文件和C++源文件,例如填入main.c;④保证“添加到工程”前的复选框被选中,且其下的下拉列表框所选的工程为刚刚创建的空工程的名字;⑤点“确定”后,一个空的源文件main.cpp 就被插入工程Prj1 了。

MFC网络编程

MFC网络编程

2.MFC框架对于六个网络事件的处理 当上述的网络事件发生时,MFC框架作何处理 呢?按照Windows的消息驱动机制,MFC框 架应当把消息发送给相应的套接字对象,并调 用作为该对象成员函数的事件处理函数。事件 与处理函数是一一映射的。
在afxSock.h文件中的CAsyncSocket类的声明中, 定义了与这六个网络事件对应的事件处理函数。
关闭套接字 1.使用CAsyncSocket类的Close成员函 数 格式:virtual void Close( );
2.使用CAsyncSocket类的ShutDown() 成员函数 使用CAsyncSocket类的ShutDown()成员 函数,可以选择关闭套接字的方式。将套接字 置为不能发送数据,或不能接收数据,或二者 均不能的状态。
CSocket类,从CAsyncSocket类派生,是对 Windows Sockets API 的 高 级 封 装 。 CSocket类继承了CAsyncSocket类的许多成 员函数,用法一致。CSocket类的高级表现在 三个方面: (1)CSocket结合archive类来使用套接字。
(2)CSocket管理了通信的许多方面,如字 节顺序问题和字符串转换问题。 (3)CSocket类为Windows消息的后台处理 提供了阻塞的工作模式。
发送与接收流式数据 当服务器和客户机建立了连接以后,就可以 在服务器端的连接套接字对象和客户端的套 接字对象之间传输数据了。对于流式套接字 对象,使用CAsyncSocket类的Send成员函 数向流式套接字发送数据,使用Receive成 员函数从流式套接字接收数据。
1.用Send成员函数发送数据
virtual void OnConnect(int 对应 FD_CONNECT事件

MFC编程基础教程

MFC编程基础教程

MFC编程基础教程
MFC(Microsoft Foundation Class)是一套用于Windows平台下GUI应用程序开发的C++类库。

它是微软公司为了简化Windows应用程序开发而开发的,提供了许多可以直接调用的类和函数,可以方便地进行窗口管理、控件操作、消息处理等操作。

首先,窗口的创建是MFC编程的基础。

在MFC中,窗口的创建是通过派生CWnd类来实现的。

通过调用CWnd类的Create函数,可以创建一个窗口,并指定窗口的样式、位置、大小等信息。

另外,MFC还提供了一个CFrameWnd类,用于创建带有菜单和工具栏的主窗口。

消息处理是MFC编程中的关键环节。

在MFC中,每个窗口都有一个消息映射表,用于将Windows消息与相应的处理函数关联起来。

当窗口接收到消息时,MFC会自动调用相应的处理函数进行消息处理。

通过消息映射表,可以处理按钮点击、窗口关闭等各种消息。

菜单在MFC中也是常用的界面元素之一、菜单可以包含各种功能选项和子菜单。

MFC提供了一个CMenu类,用于创建和操作菜单。

通过CMenu 类的成员函数,可以实现菜单的创建、添加、删除和响应菜单项的点击等操作。

除了上述内容,MFC还包括了其他一些重要的特性,例如文件操作、多文档界面、打印和打印预览等。

这些特性使得MFC成为一个功能强大且灵活易用的开发框架。

综上所述,MFC编程基础教程主要包括窗口创建、控件操作、消息处理、对话框和菜单等内容。

通过学习这些基础知识,可以帮助初学者快速上手MFC编程,实现各种Windows平台下的GUI应用程序开发。

MFC3

MFC3

2.分析对话框和文档/视图结构运行机制及心得体会?对话框工作机制:在程序中运行模态对话框有两个步骤:在堆栈上以变量的形式构建一个对话框对象。

调用CDialog::DoModal ( )。

DoModal负责对模态话框的创建和撤销。

在创建对话框时,DoModal 的任务包括载入对话框模板资源、调用OnInitDialog初始化对话框和将对话框显示在屏幕上。

完成对话框的创建后,DoModal启动一个消息循环,以响应用户的输入。

由于该消息循环截获了几乎所有的输入消息,使主消息循环收不到对对话框的输入,致使用户只能与模态对话框进行交互,而其它用户界面对象收不到输入信息。

若用户在对话框内点击了ID为IDOK的按钮(通常该按钮的标题是“确定”或“OK”),或按了回车键,则CDialog::OnOK将被调用。

OnOK首先调用UpdateData(TRUE)将数据从控件传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框。

关闭对话框后,DoModal会返回值IDOK。

若用户点击了ID为IDCANCEL的按钮(通常其标题为“取消”或“Cancel”),或按了ESC键,则会导致CDialog::OnCancel的调用。

该函数只调用CDialog::EndDialog关闭对话框。

关闭对话框后,DoModal会返回值IDCANCEL。

程序根据DoModal的返回值是IDOK还是IDCANCEL就可以判断出用户是确定还是取消了对对话框的操作。

2.文档/视图运行机制每个应用程序类(CwinApp的派生类)都保留并维护了一份所有文档模板的指针列表,这是一个链表结构。

应用程序为所要支持的每个文档类型动态分配一个CMultiDocTemplate 对象,CmultiDocTemplate(UINT nIDResource,CruntimeClass * pDocClass,CruntimeClass * pFrameClass,CruntimeClass * pViewClass );并在应用程序类的CWinApp::InitInstance成员函数中将每个CMultiDocTemplate对象传递给CWinApp::AddDocTemplate。

MFC应用程序编写实例—完整版(原创)

MFC应用程序编写实例—完整版(原创)

MFC应⽤程序编写实例—完整版(原创)前段时间,将近花了⼀周⾄两周上班和上班后的闲余时间,做了⼀个⽤于调试和测试⼯作项⽬的应⽤软件,下⾯将实现软件的重要步骤及主要功能讲解⼀遍,⽅便⽇后查阅。

程序开始后,提⽰登录框,输⼊⽤户名,密码后,登录进去主窗体,效果图如下:下⾯将主要实现的功能函数要点进⾏描述,具体实现如下:⼀、设置主窗体⼤⼩1、进⼊⼯程窗体初始化函数,OnInitDialog()中,在CDialog::OnInitDialog() 下⾯添加函数语句如下:SetWindowPos(NULL,0,0,600,400,SWP_NOMOVE); ////设置主窗体⼤⼩,长为600,⾼为400⼆、为主窗体添加背景图⽚:1、⾸先,在⼯程头⽂件中,声明画刷变量如:CBrush m_brBk;2、在⼯程OnInitDialog()中,添加如下代码:CBitmap bmp1;bmp1.LoadBitmap(IDB_BITMAP1);m_brBk.CreatePatternBrush(&bmp1);3、添加消息函数OnCtlColor,代码如下所⽰:HBRUSH CDebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);// if (pWnd == this)//// {//// return m_brBk;//// }return(HBRUSH) m_brBk;}三、调⽤模态对话框和⾮模态对话框(以菜单⼊⼝为例)如菜单所属的主窗体类名为CDebugDlg,调⽤对话框的类名为CPing实现调⽤⾮模态对话框⽅法:选择调⽤菜单⼊⼝后,点击添加消息处理函数,在函数体内添中如下代码:CPing *dlg = new CPing();dlg->Create(IDD_DIALOG_PING); //创建⼀个⾮模态对话框dlg->ShowWindow(SW_SHOW); //显⽰⾮模态对话框 实现调⽤模态对话框⽅法:Cping dlg;dlg.DoModal();四、调⽤外部应⽤程序⽅法:1、调⽤外部应⽤程序可采⽤WinExec函数例如,调⽤⼀个Tcpview.exe外部程序,可在消息处理函数中添加如下代码:WinExec(".\\dll\\TCPview\\Tcpview.exe",SW_SHOW); // 其中.代表当前路径,此时需要⽤到\\来区分路径。

消息映射宏_C++语言程序设计_[共2页]

消息映射宏_C++语言程序设计_[共2页]

24811.4.7 消息映射实现消息映射的具体实现是通过初始化声明中定义的静态成员函数_messageEntries和messageMap,实现所声明的静态或虚拟函数GetMessageMap、_GetBaseMessageMap的。

这样,在进入WinMain函数之前,每个可以响应消息的MFC类都生成了一个消息映射表,程序运行时通过查询该表判断是否需要响应某条消息。

1.消息映射入口表(消息映射数组)初始化消息映射数组的元素是消息映射条目,条目的格式符合结构AFX_MESSAGE_ENTRY的描述。

因为,要初始化消息映射数组,就必须使用符合该格式的数据来填充:如果指定当前类处理某个消息,则把和该消息有关的信息和消息处理函数的地址及原型组合成为一个消息映射条目,并加入到消息映射数组中。

MFC根据消息的不同和消息处理方式的不同,把消息映射划分成若干类别,每一类的消息映射至少有一个共性:消息处理函数的原型相同。

对每一类消息映射,MFC定义了一个宏来简化初始化消息数组的工作。

例如,前文提到的ON_COMMAND宏用来映射命令消息,只要指定命令ID和消息处理函数即可,对这类命令消息映射条目,其他四个属性都是固定的。

ON_COMMAND 宏的初始化内容如下。

{WM_COMMAND,CN_COMMAND,(WORD)ID_APP_ABOUT,(WORD)ID_APP_ABOUT,AfxSig_vv,(AFX_PMSG)OnAppAbout}这个消息映射条目的含义是:消息ID是ID_APP_ABOUT,OnAppAbout被转换成AFX_PMSG 指针类型,AfxSig_vv是MFC预定义的枚举变量,用来标识OnAppAbout的函数类型为参数空(V oid)、返回空(V oid)。

在消息映射数组的最后,是宏END_MESSAGE_MAP的内容,它标识消息处理类的消息映射条目的终止。

2.messageMap的初始化messageMap的类型是AFX_MESSMAP。

Windows实践报告

Windows实践报告

Windows 程序开发实践报告2010302580072 软工三班张弘毅一、第一次实践1、任务描述及实践目的用Visual C++开发一个简单的WinAPI程序:实现菜单功能,点击某两个菜单可在主窗口中显示或清除文字(文字内容不做要求),点击某个菜单可弹出一个自定义的对话框(对话框中的元素不做要求)。

该实践的目的并不在于学会如何利用Windows API开发窗口程序,而是要求同学们了解并掌握如下事实:任何框架开发环境归根结底都是对Windows API函数的封装与调用。

2、对windows消息循环机制的理解所谓消息循环机制,在我理解看来,就是这样的:在程序运行过程中,用户通过鼠标,键盘等方式产生了一个对Windows 程序的请求,然后这个请求被I/O 设备发现,产生了中断。

CPU发现中断后,以适当的方式处理中断,产生了windows中的消息,并将其放到相应windows程序的消息队列,然后该程序在运行时取出改消息,根据消息执行相应的操作。

我认为这与DOS的顺序执行相比,是一个很大的进步,同时也是发展对用户友好的操作系统,使计算机可以让普通人使用的先决条件。

利用消息处理机制,是微软对操作系统的一大贡献,值得我们学习。

3、学到的知识通过本次实践,学会了很多东西。

首先,对windows的消息循环机制有了一个初步的了解,这在windows 程序设计中,是必不可少的先决条件。

其次,通过这次实践,也明白了API在windows编程中的重要意义,或者,套用老师在课件中的话:任何框架开发环境归根结底都是对Windows API函数的封装与调用。

当然,在领悟这句话的同时,通过实践,也对如何使用API,怎样了解一个API的功能,用法等有了一定的了解。

第三点,最为实际的是:通过本次实践,学会了如何创建对话框,菜单。

并且对对话框,这个windows编程中必不可少的基础元素的设计和运用有了一个初步的了解和感性的认识。

这都为以后的实践,甚至是以后的windows 编程打下了一个基础。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三MFC 消息映射编程实验
一、实验目的
(1) 熟悉Visual Studio 开发环境;
(2) 掌握消息映射机制的基本原理和手工添加消息映射的方法;
(3) 熟练掌握在Visual Studio 开发环境调试程序的方法。

二、实验内容
设计MFC 应用程序,手工添加消息映射,实现下面的功能:
(1) 按下CTRL 键,拖动鼠标绘制矩形;
(2) 按下SHIFT 键,拖动鼠标绘制椭圆。

三、实验结果
(1)总结手工添加消息映射的基本步骤;
1、在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间添加消息映射宏;
BEGIN_MESSAGE_MAP(CDemoView, CView)
ON_MESSAGE(WM_KEYDOWN, OnKeyDown)
ON_COMMAND(ID_OPER_TEST, OnOperTest)
END_MESSAGE_MAP( )
2 、在类声明中声明成员函数;
3、在类的实现部分实现成员函数。

列出鼠标绘图功能的实现代码;
(2)列出鼠标绘图功能的实现代码;
头文件:
#include "afxwin.h"
class CDemoWnd:public CFrameWnd
{
public:
CDemoWnd();
~CDemoWnd();
public:
LRESULT OnPaint(WPARAM wParam,LPARAM lParam);
LRESULT OnLButtonDown(WPARAM wParam,LPARAM lParam);
LRESULT OnMouseMove(WPARAM wParam,LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
int m_nX0;
int m_nY0;
int m_nX1;
int m_nY1;
};
class CDemoApp:public CWinApp
{
public:
BOOL InitInstance();
};
CDemoApp theApp;
源文件:
#include "Demo.h"
// 构造函数
CDemoWnd::CDemoWnd()
{
m_nX0 = 0;
m_nY0 = 0;
m_nX1 = 0;
m_nY1 = 0;
}
// 析构函数
CDemoWnd::~CDemoWnd()
{
}
BEGIN_MESSAGE_MAP(CDemoWnd,CFrameWnd)
ON_MESSAGE(WM_PAINT,OnPaint)
ON_MESSAGE(WM_LBUTTONDOWN,OnLButtonDown)
ON_MESSAGE(WM_MOUSEMOVE,OnMouseMove)
END_MESSAGE_MAP()
LRESULT CDemoWnd::OnPaint(WPARAM wParam,LPARAM lParam)
{
return 0;
}
LRESULT CDemoWnd::OnLButtonDown(WPARAM wParam,LPARAM lParam) {
m_nX0 = LOWORD(lParam);
m_nY0 = HIWORD(lParam);
return 0;
}
LRESULT CDemoWnd::OnMouseMove(WPARAM wParam,LPARAM lParam) {
CClientDC dc(this);
// 1 擦除原有图形
dc.SelectStockObject(WHITE_PEN);
if(wParam & MK_CONTROL && wParam & MK_LBUTTON)
{
dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1);
}
if(wParam & MK_SHIFT && wParam & MK_LBUTTON)
{
dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1);
}
// 2 绘制新的图形
m_nX1 = LOWORD(lParam);
m_nY1 = HIWORD(lParam);
dc.SelectStockObject(BLACK_PEN);
if(wParam & MK_CONTROL && wParam & MK_LBUTTON)
{
dc.Rectangle(m_nX0,m_nY0,m_nX1,m_nY1);
}
if(wParam & MK_SHIFT && wParam & MK_LBUTTON)
{
dc.Ellipse(m_nX0,m_nY0,m_nX1,m_nY1);
}
return 0;
}
BOOL CDemoApp::InitInstance()
{
CDemoWnd *pMainWnd = new CDemoWnd();
pMainWnd->Create(NULL,_T("消息映射实验程序"));
pMainWnd->ShowWindow(m_nCmdShow);
pMainWnd->UpdateWindow();
m_pMainWnd = pMainWnd;
return TRUE;
}
(3)总结实验的心得体会,实验中遇到的困难以及解决的方法等。

这次实验主要练习了MFC的消息映射的编程,包括消息映射宏和在MFC中手工添加消息映射的步骤,更加深刻地学习了消息映射的概念和作用。

实验指导书中的MFC框架代码中存在一个错误class CDemoWnd: public CDemoWnd,需要将第二个CDemoWnd改为CFramewnd。

相关文档
最新文档