深入剖析MFC中对于Windows消息处理、运行机制

mahongxi 2002-04-25 09:18:54
序:本人对Windows系统、MFC谈不上有深入的了解,但对MFC本身包装API的机制很有兴趣,特别是读了候老师的《深入浅出MFC》后,感觉到VISUAL C++的Application FrameWork十分精制[不敢用“完美”一词]。在以前,我对SDI结构处理消息有一定的认识,但对于模式对话框的消息机制不了解,读了《深入》一书也没能得到解决,近日,通过在CSDN上网友的帮助,和查阅MSDN,自认为已经了解。一时兴起,写下这些文字,没有其它目的,只是希望让后来者少走弯路,也希望和我一样喜欢“钻牛角尖”的人共同讨论、学习。如果你是牛人,那么你现在要慎重考虑有没有充足的时间读这些幼稚文字[何出此言?请大家看一下:http://www.csdn.net/expert/topic/13/13451.xml的相关评论]。本文中有些“理论”是我自己胡乱猜测,还请大家指正.[文中内容有些不可避免的会和《深入》一书某些内容重复]。

Windows程序和DOS程序的主要不同点之一是:Windows程序是以事件为驱动、消息机制为基础。如何理解?
举了例子,当你CLICK Windows “开始”BUTTON时,为什么就会弹出一个菜单呢?
当你单击鼠标左键时,操作系统中与MOUSE相关的驱动程序在第一时间内得到这个信号[LBUTTONDOWN],然后它通知操作系统―――“嗨,鼠标左键被单击了!”,操作系统得到这一信号后,马上要判断――用户单击鼠标左键,这是针对哪个窗口呢?如何判断?这很简单!当前状态中,具有焦点的窗口[或控件]就是了[这里当然是“开始”BUTTON了]。然后操作系统马上向这个窗口发送一条消息到这个窗口所在进程的消息队列,消息内容应是消息本身的代号、附加参数、窗口句柄…等等了。那么,只有操作系统才有资格发送消息至某一窗口的消息队列吗?不然,其它程序也有资格。你可以在你的程序中调用:SendMessage 、PostMessage。这样,被单击的窗口得到了一条由操作系统发送的包含CLICK的消息,操作系统已经暂时不再管窗口的任何事,因为它还要忙于处理其它事务。你的程序得到一条消息后如何做呢?Windows对于你在“开始”BUTTON上的单击事件做出如下反映:弹出一菜单。可是,得到消息到做出反映这一过程是如何实现的呢?这就是本文讨论的主要内容[当然只是针对MFC了]。
我首先简要谈一下SDI,然后会花更多文字描述模式对话框。
对于SDI窗口,你的应用程序类的InitInstance()大约如下:
BOOL CEx06aApp::InitInstance()
{ ……………
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CEx06aDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CEx06aView));
AddDocTemplate(pDocTemplate);
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
完成一些如动态生成相关文档、视,显示主框架窗口、处理参数行信息等工作。这些都是显示在你工程中的“明码”。我们现在把断点设置到return TRUE;一句,跟入MFC源码中,看看到底MFC内部做了什么。
程序进入SRC\WinMain.cpp,下一个大动作应是:
nReturnCode = pThread->Run();
各位看官注意了,重点来了。F11进入
int CWinApp::Run()
{
if (m_pMainWnd == NULL && AfxOleGetUserCtrl())
{
// Not launched /Embedding or /Automation, but has no main window!
TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
AfxPostQuitMessage(0);
}
return CWinThread::Run();
}
...全文
174 68 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
yu_wlof 2002-05-17
  • 打赏
  • 举报
回复
我觉得单线程和并列不并列是两个概念,就像你在一个程序中开几个窗口,那他们是什么关系呢,我觉得对于一般窗口windows发的消息是给相关线程的消息队列,而摸态对话框的消息不经过线程的消息队列,windows直接处理
mahongxi 2002-05-12
  • 打赏
  • 举报
