实验三 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(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中,对话框(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编程基础

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程序设计全文共四篇示例,供读者参考第一篇示例: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是指当用户右键点击某个控件时触发的消息。
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(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的使用有了更深入的了解,并且掌握了一些常用的开发技巧和方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。