什么是GUI?

我最开始接触编程是从QBasic开始的,那个时候就是在Dos下跑,因为眼光以及眼界的局限性,我一直以后编程就是写好的算法,那个时候连数据结构都没有听说过,真是孤陋寡闻的厉害啊。后来学习了C++,但也是在TC下编写的代码,编写的也是控制台程序,所以后来对Windows程序感觉特别神奇,这些按钮,菜单是怎么来的?突然之间感觉好茫然,不知道是怎么回事了? 不管是多么的惊讶和茫然,我也必须冷静下来,慢慢分析这个里边的逻辑。 有几个问题首先冒了出来,界面是怎么出来的?鼠标键盘这些操作怎么得到响应的? 从根本上来说,屏幕就是屏幕,就是一个显示绘制的的东西,那么屏幕上那绚丽的表现一定是由软件决定了,既然软件决定也就是相当于软件来决定显示器什么位置绘制哪些内容。所以,从根本上来说,界面只是绘制在屏幕上的一种表现形式罢了。那么,用户的鼠标、键盘又是如何与程序交互呢?首先必须有东西能够记录当前鼠标位置处于哪个界面上,这样才能将这个操作告诉对应的界面,然后让其进行处理,其次还必须能够记录当前活动的窗体时哪个,这样键盘的操作才能被送给对应的界面去处理。 那么有了用户操作的动作,谁来调用对应的执行呢?操作系统吗?不现实,如果每个事件都有操作系统调用对应响应处理函数,操作系统估计要死了的,所以还是应该由程序自己来执行,当一个事件发生以后,操作系统根据窗口信息,将这个事件插入到每个程序对应的事件列表中,而每个程序都至少有一个地方在不停地循环获取事件,处理事件。 上边说,一个程序只需要一个获取事件、处理事件的地方,如果在一个子线程中也含有不断获取事件,处理事件的代码,会有什么问题吗? 我创建了一个Win32工程,屏蔽了主函数也就是主线程中的消息获取函数,而启动了一个线程来进行消息获取、分配处理,但结果是应用程序没有了响应,这很充分说明发送给每个窗体的消息并不是插入到了程序事件队列,而是或逻辑上是插入到了线程事件队列中,从实际的存储来看,应该是所有程序事件都在一个区域内,但事件上标识有线程信息,所以只有对应的线程才能获取到相应的事件。 这次我在主线程里创建了一个窗体,在子线程里创建一个同样的窗体,如果主线程不进行事件处理,那么有一个窗体就是没有响应的,应该这个就是主线程里创建的那个窗体,而主线程与子线程同时启动事件处理,则两个窗体都有了响应。

 

 

MFC中的DoModal有什么特别?

 

对于DoModal我们最直接的感受就是,除了当前对话框界面,所有界面都不能操作了,我这里考虑的不是这种不容许其它界面激活的方法是如何做到的,我关心的是一子线程在进行了一个对话框DoModal操作后,这个对话框有响应吗?事实证明,是有响应的,这说明了什么?因为子线程没有消息处理函数,本来这个对话框应该接收不到消息,但为什么有了响应,只有一个解释,那就是DoModal的时候,里边启动了一个消息获取分配处理的模块。

 

 

线程之间如何进行消息传递?

 

当前这个线程有些事情需要通知另一个线程,如何做?最简单的,我设定一个全局的变量来标识是否有通知,被接收线程不停对该变量进行查询,一旦查询成功,则执行对应操作,但这样被接收线程需要不停地对标识符进行判断,这个方法看上去就不怎么好。还有其它方法吗?有,那就是向目标线程发送消息,Windows通过PostThreadMessage这个函数来向目标线程发送消息,目标线程只要建立对应的消息处理函数即可,这个方案至少看起来更符合Windows的脾气。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值