消息会按照这个路线传递下去,1、创建和终止线

0:MFC类档期的顺序结构

本章将会对MFC的音信映射和 命令传递机制做深切研究。

在MFC程序中,大家并不时常直接调用Windows API,而是从MFC类创造对象并调用属于那些指标的积极分子函数.也正是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法正是二个用C++写的三个函数库 然后您来调用 只不过这几个类不是你写的
           MFC提供数百个类,最重点的、也是编写制定任何VC++应用程序都不可或缺的八个类CWinApp和CFrameWnd,这八个类是编写复杂变得庞大应用程序的水源。
1>封装个性:构成MFC框架的是MFC类库而MFC类库又是C++的三个类库。这个类封装WIN32应用程序编制程序接口,OLE(Object Link Embed 对象链接嵌入)性情,ODBC和DAO数据访谈的成效。
2>承接特性:MFC抽象出了好多类的共同特征,并规划出某些基类作为贯彻任何类的底子,那些类中最关键的类是CObject类和CCmdTarget类,工程师能够从适用的MFC类中派生出自个儿的类,完结特定的作用到达编制程序的目标。
3>设想和信息映射:MFC是以C++为根基,当然援救虚函数,但作为贰个编制程序框架必须要解决的是功能难点:若是MFC仅仅通过虚函数来支持动态约束必然会产生大批量的虚函数表那样编制程序框架过于臃肿并且消耗越来越多的内部存款和储蓄器。不过MFC创建了消息映射机制这样裁减了内存的运用却大大升高了频率
新闻映射是二个将音信和成员函数相互关联的表,当应用程序的框架窗口接收到一个音信时,MFC将寻找该窗口的音信映射,假设存在一个拍卖音讯的管理程序,那么就调用该管理程序.
它通过宏来完毕消息到成员函数的映照,并且那个函数不必是虚构的分子函数,那样没有须求为消息映射函数生成一个十分的大的虚构函数表(V表),节外省部存储器。
MFC新闻映射机制:
将音讯与音讯处理函数联系起来,形成梯次对应的编写制定。
音讯映射宏
声明: DECLARE_MESSAGE_MAP
定义:
        BEGIN_MESSAGE_MAP
   ON_COMMAND
   ON_CONTROL
   ON_MESSAGE
       END_MESSAGE_MAP
MFC首要组成都部队分:类、宏和全局函数。
类是MFC中最关键的原委。MFC类是以档案的次序结构方式协会起来的。MFC中的类分成两有的,除了部分帮忙类,大多数的MFC类是直接或直接从根类CObject派生而来。
MFC宏主要职能:音信映射、运营时对象类型服务、会诊服务、极度管理。
MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀
MFC类的层系关系
CObject项目类)->CCmdTarget(新闻响应类)->
{
CWinThread(线程类)->CWinApp(Window应用程序类)
CDocument(文档类)
CWnd(窗体类)->[
              CFrameWnd(框架类)
              CView(视图类)
              ]
}

  1. RTTI

1、创造和终止线程

图片 1

    MFC规定了音讯传递的路线,音讯会根据那一个门路传递下去,找不到归宿的话就付出DefWindowProc。

CObject类由于MFC中山高校部分分拣是从CObject类承接而来的,CObject类描述了大概具有的MFC类的片段集体性格,CObject类为程序猿提供了目的会诊、运维时类型识别和系列化等作用。
CCmdTarget类由CObject类直接派生而来,它承受将新闻发送到能够响应这一个新闻的对象。它是富有能进行音信映射的MFC类的基类。
CWinApp类在别的MFC应用程序中有且只有贰个CWinApp派生类的靶子,它意味着了前后相继中运作的主线程,也象征了应用程序本人。 CWinApp类代替了WinMain()主函数在SDK应用程序中的地位。守旧SDK应用程序WinMain()函数实现的行事。今后由类CWinApp的InitApplication(),InitInstance()和Run()多少个分子函数承担。
CWnd类由CCmdTarget类直接派生而来,该类及其派生类的实例是贰个窗口。CWnd类代表了MFC中最核心的GUI对象,它是叁个功效最完善、成员函数最多的MFC类。
CFrameWnd类是CWnd类的派生类,主要用以掌管叁个窗口,它代替了SDK应用程序中窗口函数WndProc()的身价。CFrameWnd类的指标是二个框架窗口,包涵边框、标题栏、菜单、最大化开关、最小化按键和贰个激活的视图。
CDocument类在应用程序中作为顾客文档类的基类,它象征了客商存储或展开的贰个文本。
CView类是MFC中三个很基本的类,它当做其余MFC视图类和客户视图派生类的基类。
从API编制程序到MFC编制程序的过渡:
WinMain()
{  初始化WNDCLASS
    注册窗体结构
    创制窗口           ->>>>>>>>应用程序类CWinApp
    展现窗口
    新闻循环
}

