在Win32应用程序中使用MFC类库

合集下载

WIN32 API SDK MFC四者之间的联系和区别

WIN32 API SDK MFC四者之间的联系和区别

WIN32/API/SDK/MFC四者之间的联系和区别WIN32/API/SDK/MFC四者之间的联系和区别这几个概念,对于新手来说,一直都是比较模糊的,搞不清楚他们之间的关系。

1、WIN32是不是就是指API?如果不是的话,WIN32具体是什么东西。

不是,API你可以理解成系统函数(应用程序接口),Win32是一个子系统。

Win32是Windows的一个子系统,还有另外的子系统如OS/2、POSIX、WOW等。

不同的子系统系统提供了不同的编程接口,即API,一般说的API指的就是Win32 API。

2、SDK和API的关系是什么?可以说SDK靠千万的API进行支撑。

打个比方,他的窗体的创建都是靠一系列的API实现的。

MFC当然也可以调用API,SDK也行。

3、SDK和MFC的区别是什么?MFC是对SDK的封装,通过MFC的一些方法实现,实质上还是调用了API进行实现。

这就是封装的好处,加快了开发的速度,减低了开发的难度。

上面大家都说Win32是一个子系统,这个当然是对的,不过我们有时候我们所说Win32通俗的就是指32位的Windows系统,从windows95/98到NT/2000/XP都是32位Windows。

子系统却是仅对NT架构的系统而言的。

我想楼主所问的Win32并不是子系统。

API就是应用程序接口,是由系统提供的一些函数,比如你想创建一个文件,就要调用CreateFile,这个CreateFile就是一个API。

任何一个操作系统都会提供API的,比如DOS也提供API,不过它是通过Int 21h中断提供的就是了。

SDK是指一些公司针对某一项技术为软件开发人员制作的一套辅助开发或者减少开发周期的工具。

一般专指Windows系统提供的相关的头文件和LIB文件。

有时候很多人将不用MFC等相关类库,而只用API进行开发的方式也叫做SDK开发,从这一点来说,API 和SDK似乎是通用的。

MFC是MS对API的一个封装,也就是一个C++类库,当然MFC比一般类库庞大,所以有人称之为应用程序框架。

mfc消息机制原理

mfc消息机制原理

MFC(Microsoft Foundation Classes)是一种用于开发Windows应用程序的C++类库,它建立在Win32 API之上,并提供了更高层次的抽象和封装。

在MFC中,消息机制是实现应用程序与用户交互和事件处理的基础。

MFC消息机制的原理如下:1.消息映射表:在MFC应用程序中,每个窗口类(如对话框类、视图类等)通常都有一个消息映射表(message map),用于将消息与相应的处理函数关联起来。

消息映射表是一个静态数据结构,通过DECLARE_MESSAGE_MAP宏进行声明,并在类的实现文件中使用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP宏定义映射表的内容。

2.消息处理函数:每个消息映射表项将消息的ID(或者命令ID)与相应的消息处理函数绑定在一起。

消息处理函数是成员函数,由开发人员根据需要自行定义。

当相应的消息被触发时,系统会自动调用与该消息对应的处理函数。

3.消息循环:MFC应用程序在运行时通过消息循环(message loop)不断接收和分发消息。

消息循环负责从操作系统获取消息,并将消息派发给目标窗口的消息处理函数进行处理。

消息循环可以使用Run函数或AfxGetApp()->Run函数启动。

4.分发消息:当系统从消息队列中获取到一个消息后,会根据消息的目标窗口通过HWND来查找对应的CWnd对象,并调用该窗口的响应函数(如PreTranslateMessage、OnCmdMsg等)进行消息处理。

如果消息在目标窗口的消息映射表中找到了对应的处理函数,则将该消息转发给对应的处理函数进行处理。

5.消息处理:消息处理函数执行相应的逻辑,可以进行界面更新、控件操作、数据处理等操作。

处理函数的返回值通常是布尔型,表示是否终止消息的传递。

通过这种消息机制,MFC应用程序可以实现用户交互和事件处理的功能,使开发人员可以方便地处理窗口消息,响应用户操作,以及完成界面和数据之间的交互。

win32 dll和mfc dll

win32 dll和mfc dll

现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。

这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题。

1.Win32 DLL在Win32 DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件。

然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义你自己的对话框回调函数处理对话框收到的消息。

下面通过一个具体实例来学习如何在Win32 DLL中使用对话框,可以按照以下步骤来完成这个例子:1)在VC菜单中File->New新建一个命名为UseDlg的Win32 Dynamic-Link Library工程,下一步选择A simple DLL project。

2)在VC菜单中Insert->Resource添加一个ID为IDD_DLG_SHOW的Dialog资源,将此Dialog上的Cancel 按钮去掉,仅保留OK按钮。

