![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MFC
文章平均质量分 77
huyinhou
看似高深的东西,都可以从点滴开始掌握。
展开
-
消息处理机制:CCmdTarget 和 消息映射表
<br />MFC的消息处理机制由两部分组成:CCmdTarget类和消息映射表。<br /> 窗口消息构成<br />所有的窗口消息由3部分组成<br />UINTMsg, <br />WPARAMwParam, <br />LPARAMlParam 为神马不用虚函数来处理消息?<br />因为,虚函数是使用类的虚函数表实现的,每个派生类都会带一个虚函数表的拷贝。虚函数表中的每个入口都是一个4字节指针,这样每个类对象就会在虚函数表中带来大量的额外字节。同时,窗口消息的个数和种类随时会发生变化,在消息改变时原创 2011-01-05 12:51:00 · 4475 阅读 · 1 评论 -
程序调试--基本数据类型向CFile的串行化
程序代码:CFile file(_T("file.dat"), CFile::modeReadWrite | CFile::modeCreate);CArchive ar(&file, CArchive::store);LONG a = 10, b = 20; ar程序执行流程:1、CArchive构造,pFile为指向file的指针(一定不能为NULL),nMode为CArchive::store,nBufSize取了默认值为4096,lpBuf取了默认值为NULL。CArchive::CAr原创 2011-04-07 17:48:00 · 1667 阅读 · 0 评论 -
程序调试--MFC基本类型串行化
程序代码#include int _tmain(int argc, _TCHAR* argv[]){ CFile file("file.dat", CFile::modeReadWrite | CFile::modeCreate); CArchive ar(&file, CArchive::store); SIZE size = { 100, 200 }; ar对于MFC基本类型,如CString、CTime、CTimeSpan、COleVariant、COleCurrency原创 2011-04-08 11:47:00 · 891 阅读 · 0 评论 -
程序调试--基本数据类型的并行化
<br />程序代码<br />#include <afxwin.h>int _tmain(int argc, _TCHAR* argv[]){ CFile file("file.dat", CFile::modeRead); CArchive ar(&file, CArchive::load); long a, b; ar>>a>>b; return 0;} <br /> <br />CArchive构造的时候,最后一句<br />m_lpBufCur= (IsLo原创 2011-04-08 16:47:00 · 640 阅读 · 0 评论 -
程序调试--基本数据类型向CMemFile的串行化
<br />程序代码:<br />#include <afxwin.h>int _tmain(int argc, _TCHAR* argv[]){ CMemFile file; CArchive ar(&file, CArchive::store); LONG a = 100, b = 200; ar<<a<<b; return 0;} <br /> <br />1、CMemFile构造。<br />CMemFile::CMemFile(UINT nGrowBytes)原创 2011-04-08 10:48:00 · 3089 阅读 · 0 评论 -
序列化中CRuntimeClass链表的形成
<br />编写可序列化类的步骤<br /> <br />1、直接或间接从CObject派生。<br />2、在类声明中加入DECLARE_SERIAL宏。<br />3、重载基本类的Serialize函数,并串行化派生类的数据成员。<br />4、如果派生类没有默认的构造函数,则添加一个。因为对象加载时,MFC要用默认构造函数在浮动标签上创建对象,并用从档案取回的值设置对象数据成员的初始值。<br />5、在类的实现中写入IMPLEMENT_SERIAL宏。IMPLEMENT_SERIAL宏接收三个参数:原创 2011-04-11 10:18:00 · 2481 阅读 · 0 评论 -
序列化中可配置版本模式
<br />可序列化类代码:<br />class CLine : public CObject{ DECLARE_SERIAL(CLine)public: CLine(){} CLine(CPoint from, CPoint to, COLORREF color) { m_ptFrom = from; m_ptTo = to; m_clrLine = color; } void Serialize(CArchive& ar);protected: CPoint m_p原创 2011-04-12 16:43:00 · 603 阅读 · 0 评论 -
程序调试--CObject对象的串行化
<br />程序代码<br />#include <afxwin.h>class CMyClass : public CObject{ DECLARE_SERIAL(CMyClass)public: CMyClass(int n = 10) : m_nData(n) {} virtual void Serialize(CArchive& ar);protected: int m_nData;};IMPLEMENT_SERIAL(CMyClass, CObject, 1原创 2011-04-11 16:14:00 · 1506 阅读 · 0 评论 -
程序调试--CObject对象的并行化
<br />程序代码<br />#include <afxwin.h>class CMyClass : public CObject{ DECLARE_SERIAL(CMyClass)public: CMyClass(int n = 10) : m_nData(n) {} virtual void Serialize(CArchive& ar);protected: int m_nData;};IMPLEMENT_SERIAL(CMyClass, CObject, 1原创 2011-04-11 22:01:00 · 1143 阅读 · 0 评论 -
CMap
<br />/////////////////////////////////////////////////////////////////////////////// CMap<KEY, ARG_KEY, VALUE, ARG_VALUE>template<class KEY, class ARG_KEY, class VALUE, class ARG_VALUE>class CMap : public CObject{public: // CPair struct CPai原创 2011-05-26 15:18:00 · 2243 阅读 · 0 评论 -
程序调试--MFC基本数据类型并行化
<br />程序代码:<br />#include <afxwin.h>int _tmain(int argc, _TCHAR* argv[]){ CFile file("file.dat", CFile::modeRead); CArchive ar(&file, CArchive::load); SIZE size; ar>>size; return 0;} <br /> <br />首先调用>>的重载函数:<br />CArchive& operator>>(CA原创 2011-04-08 17:35:00 · 1152 阅读 · 0 评论 -
CList
<br />CList声明<br />template<class TYPE, class ARG_TYPE = const TYPE&>class CList : public CObject{protected: struct CNode { CNode* pNext; // 后指针 CNode* pPrev; // 前指针 TYPE data; // 数据 };public: // Construction /* explicit */ C原创 2011-05-20 10:48:00 · 6137 阅读 · 0 评论 -
MFC持久化
<br />MFC通过将类信息写入到文件,再从文件中动态将类创建出来,即为持久化。动态创建是持久化的基础,持久化包含了动态创建的全部功能。<br /> <br />使用持久化特性,需要以下四个条件:<br />1、从CObject派生<br />2、提供不带参数的默认构造参数<br />3、在类声明中添加DECLARE_SERIAL宏,在实现体中添加IMPLEMENT_SERIAL宏。<br />4、重载Serialize函数<br /> <br />一个示例:<br />class CMyClass :原创 2011-01-21 20:54:00 · 1675 阅读 · 0 评论 -
MFC运行时类型信息(RTCI)
使用RTCI,需要满足两个条件:1、从CObject派生类。 2、在类声明中添加DECLARE_DYNAMIC宏,在实现文件中添加IMPLEMENT_DYNAMIC宏。// 代码使用静态库MFC.class CMyClass : public CObject{ DECLARE_DYNAMIC(CMyClass);};IMPLEMENT_DYNAMIC(CMyClass, CObject);//宏展开后class CMyClass : public CObject{原创 2011-01-21 16:12:00 · 8251 阅读 · 0 评论 -
MFC动态创建
RTCI是动态创建的基础,它包含了RTCI的功能,一个示例: class CMyClass : public CObject{ DECLARE_DYNCREATE(CMyClass);};IMPLEMENT_DYNCREATE(CMyClass, CObject);// 展开代码class CMyClass : public CObject{public: static const CRuntimeClass classCMyClass; virtual原创 2011-01-21 16:59:00 · 2772 阅读 · 2 评论 -
MFC程序启动过程(VS 2005代码剖析)
启动前做的事:初始化全局变量。<br />大概做了以下四件事:appmodul.cpp 67行 通过调用函数AfxInitialize初始化了MFC的线程局部存储功能和程序全局信息,这些信息最重要的有以下两个:<br />afxstate.cpp 398行 PROCESS_LOCAL(_AFX_BASE_MODULE_STATE, _afxBaseModuleState)<br />afxstate.cpp 117行 THREAD_LOCAL(_AFX_THREAD_STATE, _afxThreadSta原创 2011-01-22 12:32:00 · 1962 阅读 · 1 评论 -
Windows消息投递流程:WM_COMMAND消息流程
<br />该示例通过研究基本的单文档程序的“文件”--“打开”命令,分析WM_COMMAND消息投递流程。基于VS 2005 代码<br /> <br />AfxWndProc最终调用的是OnWndMsg,这个函数负责消息的分发处理。当消息是WM_COMMAND时,将消息投递给OnCommand函数。<br />// wincore.cpp 1746BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pRes原创 2011-02-13 17:43:00 · 4697 阅读 · 0 评论 -
MFC消息处理(一)
<br /> <br />1、MFC窗口如何与AfxWndProc建立联系。<br />当一个新的CWnd派生类创建时,在调用CWnd::CreateEx()过程中,MFC都会安装AfxCbtFilterHook()。这个Hook将拦截HCBT_CREATEWND,将窗体的消息处理函数设置为AfxWndProc()。<br /> <br /> <br />// wincore.cpp 651// CWnd::CreateEx函数通过AfxHookWindowCreate函数安插HookBOOL CW原创 2011-02-13 11:33:00 · 2886 阅读 · 0 评论 -
Windows消息投递流程:一般窗口消息投递(WM_LBUTTONCLICK)
<br />本例通过在单文档程序的视图中添加WM_LBUTTONCLICK消息处理函数,来解释一般窗口消息的投递流程。 基于VS 2005<br />BEGIN_MESSAGE_MAP(CMyView, CView) ON_WM_LBUTTONDBLCLK()END_MESSAGE_MAP()// ON_WM_LBUTTONDBLCLK宏展开#define ON_WM_LBUTTONDBLCLK() /{ WM_LBUTTONDBLCLK, 0, 0, 0, AfxSig_vwp, /原创 2011-02-13 18:56:00 · 5567 阅读 · 0 评论 -
CArray
<br />/////////////////////////////////////////////////////////////////////////////// CArray<TYPE, ARG_TYPE>template<class TYPE, class ARG_TYPE = const TYPE&>class CArray : public CObject{public: // Construction CArray(); // Attributes IN原创 2011-05-20 09:30:00 · 4174 阅读 · 0 评论 -
MFC可停靠菜单栏的创建过程
VS2010创建的MFC单文档工程中,菜单栏也是可停靠。原创 2014-04-12 20:21:11 · 2667 阅读 · 0 评论