MFC程序的生死过程Word下载.docx

上传人:b****5 文档编号:16340154 上传时间:2022-11-23 格式:DOCX 页数:9 大小:18.42KB
下载 相关 举报
MFC程序的生死过程Word下载.docx_第1页
第1页 / 共9页
MFC程序的生死过程Word下载.docx_第2页
第2页 / 共9页
MFC程序的生死过程Word下载.docx_第3页
第3页 / 共9页
MFC程序的生死过程Word下载.docx_第4页
第4页 / 共9页
MFC程序的生死过程Word下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

MFC程序的生死过程Word下载.docx

《MFC程序的生死过程Word下载.docx》由会员分享,可在线阅读,更多相关《MFC程序的生死过程Word下载.docx(9页珍藏版)》请在冰豆网上搜索。

MFC程序的生死过程Word下载.docx

AfxWinInit:

是继CWinApp构造函数之后的第一个操作;

此后的操作是pApp->

InitApplication(其中的pApp指向CMyWinApp对象,即本例中的theApp),因为CMyWinApp继承自CWinApp,而InitApplication又是CWinApp的一个虚拟函数,我们没有改写它(大部分情况下也不需要改它),所以上述操作相当于调用CWinApp:

InitApplication。

此程序的代码出现在APPCORE.CPP中;

继InitApplication之后,AfxWinMain调用pApp->

InitInstance,InitInstance是CWinApp的一个虚拟函数(应用程序一定要改写这个函数,因为它在CWinApp中是个空函数,没有任何默任操作),我们改写了它,所以上述操作就是调有我们自己的这个InitInstance函数,我们将在该处展开我们的主窗口生命。

CMyWinApp:

InitInstance一开始new了一个CMyFrameWnd对象,new会引发构造函数CmyFrameWnd:

CMyFrameWnd,其中调用了CFrameWnd的成员函数Create,它将产生一个窗口。

Create函数共八个参数,第一个,指定WNDCLASS窗口类,如果放置NULL,表示要以MFC内建的窗口类产生一个标准的外框窗口(Create函数在产生窗口之前会引发窗口类的注册操作,下一段讲述这一内容);

第二个,指定窗口标题;

第三个,指定窗口风格,默认是WS-OVERLAPPEDWINDOW,如果你不想要窗口右上角的极大极小钮,可以改成WS-OVERLAPPED|WS-CAPTION|WS-SYSMENU|WS-THICKFRAME|WS-MINIMIZEBOX|WS-MAXIMIZEBOX,如果希望有垂直滚动条,再加上WS-VSCROLL;

第四个参数,指定窗口的位置与大小,默认值rectDefault;

第五个,指定父窗口,第六个指定菜单;

第七个,为扩充风格,唯有以:

CreateWindowEx(而非:

CreateWindow)函数才能完成,事实上,CFrameWnd:

Create最终调用的正是:

CreateWindowEx;

第八个,是一个指向CCreateContext结构的指针,framework利用它,在具备Document/View结构的程序中初始化外框窗口,默认值NULL

CFrameWnd:

Create在函数中调用CreateEx(CWnd有这个成员函数,但其派生类CFrameWnd并没有,所以这里调用的实际上是CWnd:

CreateEx);

后者又调用PreCreateWindow虚拟函数(它在CWnd及其派生类CFrameWnd都有定义,所以实际上调用的是CFrameWnd:

PreCreateWindow),这个函数调用了AfxDeferRegisterClass宏,它表示如果变量afxRegisteredClass的值显示系统已经注册了fClass这种窗口类,MFC啥也不做,否则就调用AfxEndDeferRegisterClass(fClass){它调用两个函数完成实际的窗口类注册操作,一个是RegisterWithIcon,一个是AfxRegisterClass},准备注册之。

窗口显示与更新

CMyFrameWnd:

CMyFrameWnd结束后,窗口已经诞生出来;

程序又回到CMyWinApp:

InitInstance,于是调用ShowWindow函数令窗口显示出来,并调用UpdateWindow函数令Hello程序送出WM-PAINT

CWinApp:

Run----程序生命的活水源头

Run又是CWinApp的一个虚拟函数,我们没有改写它(大部分情况下也不需要改它),所以上述操作相当于调用CWinApp:

Run

WinMain已由MFC提供,窗口类已由MFC注册完成,连窗口函数也都由MFC提供

把消息与处理函数连接在一起:

MessageMap机制

MFC提供给应用程序使用的“很方便的接口”是两组宏,以Hello为例,第一个操作是在Hello.h的CMyFrameWnd加上DECLARE-MESSAGE-MAP;

第二个操作是在Hello.cpp的任何位置(当然不能在函数内)使用宏

BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)

ON_COMMAND(IDM_ABOUT,OnAbout)

ON_WM_PAINT()

END_MESSAGE_MAP()

