win32编程最需要理解的是其GUI的编程,其它都是很好理解的函数调用。win32GUI编程最基本的概念是所谓的消息循环,我们编写一个c程序,执行完了就退出了,为什么windows程序会一直悬在哪里呢?这是我开始学编程的时候不理解的。
其实,windows操作系统就好比一个饭馆,每个应用程序就好像一个顾客,进入饭馆点了菜(调用GetMessage函数,该函数没有消息便不会返回),顾客就悬在那儿等饭菜(windows上叫消息)了,这时候事儿是饭馆在做。消息放哪儿呢?每个人在饭馆都一张桌子,饭菜来了放在桌子上,消息也是如此,放在windows为每个应用程序自动建立的一个消息队列上,等各种饭菜吃完了后(处理各种收到的消息,程序的做要代码在此),便可以结帐走人,也就是退出程序了。
通常的消息循环如下:
for(;;)
{
while(bDoIdle &&!::PeekMessage(&m_msg, NULL, 0, 0,PM_NOREMOVE))
{
if(!OnIdle(nIdleCount++))
bDoIdle = FALSE;
}
bRet = ::GetMessage(&m_msg, NULL, 0, 0);
if(bRet == -1)
{
ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1(error)\n"));
continue; // error, don't process
}
else if(!bRet)
{
ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run -exiting\n"));
break; // WM_QUIT, exit message loop
}
if(!PreTranslateMessage(&m_msg))
{
::TranslateMessage(&m_msg);
::DispatchMessage(&m_msg);
}
if(IsIdleMessage(&m_msg))
{
bDoIdle = TRUE;
nIdleCount = 0;
}
}
剩下的就是win32的窗口机制,用户在使用时看到的是一个个的窗口,窗口是win32程序输入输出的界面。但是win32程序员看到的不仅如此,首先,物以类聚,人以群分,win32api在窗口之上有个窗口类的概念,任何窗口都是该窗口类的一个实例。类似于OOP里类和对象的关系。每个窗口类有一个窗口过程,是你写的一个被消息系统回调的函数,用来处理窗口接受到的消息。win32程序在建立完消息循环之后,就是创建窗口类和窗口来和用户交互。
窗口和消息循环紧密相关,因为绝大多数消息都是以窗口作为区分目标的。比如wm_size,意思是某个窗口,用户用鼠标调整了你的size,这时候你用你注册的那个窗口过程接收到这个消息,可以做你应用程序逻辑上要处理的事情。
窗口是win32GUI最基础的部件,之后,如果你用spy++这样的软件去观察,就会发现,大窗口内每一个控件,比如下拉菜单,和输入框都是一个独立的小窗口,这就牵涉到了窗口机制另一个部分,窗口的关系,就像积木一样,窗口和窗口也可以结合起来组成更庞大的界面。窗口之间可以不相干,也可以结合成父子关系,父子关系在界面上显示看到的就是父窗口的移动,会伴随子窗口的移动等等,这种父子关系程序员一旦确立之后,很多行为都是系统来控制的,比如上文提到的同时移动。
总之,消息循环和窗口机制是win32 GUI编程最核心的两个概念,对这概念周围的理解,是每个win32GUI程序员必须掌握的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。