打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
win32编程(2):消息循环和窗口机制
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程序员必须掌握的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
防止死循环
Windows消息机制
windows消息机制
Windows 消息机制浅析
Windows消息传递机制详解
win7 版 net send 命令 MSG使用详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服