C++ MFC原理与方法new
mfc 原子操作

mfc 原子操作摘要:一、MFC 原子操作简介1.MFC 原子操作的定义2.MFC 原子操作的重要性二、MFC 原子操作的实现1.原子操作的基本原理2.MFC 原子操作的实现方法三、MFC 原子操作的应用场景1.多线程编程2.文件操作3.数据库操作四、MFC 原子操作的优缺点分析1.优点a.避免竞态条件b.提高程序性能2.缺点a.使用复杂b.代码可读性降低正文:MFC 原子操作是Microsoft Foundation Class(MFC)库中提供的一种用于处理多线程并发问题的编程技巧。
它通过使用C++的“std::atomic”库,实现对共享资源的原子访问,以避免多线程程序中的竞态条件问题。
在MFC 中,原子操作主要用于保证某些数据在多个线程同时访问时的一致性。
MFC 原子操作的实现依赖于C++11 中的“std::atomic”库。
std::atomic 提供了原子操作的基本功能,如原子加、原子减等。
MFC 通过对std::atomic 的封装,使得开发者能够更方便地在MFC 程序中使用原子操作。
MFC 原子操作在多线程编程、文件操作和数据库操作等领域有着广泛的应用。
在多线程编程中,使用原子操作可以确保共享数据的一致性,避免竞态条件问题。
在文件操作和数据库操作中,原子操作可以确保数据在读写过程中的完整性,避免因为多个线程同时操作导致的错误。
虽然MFC 原子操作能够有效解决多线程并发问题,但是它也存在一些缺点。
首先,原子操作的使用相对复杂,需要开发者具备一定的C++11 编程知识。
其次,原子操作可能会降低代码的可读性,因为开发者需要使用原子操作来替代原有的简单操作。
总之,MFC 原子操作是一种在多线程程序中处理共享资源访问的有效方法。
它通过保证共享资源的原子性访问,避免了竞态条件问题,提高了程序的性能。
MFC原理结构说明

MFC原理结构说明MFC(Microsoft Foundation Classes)是一种在Windows平台上开发图形用户界面(GUI)的框架。
MFC提供了一组类、函数和宏,用于简化Windows应用程序开发过程。
本文将对MFC的原理和结构进行详细说明。
一、MFC的原理1. 类与对象:MFC使用面向对象的编程模型,所有的窗口、控件、消息处理程序等都是通过类来定义和创建的。
每个MFC应用程序都包含一个CWinApp类的对象,这个对象是整个应用程序的入口点。
2. 消息映射机制:在MFC中,消息是Windows事件的一种表示。
MFC使用消息映射机制来处理这些消息。
消息映射机制是程序员在类中定义的一种技术,它将特定消息与对应的消息处理函数关联起来。
当收到消息时,MFC会自动调用相应的消息处理函数进行处理。
3. 消息与事件:在MFC中,消息是Windows事件的抽象表示,而事件是用户界面中的交互行为。
MFC提供了一系列预定义的消息类型,如鼠标点击、按键、窗口关闭等,程序员只需要在类中覆盖对应的消息处理函数,就可以处理这些消息。
4. 窗口类和控件类:在MFC中,窗口类和控件类是界面元素的基础。
MFC提供了一组窗口类(如CWnd、CFrameWnd)和控件类(如CButton、CEdit),程序员可以通过继承这些类来创建自定义的窗口和控件。
5. 文档视图模型:MFC中引入了文档视图模型(Document-View Model)的概念,用于实现应用程序的数据和界面的分离。
文档类(CDocument)管理应用程序的数据,视图类(CView)用于显示数据,而框架窗口类(CFrameWnd)则用于协调文档和视图之间的交互。
二、MFC的结构1. 应用程序类(CWinApp):应用程序类是MFC应用程序的入口点,它派生自CWinApp类。
应用程序类负责初始化应用程序的环境,包括注册窗口类、创建主窗口、加载并运行消息循环等。
VC++MFC基础教程

