zoukankan      html  css  js  c++  java
  • GUI应用编程初体验

    不同平台的GUI实现原理是一样的。 本实验基于 windos平台。

    先捋一捋概念

    什么是消息队列(Message Queue)

    假 设一个场景:系统正在处理WM_PAINT消息,就在这时用户在键盘上敲击了一些按键,这时会发生什么呢?系统应该中断绘图操作然后处理按键消息还是应该 丢弃按键的消息?很明显这些都是不合理的,因此我们引入了消息队列,当消息发送过来,将消息加入消息队列,当一个消息被处理时,将其从消息队列移除。这样 确保消息不会丢失,当你正在处理一个消息时,其它到来的消息可以加入到消息队列直到被处理。

    什么是消息循环(Message Loop)

    while(GetMessage(&Msg, NULL, 0, 0) > 0) 

        TranslateMessage(&Msg); 
        DispatchMessage(&Msg); 


    上面代码的执行过程为:
    1. 消息循环调用GetMessage()从消息队列中查找消息进行处理,如果消息队列为空,程序将停止执行并等待(程序阻塞)。
    2. 事件发生时导致一个消息加入到消息队列(例如系统注册了一个鼠标点击事件),GetMessage()将返回一个正值,这表明有消息需要被处理,并且消息已经填充到传入的MSG参数中;当传入WM_QUIT消息时返回0;如果返回值为负表明发生了错误。
    3. 取出消息(在Msg变量中)并将其传递给TranslateMessage()函数,这个函数做一些额外的处理:将虚拟键值信息转换为字符信息。这一步实际上是可选的,但有些地方需要用到这一步。
    4. 上面的步骤执行完后,将消息传递给DispatchMessage()函数。DispatchMessage()函数将消息分发到消息的目标窗口,并且查找目标窗口过程函数,给窗口过程函数传递窗口句柄、消息、wParam、lParam等参数然后调用该函数。
    5. 在窗口过程函数中,检查消息和其他参数,你可以用它来实现你想要的操作。如果不想处理某些特殊的消息,你应该总是调用DefWindowProc()函数,系统将按按默认的方式处理这些消息(通常认为是不做任何操作)。
    6. 一旦一个消息处理完成,窗口过程函数返回,DispatchMessage()函数返回,继续循环处理下一个消息。

    消 息循环对Windows编程来说是一个非常重要的概念。窗口过程函数并不是系统自动调用的,而是由开发人员自己通过调用 DispatchMessage()间接的调用的。

    代码可以看出,程序的大部分时间都在处理消息循环。窗 口会不断的处理发过来的消息,但如果要退出程序该怎么做呢?因为我们用的是while()循环,如果GetMessage()返回的是FALSE(即0) 会退出循环,程序能够执行到WinMain()结束处,即程序退出:这正是PostQuitMessage()函数完成的工作,该函数会将WM_QUIT 消息添加到消息队列的队尾,GetMessage()从消息队列取出WM_QUIT消息,填充Msg结构,返回的不是正数,而是0。与此同时,结构Msg 的成员wParam的值会被置为你传给PostQuitMessage()函数参数的值,你可以选择忽略它或做为WinMain()函数的返回值即进程的 退出代码(Exit Code)。

    注意:如果发生错误,GetMessage()函数将返回-1。你应该记住这点,说不定你的程序会因此 出错。尽管GetMessage()返回值位BOOL型,但它可以返回TRUE或FALSE之外的值,因为BOOL被定义成UINT(unsigned int)。下面的程序貌似能正常工作,但有些时候不能正常工作。

    while(GetMessage(&Msg, NULL, 0, 0)) 

    while(GetMessage(&Msg, NULL, 0, 0) != 0) 

    while(GetMessage(&Msg, NULL, 0, 0) == TRUE)


    上面的代码都是错误的!有些程序中你会看到会使用第一中方式,使用这种方式你必须保证GetMessage()总是执行成功,否则应该使用下面这段代码:

    while(GetMessage(&Msg, NULL, 0, 0) > 0)


    希望你对Windows消息循环能有很好的理解,如果还没有,慢慢来,在使用过程中会逐渐理解的。

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    Tomcat下HTTPS双向认证配置以及客户端调用案例
    Java本地运行中文正常,部署到Weblogic中文乱码
    gson 忽略掉某些字段不进行转换
    JavaScript中定义对象的四种方式
    使用CSS3实现超炫的Loading(加载)动画效果
    不要再使用JS框架了
    HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
    js常用的事件对象
    jQuery用面向对象的思想来编写验证表单的插件
    五个值得尝试的前端开发工具
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/10354280.html
Copyright © 2011-2022 走看看