再添加一个ID为IDD_ABOUTBOX的对话框,其Caption为About。

保存此资源,将资源文件命名为UseDlg.rc。

并将resource.h和UseDlg.rc加入到工程里面。

3)在UseDlg.app中包含resource.h,并添加如下代码:HINSTANCE hinst = NULL;HWND hwndDLG = NULL;BOOL CALLBACK DlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);extern "C" __declspec(dllexport) void ShowDlg();BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch(ul_reason_for_call){case DLL_PROCESS_ATTACH:hinst = (HINSTANCE)hModule;case DLL_PROCESS_DETACH:break;}return TRUE;}extern "C" __declspec(dllexport) void ShowDlg(){hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW), NULL,(DLGPROC)DlgProc);ShowWindow(hwndDLG, SW_SHOW);}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch(message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if(LOWORD(wParam)==IDOK)DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),hDlg,(DLGPROC)AboutProc);return TRUE;case WM_CLOSE:DestroyWindow(hDlg);hwndDLG = NULL;return TRUE;}return FALSE;}BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam){switch(message){case WM_CLOSE:EndDialog(hDlg,NULL);hwndDLG = NULL;return TRUE;}return FALSE;}4)编译生成UseDlg.dll和UseDlg.lib。

微软基础类库(MFC)

微软基础类库(MFC)

M F CMFC(Microsoft Foundation Classes),是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows的API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

① MFC简介:MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种应用程序框架,随微软Visual C++ 开发工具发布。

目前最新版本为10.0(截止2011年3月),并且发布了中文版。

该类库提供一组通用的可重用的类库供开发人员使用。

大部分类均从CObject 直接或间接派生,只有少部分类例外。

MFC 应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。

MFC 提供了MFC AppWizard 自动生成框架。

Windows 应用程序中,MFC 的主包含文件为"Afxwin.h"。

此外MFC的部分类为MFC/ATL 通用,可以在Win32 应用程序中单独包含并使用这些类。

由于它的易用性,初学者常误认为VC++开发必须使用MFC。

这种想法是错误的。

作为Application Framework,MFC的使用只能提高某些情况下的开发效率,只起到辅助作用,而不能替代整个Win32 程序设计。

② MFC特点:MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal 和Delphi的关系一个道理,Pascal是Delphi的语言基础,Delphi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面向对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC 同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的..MFC是Win API与C++的结合,API,即微软提供的Windows下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Windows下应用程序的开发,使这些被开发出来的应用程序能在Windows下运行,比如VB,VC++,Java,Delhpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在Windows的消息机制和绘图里,遵守Windows作为一个操作系统的内部实现,这其实也是一种必要,微软如果不提供API,这个世上对Windows编程的工作就不会存在,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Windows下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多程序开发人员在Windows下用C++ & MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的..最后要明白MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等,学习中最应花费时间的是消息和设备环境,对C++和MFC的学习中最难的部分是指针,C++面向对象程序设计的其它部分,如数据类型,流程控制都不难,建议学习数据结构C++版。

mfc