运维时类型识别:在程序实行进度中可见判定a对象是不是是A类,重回true大概false;

  在MFC程序中开创叁个线程,宜调用AfxBeginThread函数。该函数因参数分歧而持有三种重载版本,分别对应工小编线程和客户接口(UI)线程。

1:MFC程序的最早化进程
CWinApp::InitApplication()
CMyWinApp::InitInstance()
CMyFrameWnd::CMyFrameWnd()
CFrameWnd::Create()
CWnd:CreateEx()
CFrameWnd::PreCreateWindow()
CWinApp::Run()
CWinThread::Run()

    在发生窗口在此之前,假诺咱们在创设窗口时钦点的窗口类为NULL时,MFC会自动注册三个暗中认可的窗口类,每一个窗口类有投机的窗口函数。不相同窗口得到的音讯应该交由区别的窗口函数来处理。所谓的授命传递机制是为着让新闻的流淌有路经可循,实现二个壮烈的网,实现全部相当大大概的渠道。这正是所谓的音信映射图。

WndProc()
{ switch(…)           
           ->>>>>>>>>框架窗口类CFrameWnd
}

体系型录网:用来记录类之间的关系,以链表的样式记录须求的新闻,供查询;

  工小编线程

2:RTTI[CRuntimeClass]
DECLARE_DYNAMIC
IMPLEMENT_DYNAMIC

    WM_COMMAND是根源菜单或工具栏,被称作命令音讯。wParam记录着这一音信来源于哪个菜单类别。

MFC Object和Windows Object的对应关系:
描述                 Windows句柄       MFC Object
窗口                  HWND                    CWnd
设施上下文        HDC                      CDC
菜单                   HMENU                CMenu
笔                       HPEN                   CPen
刷子                   HBRUSH              CBrush
字体                   HFONT                 CFont
位图                    HBITMAP            CBitmap
套接字                SOCKET              CSocket

C途锐nutimeClass:用来描写类别型录中用来记录类音信的链表,包涵类名,next指针、static first指针;

CWinThread *AfxBeginThread(
 AFX_THREADPROC pfnThreadProc, //调整函数
 LPVOID pParam, //传递给调节函数的参数
 int nPriority = THREAD_PRIORITY_NORMAL, //线程的优先级
 UINT nStackSize = 0, //线程的仓库大小
 DWO宝马7系D dwCreateFlags = 0, //线程的创导标识
 LPSECURITY_ATTSportageIBUTES lpSecurityAttrs = NULL //线程的平安品质
);

3:动态创设
DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE

   除了指令新闻控件传给父窗口的新闻,也是以WM_COMMAND类型的,不过它们被叫做notification消息。

三、手工业成立多个MFC应用程序:
专一:创立MFC程序,要开创二个Win32空项目,并要采用体系性质中的”在共享DLL文件中使用MFC,然后新建我们的文书
事例:在”hello.h”头文件中添写如下代码:
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();//虚函数
};
class CMainWindow:public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();//注脚音信映射
};
在”hello.cpp”源文件中添写如下代码:
#include <afxwin.h>
#include “hello.h"
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;

宏定义DECLARE_DYNAMIC、IMPLEMENT_DYNAMIC 将CRuntimeClass增多到类中

  工作者线程编制程序较为简单,只需编写线程序调控制函数和运行线程就能够。下边包车型地铁代码给出了定义二个调节函数和开发银行它的历程:

4:恒久保存
DECLARE_SERIAL
IMPLEMENT_SERIAL

    Command target即命令的目标地。由此有着派生自CCmdTarget类的类都能够管理命令音信。

      m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()       //新闻映射
