基于MFC的框的程序

MFC是打了包的,很多源代码都不可见。
在Win32SDK中,创建一个应用窗口的步骤:

1.写WinMain函数(利用MSDN其中包括设计,注册等)

2.写过程函数:在MFC中,一切在建立向导时由系统自动生成,但仍按照Win32SDK中的步骤。

MFC的执行过程(注:由于是单文档SDI,系统先注册在创建):
创建对象->构造函数->WinMain->WinMain中的InitInstance(初始化)->子类InitInstance->注册窗口(AfxEndDeferRegisterClass)->Createwindow(创建)->显示->更新。。。。。

一.MFC 程序产生过程:
1.在MFC中,程序一开始并不从WinMain函数开始,设文件名为Test,通过设置断点可以知道程序一开始执行CTestApp theApp(定义全局变量),然后执行CTestApp的构造函数,最后到WinMain函数中。而CTestApp类是从CWinApp类派生而来,由派生的关系程序必然去执行CWinApp的构造函数。


A.CWinApp在SRC文件夹下的APPCORE中
   CWinApp::CWinApp(LPCTSTR lpszAppName)// CWinApp的构造函数是带默认参数的构造函数
   {
if (lpszAppName != NULL)
    m_pszAppName = _tcsdup(lpszAppName);
else
    m_pszAppName = NULL;
//以下为初始化
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ASSERT(AfxGetThread() == NULL);
pThreadState->m_pCurrentWinThread = this;//此this指针指向派生类CTestApp(继承原理)
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId(); 
        。。。。。。。。。。。。。
在构造函数调用结束后程序进入WinMain函数

B.WinMain函数在APPMODUL.CPP中

extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,//_tWinMain为宏定义
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain/*关键*/(hInstance, hPrevInstance, lpCmdLine, nCmdShow);//Afx前缀表明属于应用

 //程序框架

}


AfxWinMain在文件WINMAIN.cpp中。
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
利用三个完成了窗口的创建(如设计,注册....)
}

2.InitInstance(进行初始化)
  在CTestApp中有构造函数Initlnstance()   
  BOOL CMy11App::InitInstance()//在CTestApp中
  在AfxWinMain中有一个指针CWinThread* pThread = AfxGetThread();
  其中有if (!pThread->InitInstance())// 此InitInstance为虚函数,由多态性原理,因此此指针指向继承类TestApp   的InitInstance。


3.MFC中窗口的注册

    有于使用的是单文本,与Win32SDK不同,最先是注册窗口,利用的函数是AfxEndDeferRegisterClass在SRC文件夹下的WINCORE中,然后才是设计.(其实系统以设定好,只需要我们去注册)系统根据我们程序选择相应的注册.
BOOL AFXAPI AfxEndDeferRegisterClass(LONG fToRegister)
{......}


根据我们程序的不同,注册的类也不同.
在注册窗口时使用AfxRegisterClass,作用是获取类的信息。检测是否已注册,若没有注册则自动注册.

4.PreCreateWindow(会反复使用)
   在创建窗口时需要预先构建窗口类的名字,CMainFram是一个窗口类,其中有一个PreCreateWindow.
在PreCreateWindow中有 

if( !CFrameWnd::PreCreateWindow(cs) ).//其实就是调用基类.
CFrameWnd::PreCreateWindow在WinFrm.cpp中,作用是检测当前类是否注册,未注册则自动注册.//AfxDeferRegisterClass的作用


AfxDeferRegisterClass为AfxEndDeferRegisterClass的宏.


5.创建窗口CreateWindow
   创建窗口是利用CreateWindow.
   在WINCORE.cpp中有 BOOl CWnd::CreateEx(),该函数由WINFRM.cpp中的BOOl CFrameWnd ::Create()调用.
   在CreateExz中又再次调用PreCreatewindow作用:方便修改外观 
   当执行 Test.cpp中的ProcessShellCommand(cmdInfo)后,窗口创建完成.

6.显示窗口,更新窗口.
   在Test.cpp中 m_pMainWnd->ShowWindow(SW_SHOW);//显示
                m_pMainWnd->UpdateWindow();//更新
7.消息循环.
CWinThread::Run,在THRDCORE.CPP中.
   int CWinThread::Run()
   {...}中有个do while 循环,循环中使用了PumpMessage(),
   BOOL CWinThread::PumpMessage(){....}//完成消息循环的处理.其中包含了TranslateMessage,DispatchMessage

8.窗口过程函数
在AfxEndAfxEndDeferRegisterClass中定义了窗口过程函数,但是默认为缺省.
二.CTestView,CMainFrame,CTestDoc类的连接
在CTestApp的InitInstance下有
        {

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame),     
RUNTIME_CLASS(CTestView));

}//通过单文档模板将其组织在一起



转自:http://hi.baidu.com/mvxrbhenvybbsuq/item/ff3349976233d3c9b72531be


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值