mfc
virtual BOOL InitInstance();// 重载虚函数InitInstance()
};
// 主线程的初始化
BOOL CMainApp::InitInstance()
{
m_pMainWnd = new CMainFrame(); // 主窗口
m_pMainWnd->ShowWindow(m_nCmdShow);
// 主线程的初始化
BOOL CMainApp::InitInstance()
{
m_pMainWnd = new CMainFrame(); // 主窗口
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
}
//////////////////////////////////////////////////////////////////////////
// 主线程
class CMainApp:public CWinApp // 主线程类继承自CWinApp(:CWinThread)
{
public:
// 主窗口
class CMainFrame : public CFrameWnd // 主窗口类继承自CFrameWnd(:CWnd)
{
public:
CMainFrame()
{
Create(NULL, _T("Hello MFC!"), WS_OVERLAPPEDWINDOW, CRect(0,0,400,300));
}
protected:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);

MFC和Win32的区别

MFC和Win32的区别

MFC和Win32区别Visual C++设计软件有WIN32和MFC两中形式MFC ,Microsoft Foundation Classes.微软基础类库。

这个类库不光封装了大多数的GUI系统对象和数据结构,还为开发者提供了开发框架,使原本复杂繁琐的Windows开发(尤其使界面开发)变得非常简单。

MFC程序就是说,这个程序通过继承MFC的类实现的。

win32 是32位windows应用程序的统称。

从现在来看,MFC程序大都是win32的了,但在早期,MFC也能生成16位的应用程序。

WIN32 是Windows的一个子系统,也是最重要的一个。

(还有POSIX子系统和OS/2子系统)Win32子系统为应用程序提供了使用系统资源的接口Win32 API(Application Program Interface),WIN32 API是Windows用户态下应用程序编程的基础。

因此所有在WIN32API基础上的应用程序都是Win32应用程序。

MFC是对API的封装,因此它能实现的功能只是API的子集。

对于追求系统底层相关而且效率高的程序而言,MFC不够灵活而且开销也大。

但对于图形界面开发,如果没有MFC而使用API的话那么开发简直是对人的折磨。

MFC 很好用,但终归也是API的东西。

懂了系统原理和接口,MFC也就全明白了。

现在很少有直接用win32 API直接写GUI程序,除非程序很简单,要求程序很小的情况,,一般都用MFC,这样可以用相同的时间写出更漂亮和复杂的GUI 程序,使用封装好的类库会降低编程的灵活性,在一些开发中可能会束缚住手脚,VC中win32指的是windows 32位API,也就是32位windows提供的基础API,你建立的win32应用程序基于这些API,是完完全全的32位windows程序。

在VC中还分控制台和普通应用程序,主要是输出方式不同。

控制台下可能要使用cin这样的输入流对象,而非控制台程序可以使用图形API显示图形界面。

MFC教程 MFC和Win32

MFC教程 MFC和Win32

2. MFC和Win321. MFC Object和Windows Object的关系MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。

所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里(本书范围内)MFC Object是有特定含义的,指封装Windows Object 的C++ Object,并非指任意的C++ Object。

MFC Object 和Windows Object是不一样的,但两者紧密联系。

以窗口对象为例:一个MFC窗口对象是一个C++ CWnd类(或派生类)的实例,是程序直接创建的。

在程序执行中它随着窗口类构造函数的调用而生成,随着析构函数的调用而消失。

而Windows窗口则是Windows系统的一个内部数据结构的实例,由一个“窗口句柄”标识,Windows系统创建它并给它分配系统资源。

Windows窗口在MFC窗口对象创建之后,由CWnd类的Create成员函数创建,“窗口句柄”保存在窗口对象的m_hWnd成员变量中。

Windows窗口可以被一个程序销毁,也可以被用户的动作销毁。

MFC窗口对象和Windows窗口对象的关系如图2-1所示。

其他的Windows Object和对应的MFC Object也有类似的关系。

下面,对MFC Object和Windows Object作一个比较。

有些论断对设备描述表(MFC类是CDC,句柄是HDC)可能不适用,但具体涉及到时会指出。

1. 从数据结构上比较MFC Object是相应C++类的实例,这些类是MFC或者程序员定义的;Windows Object是Windows系统的内部结构,通过一个句柄来引用;MFC给这些类定义了一个成员变量来保存MFC Object对应的Windows Object的句柄。

MFC类库CArray类模板源代码注释及在Win32 控制台程序中的简单使用

MFC类库CArray类模板源代码注释及在Win32 控制台程序中的简单使用

2010年9月14日16:58:44新建一个Win32控制台程序,使用MFC类库。

工程设置:点击菜单“Project” “Settings”,选择“General”标签,在“Microsoft Foundation Classes”组合框下,选择“Use MFC in a Shared DLL”。

以静态链接库的形式使用MFC类库。

源程序如下:#include<iostream.h>#include<afxwin.h>#include<afxtempl.h>int main(){CArray<CPoint,CPoint> m_array;//定义数组对象CPoint pt1(10,10);//定义对象并存放在数组中m_array.Add(pt1);CPoint pt2(20,20);m_array.Add(pt2);CPoint pt3(30,30);m_array.Add(pt3);int size=m_array.GetSize();//获取数组实际大小---元素个数CPoint pt;int index=0;for(index=0;index<size;index++){//输出数组元素pt=m_array.GetAt(index);cout<<pt.x<<" "<<pt.y<<endl;}return 0;}测试:输出成功。

2010年9月14日17:04:12下面是CArray的定义。

参考MSDN进行理解。

模板参数TYPE指出了存放在CArray中的对象的类型。

两个模板参数暂时认为应该一样。

// CArray<TYPE, ARG_TYPE>template<class TYPE, class ARG_TYPE>class CArray : public CObject{public:// ConstructionCArray();// Attributesint GetSize() const;int GetUpperBound() const;void SetSize(int nNewSize, int nGrowBy = -1);// Operations// Clean upvoid FreeExtra();void RemoveAll();// Accessing elementsTYPE GetAt(int nIndex) const;void SetAt(int nIndex, ARG_TYPE newElement);TYPE& ElementAt(int nIndex);// Direct Access to the element data (may return NULL)const TYPE* GetData() const;TYPE* GetData();// Potentially growing the arrayvoid SetAtGrow(int nIndex, ARG_TYPE newElement);int Add(ARG_TYPE newElement);int Append(const CArray& src);void Copy(const CArray& src);// overloaded operator helpersTYPE operator[](int nIndex) const;TYPE& operator[](int nIndex);// Operations that move elements aroundvoid InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1);void RemoveAt(int nIndex, int nCount = 1);void InsertAt(int nStartIndex, CArray* pNewArray);// Implementationprotected:TYPE* m_pData; // the actual array of data//保存实际数组的指针int m_nSize; // # of elements (upperBound - 1)//数组的元素个数int m_nMaxSize; // max allocated//数组的容量大小int m_nGrowBy; // grow amountpublic:~CArray();void Serialize(CArchive&);#ifdef _DEBUGvoid Dump(CDumpContext&) const;void AssertValid() const;#endif};//构造函数的实现template<class TYPE, class ARG_TYPE>CArray<TYPE, ARG_TYPE>::CArray(){//数据成员初始化,空数组m_pData = NULL;m_nSize = m_nMaxSize = m_nGrowBy = 0;}typedef unsigned char BYTE;//1个字节//析构函数的实现template<class TYPE, class ARG_TYPE>CArray<TYPE, ARG_TYPE>::~CArray(){ASSERT_VALID(this);if (m_pData != NULL){DestructElements<TYPE>(m_pData, m_nSize);//释放元素---调用析构函数//数组容量未保存元素的部分不存在对象,所以不用调用析构函数,但要释放内存delete[] (BYTE*)m_pData;//释放内存}}#ifndef AFX_INLINE#define AFX_INLINE inline /*__forceinline*/#endif//返回数组的元素个数m_nSizetemplate<class TYPE, class ARG_TYPE>AFX_INLINE int CArray<TYPE, ARG_TYPE>::GetSize() const{ return m_nSize; }//返回数组的上限下标(元素个数-1)template<class TYPE, class ARG_TYPE>AFX_INLINE int CArray<TYPE, ARG_TYPE>::GetUpperBound() const{ return m_nSize-1; }//返回数组在指定下标的元素,应该是拷贝。

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

在Win32应用程序中使用MFC类库(转)
转发评论
2010-04-30 10:38
由于MFC中的辅助类,如CFileDialog,CFileFind,CString等使用起来非常的方便如果用API来完成相应的工作,则需要自己完成大量的重复工作,使用MFC的辅助类可以节省大量的开发时间,具体方法如下: 1.加入相应的头文件
由于在SDK程序中一定要包含windows.h头文件,所以在使用MFC中的类时,如加入afx.h一类的头文件会有一个提示与windows.h相冲突,解决的办法是,去掉windows.h,然后在所有的.h 文件前加入
#include "stdafx.h"
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
注意一定要在所有的头文件之前加入这几行,而起顺序最好不要改变,否则会有大量的错误提示。

2.更改编译设置
在Project->Setting->General中选Use MFC in a Shared DLL或者Use MFC in static Library,并把
project->Setting->C/C++ 中的Use runing-time library 由Single-Threaded改为相应的Multithreaded。

\
法二:
如何让WIN32应用程序支持MFC类库
2011-09-16 15:03:06| 分类:编程专栏 | 标签:win32 应用程序 mfc 类库配置|字号订阅我们在调用一个控制台程序时一直都有DOS黑框闪烁一下,很多时候我们都不希望出现那个黑框,因为那样给人感觉特别不好,但是如果是控制台程序的话又是无法避免的。

那是不是就没办法了呢,当然不是,我们可以选择在VS中制作Win32应用程序来解决,它虽然是窗口程序,但是我们可将窗口隐藏掉就不会像之前有闪烁的现象,但是默认生成的
Win32应用程序又不能使用MFC类库,给我们编程造成不便,下面我就来教大家怎样在WIN32应用程序中支持MFC类库的方法,让我们接着开始吧!
首先,在文件中加入如下头文件语句:
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从Windows 头中排除极少使用的资料
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
上面这段代码可以放在预编译头文件stdafx.h中,位置自己可定
然后在_tWinMain的开始加入
if (!AfxWinInit(hInstance, NULL, lpCmdLine, 0))
{
MessageBox(NULL,_T("MFC init error!"),_T("Error!"),MB_OK);
return 0;
}
然后在菜单中依次选择"项目->属性->配置属性->常规->MFC的使用"中选择"在共享DLL中使用MFC";
然后再在菜单中依次选择"项目->属性->配置属性->链接器->常规->附加库目录"中加入"kernel32.lib user32.lib gdi32.lib",中间以空格隔开;
如果编译时出现下面错误:
fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>
那么我们在预编译头文件stdafx.h中将"#include <windows.h>"删掉或者注释掉即可.
至此一切OK,然后你就可以用MFC类了。

说明:虽然我们可以建立MFC应用程序然后隐藏窗口来解决这个问题,但是这样生成的EXE文件的大小要比前面两者都大,因为它加载了很多我们用不着的资源,从而造成了浪费。

相关文档
最新文档