CMainWindow::CMainWindow() //构造函数开始化
{
    Create(NULL,“我的第多少个MFC应用程序”);//创造窗体
}
void CMainWindow::OnPaint()
{  CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
  dc.DrawText("Hello MFC",-1,&rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}
CWinApp是选择程序类,在MFC应用程序中必须从这一个类派生出一个类,该派生类是MFC应用程序的进口
必得定义这么些派生类的指标,何况只可以有七个那些目的表示全数应用程序。
分子函数:InitInstance()
效率:开头化应用程序实例和窗口实例,
虚函数CWinApp::InitInstance必需在派生类中重写。在InitInstance函数中,编写开始化代码,如:
开创二个窗口
展现三个窗口
CFrameWnd类
成效:为应用程序提供贰个窗口,同有时间达成消息管理功能。
成员函数: Create()
效果:制造窗体,将之赋于CFrameWnd对象上。
BOOL Create(窗口类型, 窗口题目,显示风格,显示区域,符窗口句柄,菜单,扩张展现风格,上下文对象)共有8个参数,前几个必得提交,后6个能够暗中同意。
MFC应用程序的着力就是基于CWinApp类的应用程序对象,CWinApp提供了新闻循环来搜索讯息并将音讯调节给应用程序的窗口.大家在编排MFC应用程序时,要含有afxwin.h,
多少个MFC应用程序能够有且仅有贰个应用程序对象,对象必需申明为在大局范围内立见成效(约等于大局对象),以便它在程序起首时即在内部存款和储蓄器中被实例化
作者们的Hello MFC的应用程序类被取名称为CMyApp,它在hello.cpp中用如下语句举行了实例化:
CMyApp myApp;
CMyApp的类注解在hello.h中代码如下:
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
CMyApp未有注脚任何的多少成员,只是重写了二个从CWinApp类中承袭来的函数,在应用程序的生存期内InitInstance的调用比较早,是在应用程序早先运维未来而窗口创造以前,除非InitIstance制造二个窗口,不然应用程序是不会有窗口,那多亏为啥不怕最小的MFC应用程序也非得从CWinApp派生出一个类比量齐观写CWinApp::InitIstance的原故
InitInstance函数:CWinApp::InitInstance是三个虚函数,其暗中同意操作仅满含一条语句:return TRUE;
InitInstance是用来施行顺序每便最初时都供给展开的起先化工作最好的地点
在hello.cpp中,CMyApp的InitInstance通过实例化hello的CMainWindow类来创建hello窗口,语句:
m_pMainWnd = new CMainWindow;

 

//线程序调控制函数
UINT MfcThreadProc(LPVOID lpParam)
{
 CExampleClass *lpObject = (CExampleClass*)lpParam;
 if (lpObject == NULL || !lpObject->IsKindof(RUNTIME_CLASS(CExampleClass)))
  return - 1; //输入参数不合规 
 //线程成功运行
 while (1)
 {
  ...//
 }
 return 0;
}

5:Message Map
DECLARE_MESSAGE_MAP
BEGIN_MESSAGE_MAP
ON_COMMAND
END_MESSAGE_MAP

    派生自CWnd的类能够管理一般的windows音讯和COMMAND消息。

结构了一个CMainWindow对象指针,并将其地址复制到了应用程序对象的m_pMainWnd数据成员中,窗口创设现在,InitInstance就能经过CMainWindow指针调用ShowWindow和UpdateWindow函数突显它:

2.动态创设

//在MFC程序中运转线程
AfxBeginThread(MfcThreadProc, lpObject);

本着基类传递,注意CWinThread并不属于音信传递网

    DECLARE_MESSAGE_MAP()

m_pMainWnd->ShowWindow(m_nCmdShow);

将指标的大大小小与成立函数都放到种类型录中,依照他们就足以在运作时创立对象。

  UI线程

图片 2

    BEGIN_MESSAGE_MAP

m_pMainWnd->UpdateWindow();
ShowWindow和UpdateWindow是有着窗口对象共用的CWnd成员函数在那之中囊括CFrameWnd类的目的,CMainWindow正是从CFrameWnd派生出来的.
要从MFC程序调用叁个例行的Windows API函数,必要在函数名称前增多多个大局运算符:: 譬如:::UpdateWindow();
因而转移窗口对象并调用其Create函数,MFC应用程序能够创立三个窗口,在CMyApp::InitInstance中,hello创设了二个CMainWindow对象,CMainWindow的构造函数生成在荧屏上收看的窗口:
Create(NULL,”作者的第三个MFC应用程序”);
CPaintDC dc(this);
MFC的CPaintDC类是从MFC的CDC类派生的,CDC类封装了Windows设备条件,以及含有了绘图到荧屏、打印机和其他设施的几十二个分子函数
在MFC中怎么样管理新闻吧?
在SDK中大家应用的是音讯循环和窗口进程函数对消息举行新闻管理.
在MFC中我们用的是音信映射机制.
上面是将音信映射增加到一个类中要求做的全部职业.
1>通过将DECLARE_MESSAGE_MAP语句增多到类表明中,表明音讯映射.
2>通过放置标记音信的宏来试行新闻映射,相应的类将要对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间管理音信
3>增多成员函数来拍卖新闻
1、构造CWinApp派生类的目的
2、系统调用WinMain()
3、WinMain调用InitInstance,在该函数中创设CFrameWnd派生类对象,调用Create函数创设窗口、调用ShowWindow函数字展现示窗口。
4、之后内部机制调用Run,接受客户的新闻,并将新闻导向默许的管理函数。当接到到WM_QUIT新闻时,Run内部调用ExitInstance,退出程序。
MFC采纳音信映射(Message Map)机制替代C/C++语言中的switch-case结构来拍卖音讯。
新闻映射:在MFC中把音讯管理函数和它所要管理的特定的音讯连接起来的一种机制。
它经过宏来完结消息到成员函数的投射,并且那一个函数不必是设想的积极分子函数,那样不要求为音信映射函数生成三个十分的大的虚构函数表(V表),节省外部存款和储蓄器。
MFC音信映射机制包括一组音讯映射宏。一条消息映射宏把多个Windows消息和其信息管理函数联结起来。
MFC应用程序框架提供了消息映射功用。
在类的落实源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义新闻映射。
在类定义的尾声用DECLARE_MESSAGE_MAP()宏来证明使用消息映射。
Hello的CmainWindow类只管理一种新闻类型—WM_PAINT,由此其消息映射的落到实处如下所示:
BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd);
ON_WM_PAINT()
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP开首了新闻映射,并标志了音讯映射所属的类和该类的基类
END_MESSAGE_MAP()甘休新闻映射.
ON_WM_PAINT()在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间,称做新闻条目款项,在MFC为100各类Window音信提供了宏.
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
afx_msg 醒目地暗中提示OnPaint是多少个音讯管理程序,
DECLARE_MESSAGE_MAP()申明音信映射
MFC把音讯至关心珍视要分为三大类:
(1)、标准Windows消息(WM_XXX)
使用宏:ON_WM_XXX()          特点:有暗中同意的音讯管理函数
(2)、命令新闻:(WM_COMMAND)
发源于菜单、工具条、开关等的音信
使用宏: ON_COMMAND(命令开关标志符ID,音讯处理函数)
本性:由客户钦赐音讯管理函数
3、”Notification音信” (通告音信) 由控件爆发:
BOOL    布尔值,取值为TRUE或者FALSE
BST奥迪Q7     32为字符指针
BYTE      8位整数无符号的
COLOHavalREF     三十二个人数值代表七个颜色值
DWOQX56D    31人整数无符号的
LONG     34个人整数带符号的
LPCTST凯雷德   三13位指针,指向二个常字符串
LPVOID    三贰十人指针,指向贰个为钦赐项指标数据
MFC特有的数据类型:
1>POSITION :八个数值,代表数组恐怕链表中元素的义务,在MFC中常用于数据管理类
2>LPRECT:叁十一个人指针,指向三个不改变的矩形区域结构

