学习孙鑫的《VC深入详解》遇到的一个拦路虎解决思路

学习孙鑫的《VC深入详解》遇到的一个拦路虎
很多人都说是从孙鑫的《VC深入详解》入门VC的,可是我看了个开头,却觉得这本书实在不怎么样。很多问题说得不清不楚。

比如说在第三章,用MFC AppWizard自动生成了一个程序。然后分析这个程序的运行脉胳。一开始还看得懂,但是到了后来则完全胡涂了。

我理一下我自己的思路,并说出我的疑问,请高手指点迷津。

一开始看得懂,说什么winmain函数在某个文件中,在链接时才被链接到程序中,再看这个_tWinMain,原来是个宏,展开后就是WinMain,然后WinMain函数又调用AfxWinMain函数,而AfxWinMain函数里面有这样一条语句:(在76页)

   if (!pThread->InitInstance())

这一句大概就是调用应用程序对象的InitInstance()函数,说注册窗口,创建窗口和显示窗口都是在这个程序里进行的,好的,进入这个程序,又看到这样一段:

    CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestView));
AddDocTemplate(pDocTemplate);

我不太清楚RUNTIME_CLASS是什么意思,书上也没有解释。这一段就是注册和创建窗口的代码吗?再往下看是:

// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;

// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

return TRUE;

看看,到了m_pMainWnd->ShowWindow(SW_SHOW);这一句就是显示窗口了,那注册窗口在哪里?就是上面的几个RUNTIME_CLASS语句吗?

再往下看,在书的78页末尾,说窗口类的注册是由AfxEndDeferRegisterClass函数完成的,然后罗里罗嗦说了一大堆,然后说它调用AfxRegisterClass函数注册窗口类,又说了一大堆,然后又说它调用RegisterClass函数注册窗口类。

那么,问题就来了:最初的AfxEndDeferRegisterClass函数又是谁来调用的呢?应用程序对象里没有找到注册窗口类和创建窗口的语句,而这里冒出的注册窗口类的语句又不知在什么地方调用的。本来好好的脉胳,在这里断了。

一本好的书,应该脉胳清晰,似乎可能繁,因为本来程序就繁嘛,任何书都回避不了这个问题,但一定要叙述清晰。可是孙鑫的《VC深入详解》似乎在脉胳清晰上做得很不好。


请高手指点迷津,窗口类的注册是在应用程序类对象的InitInstance()函数里吗?具体是哪一条语句?后来怎么又转到了用AfxEndDeferRegisterClass函数来注册窗口类的?

谢谢!


------解决方案--------------------
RUNTIME_CLASS是MFC的动态类型识别。如果你想搞清楚MFC框架脉络,建议你看侯俊杰的《深入浅出MFC》。《VC深入详解》还是看跟书配套的视频跟好一些,这本书更重应用,你帮你学会如何使用vc