来龙去脉总整理

程序的诞生

Applicationobject产生,内存于是获得配置,初值亦设立了。

AfxWinMain执行AfxWinInit,后者又调有AfxInitThread,把消息队列尽量加

大到96

AfxWinMain执行InitApplication。

这是CWinApp的虚拟函数,我们通常不改写它

AfxWinMain执行InitInstance。

这是CWinApp的虚拟函数,我们必须改写它

InitInstance“new”了一个CMyFrameWnd对象

CmyFrameWnd构造函数调用Create,产生主窗口。

我们在Create参数中指定的窗口类是NULL,于是MFC根据窗口种类,自行为我们注册一个名为“AfxFrameOrView42d”的窗口类。

回到InitInstance中继续执行ShowWindow,显示窗口

执行UpdateWindow,于是发出WM-PAINT

回到AfxWinMain,执行Run,进入消息循环。

程序开始运行:

程序获得WM-PAINT消息(由CWinApp:

Run中的:

GetMessage循环)

WM-PAINT经由:

DispatchMessage送到窗口函数CWnd:

:

DefWindowProc中。

CWnd:

DefWindowProc将消息传递到消息映射表格

传递过程中发现有相符项目,于是调用项目中对应的函数。

此函数是利用BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏设立起来的。

标准消息的处理程序亦有标准命名,例如WM-PAINT必由OnPaint处理

程序的死亡:

使用者单击File/Close,于是发出WM-CLOSE

CMyFrameWnd并没有设置WM-CLOSE处理程序,于是交给默认的处理程序

默认函数对于WM-CLOSE的处理方式是调用:

DestroyWindow,并因而发出WM-DESTROY

默认的WM-DESTROY处理方式是调用:

PostQuitMessage,因此发出WM-QUIT

CWinApp:

Run收到WM-QUIT后会结束内部之消息循环,然后调用ExitInstance,这是CWinApp的一个虚拟函数;

如果CMyWinApp改写了ExitInstance,那么CWinApp:

Run所调用的就是CMyWinApp:

ExitInstance,否则就是CWinApp:

ExitInstance

最后回到AfxWinMain,执行AfxWinTerm,结束程序

附Hello程序部分代码:

Hello.cpp

#include"

Stdafx.h"

Hello.h"

Resource.h"

CMyWinApptheApp;

//applicationobject

//--------------------------------------------------------------------

//CMyWinApp'

smember

BOOLCMyWinApp:

InitInstance()

{

m_pMainWnd=newCMyFrameWnd();

m_pMainWnd->

ShowWindow(m_nCmdShow);

UpdateWindow();

returnTRUE;

}

OnIdle(LONGlCount)

CMyFrameWnd*pWnd=(CMyFrameWnd*)m_pMainWnd;

pWnd->

IdleTimeHandler(lCount);

//CMyFrameWnd'

CMyFrameWnd:

CMyFrameWnd()

Create(NULL,"

HelloMFC"

WS_OVERLAPPEDWINDOW,rectDefault,

NULL,"

MainMenu"

);

}

voidCMyFrameWnd:

OnPaint()

CPaintDCdc(this);

CRectrect;

GetClientRect(rect);

dc.SetTextAlign(TA_BOTTOM|TA_CENTER);

:

LineDDA(rect.right/2,0,rect.right/2,rect.bottom/2,

(LINEDDAPROC)LineDDACallback,(LPARAM)(LPVOID)&

dc);

VOIDCALLBACKCMyFrameWnd:

LineDDACallback(intx,inty,LPARAMlpdc)

staticcharszText[]="

Hello,MFC"

;

((CDC*)lpdc)->

TextOut(x,y,szText,sizeof(szText)-1);

for(inti=1;

i<

50000;

i++);

OnAbout()

CDialogabout("

AboutBox"

this);

//"

about.DoModal();

IdleTimeHandler(LONGlCount)

CStringstr;

CRectrect(10,10,200,30);

CDC*pDC=newCClientDC(this);

str.Format("

%010d"

lCount);

pDC->

DrawText(str,&

rect,DT_LEFT|DT_TOP);

Hello.h

classCMyWinApp:

publicCWinApp

public:

virtualBOOLInitInstance();

//

virtualBOOLOnIdle(LONGlCount);

//OnIdlee

};

classCMyFrameWnd:

publicCFrameWnd

CMyFrameWnd();

//constructor

afx_msgvoidOnPaint();

//forWM_PAINT

afx_msgvoidOnAbout();

//forWM_COMMAND(IDM_ABOUT)

voidIdleTimeHandler(LONGlCount);

//wewantitcallbyCMyWinApp:

OnIdle

private:

DECLARE_MESSAGE_MAP() 

//DeclareMessageMap

staticVOIDCALLBACKLineDDACallback(int,int,LPARAM);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1