有关的宏:DECLARE_DYNCREATE、IMPLEMENT_DYNCREATE,在DECLARE_DYNAMIC基础之上增添了对象大小和开创函数

  创立顾客分界面线程时,必得首先从CWinThread 派生类,并使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏证明此类。

6:Command Routing
WM_COMMAND音讯(其余信息沿基类传递)
CFrameWnd消息:CView/CDocument/CFrameWnd/CWinApp
CView消息:Cview/Cdocument

      ON_COMAMND()

 

本着指向基类的指针搜索

  上面给出了CWinThread类的原型(增添了关于其入眼函数功效和是或不是须要被承继类重载的笺注):

代码推行流程:
AfxWndProc()
AfxCallWndProc()
CWnd::WindowProc()
CFrameWnd::OnCommand()
CWnd::OnCommand()
CFrameWnd::OnCmdMsg()
CFrameWnd::GetActiveView()
CView::OnCmdMsg()
CCmdTarget::OnCmdMsg()
...

    END_MESSAGE()

 

class CWinThread : public CCmdTarget
{
 DECLARE_DYNAMIC(CWinThread)

    这个宏实现了音讯和音讯处理函数的炫丽,不再介绍哦。

3.Persistence机制

 public:
  // Constructors
  CWinThread();
  BOOL CreateThread(DWORD dwCreateFlags = 0, UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

    在BEGIN和END之间除了ON_COMMAND之外,还是能有任何的款型,规范的windows音信并无需大家钦赐管理函数的名称。如:

关系到Document/View结构对文本的读写:Serialize

  // Attributes
  CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd)
  CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd)
  BOOL m_bAutoDelete; // enables 'delete this' after thread termination

   ON_WM_CHAR();WM_CHAR     OnChar

