谁看懂过MFC启动部分的。给我解释解释好不好。

KissXYL 2005-02-02 03:45:03
一个“什么都不作的MFC程序”的启动过程分析如下:
1。声明全局变量theApp此实例名是规定的,但类是用户写的。继承自WinApp
2。执行用户类的构造函数,构造函数里。


SetRegistryKey(_T("Local AppWizard-Generated Applications")); //什么意思,做什么的?

LoadStdProfileSettings();//这个读取的是配置么?配置在哪
// Load standard INI file options (including MRU) 这个不明白


CSingleDocTemplate* pDocTemplate;//生成默认模板,按照单文档模板生成

//使用构造函数,按构造函数的参数,传递:菜单,文档类,框架类,主视图类
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,//菜单
RUNTIME_CLASS(CTestEnumDoc),//文档类,如果多个怎么办?
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTestEnumView));//视图类,多个视图类呢?
//用的时候再看具体的调用和生成的生存期是么?

AddDocTemplate(pDocTemplate);//不懂,是个虚函数,我只管找也没找到函数体,可能应藏在Target类里了。反正看不到。这句什么意思?什么作用?

//运行参数
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo)) return FALSE; //不许不要参数,没参数就退出?



m_pMainWnd->ShowWindow(SW_SHOW);//显示模式,最小化,最大化,隐藏……
m_pMainWnd->UpdateWindow();//更新显示

return TRUE;//结束构造函数,进入连接的WinMain


之后,应该是被隐藏了的WinMain执行,这里执行似乎就到了我看书的尽头。因为WinMain里包含了消息循环,那么之后呢?程序运行到哪里去了?执行什么了?(似乎是个愚蠢的问题)
//自我理解:进入消息循环后,就不用逐句的按过程化的思路去读程序了。是看可能。比如,被遮挡,就会系统给我们的程序发送“无效”的函数,使程序需要执行OnDraw(),如果单击…… 等所有的执行顺序就不一定了。就看收到消息的顺序了。只要对可能的消息写好响应和相关代码了。


各位给我解答一下我上面没有理解的,和我理解对不对?感谢帮助我的高手和关心我学习的你。
...全文
127 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
KissXYL 2005-02-02
  • 打赏
  • 举报
回复
多谢各位。清楚一些了。我继续理解理解
iamknight 2005-02-02
  • 打赏
  • 举报
回复
跟踪执行,查看一下堆栈信息你就知道整个执行过程了。
eightbao 2005-02-02
  • 打赏
  • 举报
回复
oh...大大们的手真快....
eightbao 2005-02-02
  • 打赏
  • 举报
回复
“之后,应该是被隐藏了的WinMain执行”错!
源码:
APPMODUL.CPP Ln24:
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}

WINMAIN.CPP Ln21:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
...
CWinApp* pApp = AfxGetApp();

// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;

// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;

// Perform specific initializations
if (!pThread->InitInstance()) //<---这就是你看的那个函数
{
...
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();

InitFailure:
...
AfxWinTerm();
return nReturnCode;
}
建议你去仔细看jjHou的《深入浅出MFC》
吹泡泡的小猫 2005-02-02
  • 打赏
  • 举报
回复
最早还是从_tWinMain开始的,_tWinMain调用AfxWinMain,

int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);

int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();

// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;

// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;

// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd\n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();

InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("Warning: Temp map lock count non-zero (%ld).\n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif

AfxWinTerm();
return nReturnCode;
}

很简单吧,这就是为什么要把启动代码放在CWinApp::InitInstance中的原因了
42252343 2005-02-02
  • 打赏
  • 举报
回复
哎 敲累了
消息循环在CWinThread

被遮挡
程序发送“无效”的函数
是产生无效区域用Invalidate函数产生WM_PAINT消息 进行重画 响应函数是OnPaint 不是OnDraw()
OnDraw()是文档类用的

消息的传递顺序是从派生类到基类 一个WM_COMMAND消息是先从视图类->文档->框架类最后到那儿了??我也不大清楚 哈哈 应该是CWinThread 中去了吧

我不是高手也是初学 大家交流交流 不知道那地方有没有说错 那位高手帮忙看看
42252343 2005-02-02
  • 打赏
  • 举报
回复
SetRegistryKey 写注册表的 程序初始化时候用到 比如你把窗体移动到左下角关掉 你下次打开的时候还想程序出现在那里就必须用这个 不过这个函数只是刚开始 后面还要写很多

),//文档类,如果多个怎么办?
好象有且只有一个Doc的派生类与框架类关联吧

));//视图类,多个视图类呢?
如果是多视图 用RUNTIME_CLASS(CChildFrame)改框架类型 CTestEnumView不变

//用的时候再看具体的调用和生成的生存期是么?
不懂 RUNTIME_CLASS作用是类的类型识别

AddDocTemplate 不是虚函数 既然新建一个文档摸板 当然还加入啊 用侯老大一句话就是 把他们粘在一起

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