dcb.Parity=NOPARITY; //无奇偶校验位 dcb.StopBits=TWOSTOPBITS; //两个停止位 SetCommState(hCom,&dcb);
m_cComm.put_OutBufferSize(512); //设置输出缓冲区 m_cComm.put_Settings(TEXT("9600,n,8,1"));//波特率,无校验,个数
据位,个停止位
if(!m_cComm.get_PortOpen())
{
m_cComm.put_PortOpen(TRUE); //打开串口
B)修改控件属性
修改上面的示例编辑框属性: ID——IDC_EDIT_RECV;
Multiline——True; Want Return——True; Vertical Scroll——True; Auto VScroll——True;
修改下面的示例编辑框属性: ID——IDC_EDIT_SEND; Multiline——True; Vertical Scroll——True;
1.3、API 串口编程
按照步骤一新建 Serial 工程,这里不赘述了。
A)添加 API 串口初始化代码
1、在 SerialDlg.cpp 文件中添加全局变量:
HANDLE hCom; //全局变量,串口句柄 // CSerialDlg 对话框
2、在 SerialDlg.cpp 文件中的 OnInitDialog()函数添加如下代码:
AfxMessageBox("写串口失败!"); }
mfc使用手册

mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。
以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。
通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。
2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。
安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。
3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。
选择“File”菜单中的“New”选项,然后选择“Project”。
在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。
4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。
以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。
CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。
CDocument:文档类,用于管理应用程序中的文档数据。
CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。
5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。
每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。
通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。
6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。
您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。
MFC的简介

//hello.cpp
#include <afxwin.h>
//说明应用程序类
class CHelloApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
//建立应用程序类的实例
CHelloApp HelloApp;
//说明主窗口类
class CHelloWindow : public CFrameWnd
幸运的是,你可以在比较高级的方法来进行编程,这就是使用MFC。在MFC中,几乎所有的低级的细节处理都为你代办了。如果你把某一用户界面对象放在屏幕上,你只需要两行代码来建立它。如果用户单击一个按钮,则按钮自己会完成一切必要的操作,从更新屏幕上的外观到调用你程序中的预处理函数。该函数包含有对该按钮作出相应操作的代码。MFC为你处理所有的细节:你建立按钮并告知它特定的处理函数,则当它被按下时,它就会调用相应的函数。第四部分介绍了怎样使用消息映射来处理事件。
我们将一段一段地来研究提到的MFC应用程序,以便能理解它的结构和概念框架。我们将先介绍MFC,然后在介绍如何用MFC来建立应用程序。
MFC简介
MFC是一个很大的、扩展了的C++类层次结构,它能使开发Windows应用程序变得更加容易。MFC是在整个Windows家族中都是兼容的,也就是说,无论是Windows3.x、Windows95还是Windows NT,所使用的MFC是兼容的。每当新的Windows版本出现时,MFC也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC也回得到扩展,添加新的特性、变得更加容易建立应用程序。
C++_MFC快速超简单入门.

C++ MFC快速超简单入门学习注意:红色字体为重要的信息,必须理解并记住。
在学习MFC之前,你必须对C++的“类和对象有一定的认识和理解,因为MFC就是C++完全的面向对象设计,它里面封装了好多类,我们只要调用就OK,就像C语言调用库函数一样,直接使用,这就是C++第一特性:封装性,第二性就是继承与派生,这个在MFC中体现得淋淋至间(字打错了)。
如果不懂,我再来解释一下,例:有一个商品类,class GOODS 商品属性有名字,价格它可作为一个基类,我可以派上出苹果类,class Apple :public GOODS . 苹果属性出了继承了商品的属性名字,价格之外,还可派生出,颜色,等属性,继承与派生就是一个是另一个的子集,但是这个子集不仅包括父集的特征,还具有一些新的特性,懂了吧,这样。
MFC其中重要的类是:CDialog 对话框类,CEdit,(编辑框类)CButton,(按钮类)CRadio(单选钮类),这些都是作为基类,由我们自己定义的类去派生它们。
好了,现在先了解一下什么是MFC吧,请看当前目录下的MFC入门知识的幻灯片1—20张,或大概的浏览一下当前目录下的其它连个word文件,后面的幻灯片我觉得没必要看了,因为是快速吗,节约时间,(首先看不懂没关系,)但但看完之后,必须掌握如下知识:1.MFC是作什么用的?与以前我们写的C,C++语言有什么不同。
以及它的一些优点,不同,以前的是控制台的界面不好看,不友好,操作不方便,黑框框的一片。
MFC反之。
优点:可用极少的代码实现强大的功能,2.关于MFC的一些术语,概念啊3.你要知道MFC的对话框是由控件组成的,具有哪些控件(例按钮:Button, 单选钮:radio,Edit)例:要知道MFC的编程的原则,也就是宗旨理念吧,“消息映射,事件驱动“,这句话要记住并理解,很重要,真的。
那到底是什么意思呢?现实举例:一个人具备一种“感知“的能力,(也可称消息吧),当用火接近这个人时(发生的事件),就会(驱动)这个人做出反应,远离”火“,用MFC举例:一个按钮有什么消息啊,我可以单击它,所以它具备单击的消息:第一个就是左键单击的消息,第二个就是双击的消息,见名思议就OK了。
mfc原理和消息映射

