消息队列的执行顺序到底是如何样的?请达人解释下

消息队列的执行顺序到底是怎么样的???,请达人解释下
在一个windows程序中,一般都是有一个类似
while   (GetMessage(&msg,   NULL,   0,   0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
的操作,而MSDN中对DispatchMessage的说明是
The   return   value   specifies   the   value   returned   by   the   window   procedure.   Although   its   meaning   depends   on   the   message   being   dispatched,   the   return   value   generally   is   ignored.
按我的理解是它必须处理完一个消息后,它才能继续下一个消息,可是我在窗口处理函数中的一个消息中(我是在WM_LBUTTONDOWN中)加了一句MessageBox后,情况就不大对了,在我还没结束MessageBox后,它就能处理下一个函数
请高人解答下,这到底是怎么一回事呢
我的一个类似问题
http://community.csdn.net/Expert/topic/5640/5640190.xml?temp=.3816339

------解决方案--------------------
这个是当然的,消息确实是排队的,但是并非是阻塞的,消息处理函数是不停地被调用,不停地从队列里取得优先级最高或排在最前的消息进行并发处理

银行排队取钱,有取号排队,然后按号操作的例子
------解决方案--------------------
mfc168(子非鱼) ( )
银行排队取钱,有取号排队,然后按号操作的例子
//------------

这个解释很清楚了
------解决方案--------------------
一个程序里可以不只一个While(GetMessage(...))的Message Pump
你的主线程 "阻塞 "在while(GetMessage(...))里面了,OK, no big deal, 因为在你调用的::MessageBox或DoModal中会有一个类似作用的Message Pump来代替它的工作,
我给 "阻塞 "加引号的意思就是,这里并不是真正意义上的阻塞
其实你再看简单点,我给你这样写
while (...)
{
// do something...

// Call MethodA
MethodA(); // a

while (...)
{
MethodA(); // b
}
}
a 点和 b点都是可以调用MethodA的,所以就不存在真正的阻塞了

当然,由于线程的原因,这个例子不是很恰当,但应该可以让你更好地理解了