回复
lin_rou(东邪) :
我不太懂你的意思。
了解它可能根本算不上一个“好的基础”,但我是把它当成一种兴趣来对待。
我喜欢做它[进行这方面深入“研究”]就像你们编程累了,玩会游戏、踢踢足球一样。而且了解了它,让我信心倍增。
mahongxi 2002-05-12
  • 打赏
  • 举报
回复
To cbwang(小王):
你能肯定它[这篇文章],我很高兴。哪里来的并不重要[只要对你有好处就行]。

我觉得应是从属关系。
模式对话框没有SHOW时,执行父窗口的消息循环,SHOW时进入模式框的消息循环,这个消息循环也可以对模式对话框以外的消息进行处理,当关了它[模式对话框]时,再回到主框架的消息循环。

因我为们的程序是单线程。
QQ:55669753
mahongxi@hotmail.com
xf_abc 2002-05-08
  • 打赏
  • 举报
回复
真不知道该如何学习才好。控件刚学的差不多又来了个com。现在真是搞的我一点信心都没有,可不可以告诉我有没有学习VC 的捷径好不好在这儿我谢谢了。还有看码,学码,用码是这样的学习态度吗?这个体系是不是应该了解的很清楚才可以我真是现在太有点糊涂。
fantong 2002-05-08
  • 打赏
  • 举报
回复
困了
lin_rou 2002-05-07
  • 打赏
  • 举报
回复
浮砂上建起的大厦,有时和好楼也有一拼!!那么对消息机制了解到这个程度也算是打基础吗???
yu_wlof 2002-05-07
  • 打赏
  • 举报
回复
并列de
aleafinwind 2002-05-06
  • 打赏
  • 举报
回复
很喜欢这种钻牛角尖的性格!
希望以后能更多的见到这种深钻技术的文章!
yu_wlof 2002-05-05
  • 打赏
  • 举报
回复
我觉得对话框是由windows窗口管理器直接管理的,他不经过进程的消息循环队列,这才是他门的主要区别,我觉得好像windows直接从系统队列中抽取消息直接发给对话框,不知道是不是
chenanqiong 2002-05-04
  • 打赏
  • 举报
回复
还好啊
qhq800 2002-05-03
  • 打赏
  • 举报
回复
study
mahongxi 2002-05-02
  • 打赏
  • 举报
回复
To xunknown(未知数):
Thanks.My Pleasure.
footway 2002-05-02
  • 打赏
  • 举报
回复
模态对话框时父窗口disable了吗?好象不应该说成disable
xunknown 2002-05-01
  • 打赏
  • 举报
回复
楼长的文章很棒!
你的理解也许能够给我灵感~
谢谢~!
期待你发表更多的见解!~
yinx 2002-04-30
  • 打赏
  • 举报
回复
“钻牛角尖”我喜欢
Kill_EM_All 2002-04-30
  • 打赏
  • 举报
回复

好累
Q_O 2002-04-29
  • 打赏
  • 举报
回复
泛泛而谈。不够深入。
mahongxi 2002-04-29
  • 打赏
  • 举报
回复
quchunyu(春雨) :
我知道MFC现在已经不用真正的模态对话框了,一切都是非模态的。

我想我已经在文中体现出这点了:
"模式对话框和非模式对话框都是通过调用CreateDialogIndirect()产生创建对话框.那它和非模式对话框区别是什么造成的呢?"

但它现在总是还叫“模态对话框”吧,我也不能叫它“假模态对话框”。

我只是看过一些纯API的CODE,但自己从来没有写过,我觉得有了MFC,我就没这个需要了[只是对我自已来说,“没人嫌机器作的馒头不好吃”].当然了,想深入了解MFC,没有很强的API基础是不行了。

我一开始就说了,我是BEGINNER。希望你们多多指导,最好能描述得更细一些。
huiyue01 2002-04-29
  • 打赏
  • 举报
回复
很厉害!不过把MFC弄的这么透的程序员不多!象我就还的学习了?!
st_2000 2002-04-29
  • 打赏
  • 举报
回复
STUDY U
加载更多回复(48)

16,548

社区成员

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

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

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