MFC思想win32程序中创建一个窗口的过程:设计窗口阶段(由WNDCLASS结构描述部分)、窗口的注册及创建显示过程、消息循环部分。
win32用标准的C语言代码实现,是面向过程的。
在MFC中采用了面向对象的思想,即用面向对象的C++思想对以上代码进行了封装,也就是说将一些对窗口进行操作的API的函数封装到了一个类中,以下我将用简短的代码来演示一下这个过程:class CWnd{public:HWND m_hWnd;BOOL Create();BOOL ShowWindow();};BOOL CWnd::Create(){WNDCLASS wndClass;wndClass.style=CS_HREDRAW;wndClass.lpfnWndProc=(WNDPROC)DefWndProc;wndClass.cbClsExtra=0;wndClass.cbWndExtra=0;wndClass.hInstance=hInstance;wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));LOGBRUSH lgbr;lgbr.lbStyle=BS_SOLID;lgbr.lbColor=RGB(192,192,0);lgbr.lbHatch=0;wndClass.hbrBackground=CreateBrushIndirect(&lgbr);wndClass.lpszMenuName=NULL;wndClass.lpszClassName="mycls";RegisterClass(&wndClass);HWND hWnd;m_hWnd=CreateWindow("mycls","窗口标题",WS_OVERLAPPEDWINDOW,0,NULL,NULL,hInstance,NULL);if(m_hWnd!=NULL)return true;elsereturn false;}BOOL CWnd::ShowWindow(){return ShowWindow(hWnd,nCmdShow);}为了保证代码和以前的执行方式一样,Winmain()函数可以写成如下形式:int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){CMyWnd m_wnd;m_wnd.Create();m_wnd.ShowWindow();MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}此时,如果再写一个新的类来对剩下的代码进行封装,代码如下:class CWinApp{public:CWnd * m_pMainWnd;BOOL InitInstance();BOOL Run();CWinApp ();};CWinApp:: CWinApp (){if(InitInstance())Run();}BOOL CWinApp::InitInstance(){CWnd m_wnd;m_pMainWnd=&m_wnd;m_pMainWnd->Create();m_pMainWnd->ShowWindow();return true;}BOOL CWinApp::Run(){MSG msg;while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return true;}CWinApp theApp;int PASCAL WinMain() {}Windows消息的产生:1用户按键或者鼠标操作可以产生消息,如WM_KEYDOWN,WM_LBUTTONDOWN等;2系统可以自己产生消息,如,创建窗口的时候会产生WM_CREATE,WM_TIMER等;3应用程序间可以定义自己的消息,在应用程序间进行消息通讯;Windows消息的分类:1窗口消息(Windows Message):通常跟窗口的移动、创建,关闭等操作有关。
mfc工作原理