每一个可读可写文件的类都要重写自身的Serailize类,担当协和多少的读写职分,还应当重载<<和>>,将数据倒到archive中(它是与公事缓冲区习习相关的缓冲区)

  // only valid while running
  HANDLE m_hThread; // this thread's HANDLE
  operator HANDLE() const;
  DWORD m_nThreadID; // this thread's ID

   ON_WM_CLOSE();   WM_CLOSE   OnClose

有关的宏:DECLARE_SERIAL、IMPLEMENT_SE凯雷德IAL 将serialize放到类中

  int GetThreadPriority();
  BOOL SetThreadPriority(int nPriority);

   ON_WM_CREATE();  WM_CREATE  OnCreate

 

  // Operations
  DWORD SuspendThread();
  DWORD ResumeThread();
  BOOL PostThreadMessage(UINT message, WPARAM wParam, LPARAM lParam);

这几个宏MFC已经定义好,将规范的音讯和新闻管理函数对应起来。

4.

  // Overridables
  //实行线程实例开头化,必须重写
  virtual BOOL InitInstance();

AFX_DAT,AFX_DATADEF,AFX_MSG_CALL和afx_msg相同近来还未有被使用。

4.1 Message Mapping

  // running and idle processing
  //调整线程的函数,包涵音信泵,一般不重写
  virtual int Run();

    就算具有继续自CCmdTarget的类都得以管理命令音信,都应当有DECLARE_MESSAGE_MAP。。。然则CWinThread却尚未。它不到场音信管理。因而CWinApp在填写音信映射表是就能够跳过CWinThread。

将消息与相应的管理函数对应起来

  //音信调节到TranslateMessage和DispatchMessage在此之前对其开展筛选,
  //日常不重写
  virtual BOOL PreTranslateMessage(MSG* pMsg);

    DECLARE_MESSAGE_MAP(CWinApp,CCmdTarget);

相关宏:DECLARE_MESSAGE_MAP(.h); (.cpp) BEGIN_MESSAGE_MAP  ON_COMMAND()  END_MESSAGE_MAP()

  virtual BOOL PumpMessage(); // low level message pump

   音信映射表有C++多态的含意,不过MFC却从没使用多态来落到实处它,究其原因揣测是多态会导致比非常大的承担。

构建了多个音讯传递网(怎么样创设的??)

  //施行线程特定的搁置时间拍卖,日常不重写
  virtual BOOL OnIdle(LONG lCount); // return TRUE if more idle processing
  virtual BOOL IsIdleMessage(MSG* pMsg); // checks for special messages

    后边的牵线中,以AfxWinProc作为源点,此处MFC仍以此视作早先,但是却省略了无数的底细。平日音讯是在音讯队列中等待窗口抓取,不过MFC安装了钩子,就足以提前抓取或抓取不是团结的音信。那是在享有派生自CWnd的对象创造关键发生的。如:

4.2 Command routing(消息路由)

  //线程终止时推行清除,平常必要重写
  virtual int ExitInstance(); // default will 'delete this'

Bool CWnd::CreateEx()

