API是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口,在编程时可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了

SDK是英文Software Development Kit的缩写,意思是“软件开发工具包” 微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等

向下的箭头③表示应用程序可以通知操作系统执行某个具体的动作。 如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要应用程序告诉操作系统该发出什么样的声音。

应用程序是如何通知操作系统执行某个功能的呢?

在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。

操作系统所能够完成的每一个特殊功能通常都有一个函数与其对应,也就是说,操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,

应用程序对这些函数的调用就叫做系统调用,这些函数的集合就是 windows操作系统提供给应用程序编程的接口Windows API。

如CreateWindow就是一个API函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。

事件(Event)是对计算机操作的动作。每个事件对应一个消息,即每个事件发生的效果是产生消息。

消息(Message)是描述事件发生的信息。 比如:按键事件——按下键的消息、字符消息和键弹起的消息程序执行的顺序取决于事件发生的顺序,

但是消息的产生并不要求有次序之分。

向上的箭头④表示操作系统能够将输入设备的变化上传给应用程序。

如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,

而是将这一事件转交给应用程序,由应用程序决定如何对这一事件作出反应。好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,

并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。对事件作出反应的过程就是消息响应。

消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息。

鼠标被移动会产生WM_MOUSEMOVE消息; 鼠标左键被按下会产生WM_LBUTTONDOWN的消息; 鼠标右键按下便产生WM_RBUTTONDOWN消息等。

操作系统是怎样将感知到的事件传递给应用程序呢?这是通过消息机制(Message)来实现的。

操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序,参看MSDN。

消息的组成: 消息号+字参数+长字参数

消息号事先定义好。

字参数(wParam)长字参数(lParam)提供附加信息,含义和具体消息号相关。

Windows程序要完成的动作:

接收消息、分发消息、处理消息

VC定义不同的前缀用于消息宏定义识别消息类型。

BM 按钮消息

CB 组合框消息

DM 下压按钮控制消息

EM 编辑框消息

LB 列表框消息

WM 窗口消息

Windows应用程序则是通过操作系统发送的消息来处理用户输入

在Windows操作系统环境内,主要有两大类事件封装的消息

系统产生的动作

用户运行应用程序产生的动作

Windows系统有一个存放消息的队列。 每个应用程序也有一个消息队列。

Windows系统先将收到的消息存放在系统队列中。 然后再分发到相应的应用程序队列中。

应用程序则从自身的队列中获取消息并进行处理。

创建消息循环

Windows程序至少包含两个函数:

WinMain ( ) : 必有且仅有一个

窗口函数 : 每个窗口对应一个窗口函数,以响应该窗口的消息

通常每个Windows 应用程序至少对应一个窗口,每个窗口都要有一个窗口函数负责处理该窗口内所发生的事件

While (GetMessage(&msg,(HWND)NULL,0,0))

{

   TranslateMessage(&msg); // 转换某些键盘消息

  DispatchMessage(&msg); // 将消息发送给窗口过程, 例程中指WndProc

}

何时退出 ?

// 当从应用程序消息队列中检取的消息是

// WM_QUIT时,则退出循环

PostMessage和SendMessage

PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行 这是个异步消息投放函数,会造成消息的滞后性

SendMessage必须等待其他程序处理消息完了之后才返回,继续执行这是个同步消息投放函数,不会造成消息的滞后性。但如果消息处理失败,则会造成程序停止

PostMessage的返回值表示PostMessage函数执行是否正确

SendMessage的返回值表示其他程序处理消息后的返回值

使用示例

PostQuitMessage(nExitCode) 功能: 发送WM_QUIT消息给系统, 以通知系统应用程序要结束。

WM_QUIT消息只能用PostMessage,因为该消息将导致应用程序释放消息环,也就无法返回结果 。

SendDlgItemMessage( … ) 功能: 向对话框控件发送消息 相当于先用GetDlgItem()得到控件句柄,再 SendMessage(),是一种组合的方便方式。

MFC的核心概念的更多相关文章

  1. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  2. MFC六大核心机制

    MFC六大核心机制概述 我们选择了C++,主要是因为它够艺术.够自由,使用它我们可以实现各种想法,而MFC将多种可灵活使用的功能封装起来,我们岂能忍受这种“黑盒”操作?于是研究分析MFC的核心机制成为 ...

  3. 领域驱动设计(DDD)部分核心概念的个人理解

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  4. Javascript本质第一篇:核心概念

    很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...

  5. [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)

    本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...

  6. spring技术核心概念纪要

    一.背景 springframework 从最初的2.5版本发展至今,期间已经发生了非常多的修正及优化.许多新特性及模块的出现,使得整个框架体系显得越趋庞大,同时也带来了学习及理解上的困难. 本文阐述 ...

  7. ElasticSearch学习笔记-01 简介、安装、配置与核心概念

    一.简介 ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进 ...

  8. Playmaker Input篇教程之引入的核心概念

    Playmaker Input篇教程之引入的核心概念 Playmaker Input引入的核心概念 Playmaker引入了4个核心概念:状态机.动作.变量和事件.了解它们是学习操作Playmaker ...

  9. Maven的几个核心概念

    POM (Project Object Model) 一个项目所有的配置都放置在 POM 文件中:定义项目的类型.名字,管理依赖关系,定制插件的行为等等.比如说,你可以配置 compiler 插件让它 ...

随机推荐

  1. quicksort快排

    废话不多说,上代码: void quicksort(int x[], int lo, int hi){ int i = lo, j = hi; ]; while(i <= j){ while(x ...

  2. 汇总jQuery的61种选择器及示例

    汇总jQuery的61种选择器及示例 恋痿喃 ㄍń稀广 因罘乐睽 ú燔蒇 骤幄觳 ч豹 齑骝氮铷 宅廓Ω孓 锏遒 荛猩ㄜ彬 芡钷ж ┊贩错鹌 掩饰着可还是几步就窜到了门口看着这个让她 ...

  3. jquery-选择checkbox的多种策略

    checkbox属性: var val = $("#checkAll").val();// 获取指定id的复选框的值 var isSelected = $("#check ...

  4. 网络模块(net, http)小解

    net模块可用来创建TCP服务器来接收网络请求,它提供了创建客户端以及服务端的方法 服务端: 创建服务器: net.createServer([,options], connectionListene ...

  5. Elasticsearch Java虚拟机配置详解(转)

    引言: 今天,事情终于发生了.Java6(Mustang),是2006年早些时候出来的,至今仍然应用在众多生产环境中,现在终于走到了尽头.已经没有什么理由阻止迁移到Java7(Dolphin)上了. ...

  6. 转:应用JMeter测试solr请求

    使用JMeter测试solr请求 一.安装JMeter 在官网http://jmeter.apache.org/download_jmeter.cgi下载JMeter 直接解压JMeter安装包 Li ...

  7. python实现邮件发送

    实例补充: #**************************利用STMP自动发送邮件******************************import smtplibsmtp = smtp ...

  8. VBS自编写脚本。(实现批量修改文件名且在执行前,备份原有文件夹中的文件)

    '=========================================================================='' VBScript Source File - ...

  9. kloxo面板教程-折腾了一天

    ------------------------------------------------------------------------------- 前一晚安装了掉线,不得不重新来,有点慢, ...

  10. spring Stack Overflow

    1. ApplicationContext 不关闭,资源泄露问题: Spring ApplicationContext - Resource leak: 'context' is never clos ...