mfc工作原理MFC(Microsoft Foundation Classes)是微软公司开发的一套用于Windows操作系统的应用程序框架,它在C++语言的基础上封装了一些常用的图形用户界面(GUI)功能,简化了Windows应用程序的开发过程。
本文将围绕MFC的工作原理展开阐述。
MFC的工作原理主要包括以下几个方面:1. 类库结构:MFC是一个面向对象的类库,它由一系列C++类组成。
这些类封装了Windows API的功能,提供了一种更加便捷的方式来创建和管理Windows应用程序。
MFC的类库结构包含了一些基本的类,如CObject、CWnd和CFrameWnd等,以及一些用于界面设计的类,如CButton、CEdit和CListBox等。
2. 消息映射机制:在MFC中,窗口类派生自CWnd类,通过消息映射机制来处理用户输入、系统消息等事件。
当用户操作窗口时,例如点击按钮、拖动滚动条等,系统会生成相应的消息,MFC会将这些消息映射到窗口类的成员函数上进行处理。
开发者只需重载对应的成员函数,就可以实现自定义的响应逻辑。
3. 对话框和控件:MFC提供了对话框和控件的封装,使得开发者可以方便地创建和管理用户界面。
对话框是一个独立的窗口,可以包含各种控件,如按钮、文本框、列表框等。
开发者可以使用MFC 提供的类来创建和设置对话框及其控件,通过消息映射机制来处理用户操作。
4. 文档视图模型(Document-View模式):MFC采用了文档视图模型来处理应用程序的数据和界面显示。
开发者可以通过MFC提供的类来创建文档类和视图类,文档类用于管理应用程序的数据,视图类用于显示和编辑数据。
MFC会自动处理文档和视图之间的关联,使得数据的修改能够实时反映到界面上。
5. 消息循环:MFC应用程序在启动后会进入一个消息循环,不断地接收和处理消息。
消息循环负责分发消息,并将消息传递给对应的窗口类进行处理。
MFC提供了一个消息映射表,用于将消息和相应的处理函数关联起来。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2.1 MFC概述
MFC作为一个Windows编程类库,它包含了200多个类, 封装了Windows的大部分编程对象以及与它们有关的操 作。
虽然程序在功能上千差万别,但从本质上看,都可以分 为用户界面设计、文件操作、数据库访问及多媒体使用 等几部分。
7.2.2 MFC体系结构
MFC主要组成部分:类、宏和全局函数。
本章主要学习内容:
Windows的编程机制 MFC的基本原理和使用方法:
– MFC类
– MFC应用程序框架
– MFC消息管理 – MFC宏
常用的MFC类
7.1 Windows编程基础
Windows是一个多进程的图形窗口操作系统 , DOS应用程序采用顺序执行过程,而Windows是 一个基于事件的消息(Message)驱动系统。 Windows应用程序是按照“事件→消息→处理” 非顺序的机制运行。当有某个事件(如单击鼠标、 键盘输入和执行菜单命令等)发生时,Windows 会根据具体的事件产生对应的消息,并发送到指 定应用程序的消息队列;应用程序从消息队列中 取出消息,并根据不同的消息进行不同的处理。
ON_ . . . . . .
// MFC预定义的消息映射宏 // 用户自定义的消息映射宏
ON_MESSAGE(message , memberFxn) . . . . . . //}}AFX_MSG_MAP END_MESSAGE_MAP()
注意:特殊注解“//{{AFX_MSG_MAP”是ClassWizard类 向导用于维护消息映射宏的标记,用户不要删除注解轻易 修改注解内的代码。
MFC约定:全局函数以“Afx”为前缀,全局变 量以“afx”为前缀。
7.2.3 学习MFC的方法
首先要对Windows编程概念和API函数有一定的了解,如 Windows API有哪些功能和哪些常用的数据结构等。
学会抽象地把握问题,不求甚解,不要一开始学习Visual C++就试图了解整个MFC类库。从理解和使用两个方面学 习MFC,理解MFC应用程序的框架结构。
7.4.2 消息的发送
发送消息到一个窗口可以采用传送(Send)或寄送 (Post)方式,这两种方式之间的主要区别是消息 被接收对象收到后是否立即被处理。Windows提供 了三个API函数用于消息的发送。
函数SendMessage()用于向一个或多个窗口传送消息, 该函数将调用目标窗口的窗口函数,直到目标窗口 处理完收到的消息,该函数才返回。
7.1.1 关于API和SDK
API(Application Programming Interface) 是 Windows操作系统与应用程序之间的标准接口,它 提供了上千个标准函数、宏和数据结构的定义。 SDK API软件开发包,利用Win32 Application向 导建立Windows应用程序框架,然后根据需要添加 头文件、实现源文件和资源文件,并编写具体的程 序代码。
break;
7.1.2 句柄
在Windows中,用句柄(Handle)标识应用程序
中不同的对象和同类对象中不同的实例,如一个 具体的窗口、按钮、输出设备、画笔和文件等。 通过句柄可以获得相应的对象信息。常用的句柄 类型有: HWND 、 HINSTANCE 、 HDC 、 HCURSOR、HICON、HMENU等。
例 利用ClassWizard为框架类添加消息WM_CLOSE、 WM_DESTROY及菜单项“Edit|Copy”的消息处理函 数,分析ClassWizard完成了哪些工作。
启 动 ClassWizard , 添 加 要 求 的 三 个 消 息 处 理 函 数 , ClassWizard将在类的实现文件中添加三个消息映射宏和消息 处理函数。消息映射宏如下: BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() // 由MFC AppWizard程序向导自动生成的消息映射 ON_WM_CLOSE() // 由ClassWizard类向导添加 ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //}}AFX_MSG_MAP END_MESSAGE_MAP()
7.4.1 MFC消息映射机制
MFC 采 用 消 息 映 射 ( Message
Map) 机 制 取 代 C/C++语言中的switch-case结构来处理消息。 映射宏把一个Windows消息和其消息处理函数联结 起来。
MFC消息映射机制包括一组消息映射宏。一条消息
MFC应用程序框架提供了消息映射功能。
ClassWizard在类的定义中声明了消息处理函数 :
class CMainFrame : CFrameWnd { public: CMainFrame(); protected: //{{AFX_MSG(CMainFrame) // 声明消息处理函数原形 afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // 由程序向导自动生成 afx_msg void OnClose(); // 由ClassWizard类向导添加 afx_msg void OnDestroy(); afx_msg void OnEditCopy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() // 声明使用消息映射宏 };
2.在窗口函数WndProc()的消息处理分支switch-case 结构中添加WM_LBUTTONDOWN鼠标单击消息及 其处理代码: case WM_LBUTTONDOWN:
MessageBox(NULL, "You pressed the
left button of mouse !","Message",NULL);
命令(Command)消息:由菜单项、工具栏按钮、快捷 键等用户界面对象发出的WM_COMMAND消息。命令 消息与其它消息不同,它可被更广泛的的对象如文档、 文档模板、应用程序对象、窗口和视图等处理。
消息用MSG结构表示:
typedef struct tagMSG { HWND hWnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
7.3
MFC应用程序框架说明
MFC应用程序对象之间的关系
MFC应用程序运行后各函数的调用关系
InitInstance()函数是派生类唯一需要重载的函数,它负责 应用程序的初始化,如初始化数据、创建文档模板、处理命令 行以及显示应用程序主窗口。
7.4
MFC消息管理
MFC消息管理是MFC编程的一个重要内容,也是编 写MFC应用程序的基础。 MFC应用程序消息处理的方式与SDK应用程序有所 不同。MFC应用程序框架截取了Windows向应用程 序发出的消息,再确定将消息发送给哪一个对象。 消息管理包括消息的发送和处理。对于消息发送, MFC提供了类似于API函数功能的消息发送函数, 而MFC消息处理的内部机制则相对复杂一些。从编 程的角度出发,我们只需了解其大致的原理。
在类的实现源文件中用BEGIN_MESSAGE_MAP()
和END_MESSAGE_MAP()宏来定义消息映射。
在类定义的结尾用DECLARE_MESSAGE_MAP()
宏来声明使用消息映射。
MFC应用程序MESSAGE_MAP消息映射形式:
BEGIN_MESSAGE_MAP(theclass, baseclass) //{{AFX_MSG_MAP(theclass)
// 目标窗口句柄 // 消息标识 // 消息参数1(附加信息,16位) // 消息参数2(附加信息,32位) // 消息发送时间 // 消息发送时鼠标的屏幕坐标Βιβλιοθήκη 7.2MFC微软基础类
Visual C++捆绑了微软的基础类MFC,编程时 我们就可以利用类的可重用性和可扩充性,大大降 低Windows应用程序设计的难度和工作量。
先定义一个句柄,然后调用MFC类的成员函数Attach()将 句柄与一个MFC类对象联系在一起,此时的句柄就成为 该MFC类对象的句柄。在退出对象作用域之前,调用成 员函数Detach()将句柄和对象进行分离。如下所示:
CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach();
7.1.3 事件和消息
所谓消息就是用于描述某个事件发生的信息,而事件 是对于Windows的某种操作。 事件和消息密切相关,事件是因,消息是果,事件产 生消息,消息对应事件。所谓消息的响应,其实质就 是事件的响应。 消息驱动是Windows应用程序的核心,所有的外部响 应(如键盘、鼠标和计时器等)都被Windows先拦截, 转换成消息后再发送到应用程序中的目标对象,应用 程序根据消息的具体内容进行处理。 消息不仅可由Windows发出,它也可由应用程序本身 或其它程序产生。Windows为每一个应用程序都维护 一个或多个消息队列,发送到每个程序窗口的消息都 排成一个队列。
例:编写一个名为Hello的类SDK应用程序,当单击 鼠标时通过调用API函数,以弹出一个提示信息对 话框。
1 . 执 行 “ File|New” 菜 单 命 令 , 在 New 对 话 框 的 Project页面中选择Win32 Application项目类型,输入 程序名 Hello。在向导第 1步选择 “A typital “Hello world!” application”项,单击Finish按钮。