-Windows消息(WM_)往基类走

  //截获由线程的音信和下令管理程序引发的未管理十分,常常不重写
  virtual LRESULT ProcessWndProcException(CException* e, const MSG* pMsg);

{

-命令WM_COMMAND就不必然

  // Advanced: handling messages sent to message filter hook
  virtual BOOL ProcessMessageFilter(int code, LPMSG lpMsg);

。。。

Run()中的AfxWndProc()是音信泵,最后调用pWnd->WindowProc(),依赖虚函数来落成音信路由

  // Advanced: virtual access to m_pMainWnd
  virtual CWnd* GetMainWnd();

 AfxHookWindowCreate(this);

 

  // Implementation
 public:
  virtual ~CWinThread();
  #ifdef _DEBUG
   virtual void AssertValid() const;
   virtual void Dump(CDumpContext& dc) const;
   int m_nDisablePumpCount; // Diagnostic trap to detect illegal re-entrancy
  #endif
  void CommonConstruct();
  virtual void Delete();
  // 'delete this' only if m_bAutoDelete == TRUE

HWND hWnd=::CreateWindowEx();

  // message pump for Run
  MSG m_msgCur; // current message

...

 public:
  // constructor used by implementation of AfxBeginThread
  CWinThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam);

}

  // valid after construction
  LPVOID m_pThreadParams; // generic parameters passed to starting function
  AFX_THREADPROC m_pfnThreadProc;

AfxHookWindowCreate安装了WH_CBT类型的钩,任何窗口展现以前,注册的钩函数会被调用。

  // set after OLE is initialized
  void (AFXAPI* m_lpfnOleTermOrFreeLib)(BOOL, BOOL);
  COleMessageFilter* m_pMessageFilter;

    细节不再深刻介绍,只要知道以上那个干了些欺上瞒下的劣迹,把注册窗口类时注册的窗口函数,退换为AfxWndProc。于是AfxWndProc就是DispatchMessage的目标地。之所以弄得这么复杂书上实属为了合作什么3D constrols。不懂,权且放那儿吧。记住结论就是了。

 protected:
  CPoint m_ptCursorLast; // last mouse position
  UINT m_nMsgLast; // last mouse message
  BOOL DispatchThreadMessageEx(MSG* msg); // helper
  void DispatchThreadMessage(MSG* msg); // obsolete
};  

地点能够掌握AfxWndProc是新闻的源头,那在前边几张也关乎过。在此函数内部会调用AfxClassWndProc,后面一个会调用pWnd->WindowProc();在全体MFC中装有windowProc的类有CWnd,CControlBar,C奥莱Control,CDialog......具体调用什么人的WindowProc要看pWnd 的品类。

  运营UI线程的AfxBeginThread函数的原型为:

在CWnd::windowProc中会调用OnWndMsg函数,它是用来鉴定识别并拍卖消息的全职机构。假如是命令就交付OnCommand管理,假诺是打招呼音讯就交给OnNotify处理。之所以要分别命令音信和文告音信是因为它们的上行路径实际不是独有的只往父类上去,恐怕有其它路线。而一般的windows讯息却沿着直线上溯。

CWinThread *AfxBeginThread(
 //从CWinThread派生的类的 RUNTIME_CLASS
 CRuntimeClass *pThreadClass, 
 int nPriority = THREAD_PRIORITY_NORMAL, 
 UINT nStackSize = 0, 
 DWORD dwCreateFlags = 0,
 LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
); 

在OnCommand又调用了OnCmdMsg函数。具体调用哪个OnCommand,OnCmdMsg也是不定的,也得看this指针的档案的次序。OnCmdMsg它是特意管理命令新闻的函数。

  大家得以低价地选用VC++ 6.0类向导定义三个卫冕自CWinThread的客户线程类。下边给出发生我们自定义的CWinThread子类CMyUIThread的方法。

bool CFrameWnd::OnCmdMsg(UINT nID,int nCode)

  展开VC++ 6.0类向导,在如下窗口中精选Base Class类为CWinThread,输入子类名称叫CMyUIThread,点击"OK"开关后就发出了类CMyUIThread。

{

其源代码框架为:

本文由必威发布于必威-编程,转载请注明出处:消息会按照这个路线传递下去,1、创建和终止线

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。