1.1 Windows编程模型

  为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行。例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身决定何时调用何种函数,操作系统病没有办法决定。

  Windows程序与传统的C程序执行不同,应用程序通过处理操作系统发送过来的消息来响应事件,事件可以是鼠标双击、单击、窗口更新命令等。Windows程序也有入口函数,该函数为WinMain,但是大多数操作是在窗口过程函数中进行的,窗口过程函数用来处理发送给窗口的消息。WinMain函数创建该窗口并进入消息循环,即获取消息或将其调度给窗口过程。消息被检索之前处于消息队列之中。当收到WM_QUIT消息时,应用程序结束,消息循环停止,WinMain函数返回。整个处理过程如下图。

  窗口过程一般需要调用其它函数来处理接收到的消息,可以调用自己的函数也可以调用Windows API函数(API函数包含在DLL模块)。处理特定消息的程序称为消息处理程序。如果有不能处理的消息则默认提供给DefWindows函数。

1.1.1 消息

  Windows定义了成千上万的消息,消息可以分为很多类型,大师认为,认识到消息在应用程序运行中关键作用比了解分类更重要

  消息的定义以WM_开头,消息以调用一个窗口的窗口过程形式来表明自己的存在(任何事物都需要找存在感),上图展示了常用的消息类型。调用窗口过程时同时需要4个输入参数:消息所指的消息句柄消息IDwParam(32bit)、lParam(32bit)。

  消息句柄:唯一标识窗口的32bit值

  消息ID:WM_PAINT等

  wParam和lParam:关于特定消息类型的信息

1.1.2 Windows程序设计

  通过一个简单的程序源代码学习一下Windows编程风格。

 #include <windows.h>

 LONG WINAPI WndProc(HWND, UINT,WPARAM,LPARAM);

 int WINAPI WinMain(HINSTANCE        hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
HWND hwnd;
MSG msg; wc.style = ;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = ;
wc.cbWndExtra = ;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
wc.lpszMenuName = NULL;
wc.lpszClassName = "Wang Wenping"; RegisterClass(&wc); hwnd = CreateWindow(
"Wang Wenping",      // WNDCLASS的名字,将由此生成窗口
"Wang Wenping",      // 窗口标题栏中显示文本
WS_OVERLAPPEDWINDOW,   // 窗口的样式
CW_USEDEFAULT,       // 窗口的初始化初始位置和大小
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
HWND_DESKTOP,       // 该窗口的父窗口句柄
NULL,            // 与窗口关联的菜单句柄
hInstance,         // 应用程序的实例句柄
NULL);           // 指向特定应用程序的窗口生成数据的指针 ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd); while ((GetMessage(&msg,NULL,,)) != )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
} return msg.wParam;
} LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(message)
{
case WM_PAINT:
hdc= BeginPaint(hwnd,&ps);
Ellipse(hdc,,,,);
EndPaint(hwnd,&ps);
return ; case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hwnd,message,wParam,lParam);
}

 Windows程序执行:

  1、注册窗口类    :窗口类定义窗口过程地址、默认背景颜色、图标等属性,这些属性通过了WNDCLASS结构中的字段值定义,然后传给RegisterClass。

  2、生成应用程序窗口 :WinMain调用CreateWindow函数生成应用程序窗口。

  3、确保窗口可见   :ShowWindow和UpdateWindow,确保WM_PAINT消息处理程序被调用。

  4、消息循环       :执行while循环,反复调用GetMessage、TranslateMessage、DispatchMessage3个API函数。

    4.1、GetMessage:检查消息队列,若消息有效,则消息从队列中删除并复制到msg(包含消息ID、消息时间);消息无效,停留在消息队列一直到消息有效;

    4.2、TranslateMessage:指示字符键的键盘消息转换为WM_CHAR消息;

    4.3、DispatchMessage:将消息发给窗口过程。

  5、窗口过程调用      :WndProc窗口调用。本例程只处理WM_PAINT和WM_DESTROY两个类型消息,其它的消息类型默认为DefWindowProc处理。绘制一个椭圆(200像素宽、100像素高)或者退出程序。

  采用该例程建立Win32程序,默认情况下会出现错误:error C2440: “初始化”: 无法从“const char [10]”转换为“LPCTSTR”。

  解决办法是:工程-》设置属性-》配置属性-》常规-》项目默认值-》字符集:使用多字节字符集。

  最后生成的界面如下图:

1.1.3 匈牙利标记法

先讲个匈牙利的笑话:

1941年匈牙利尾随纳粹德国向美国宣战。美国人当时对匈牙利十分陌生。在匈牙利大使宣读完宣战书后,

当时的美国国务卿问:"谁在领导着匈牙利?"

答:"霍尔蒂海军上将。"

问:"那你们一定拥有一支不错的海军?"

答:"对不起,我们是内陆国。"

问:"那么霍尔蒂将军的职务是什么?"

答:"他是摄政王。"

问:"哦,那么你们的国王是谁?"

答:"对不起,我们没有国王。"

问:"美国英国是你们的敌人吗?"

答:"我们唯一的敌人是罗马尼亚。"

问:"罗马尼亚,我记不清了,是我们的盟国吗?"

答:"对不起,是轴心国,我们的同盟。"

可见匈牙利是多么矛盾。  

匈牙利标记法大家应该都清楚了(我自己还不是很清楚,艾玛),这里将常用的表示法贴出来如下:

码了这么多字,我自己对Windows编程又熟悉了一遍,希望对大家也有帮助!

PS:成都的驷马桥天有点黑....

            

            

            

                      


  

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型的更多相关文章

  1. C++,C++编程,Windows编程,MFC

    编程 我们日常生活中接触到的电子类产品中的应用都是由编程而来 为什么编程,偷懒 我们通过编程驱使(指挥,命令)的是电信号 为什么上面说编程是偷懒,电的发现,给人们带来了便利,人们在各个方面驱使(换成“ ...

  2. MFC编译程序,缺少MFC动态链接库的解决

    MFC编译程序,缺少MFC动态链接库的解决 问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 解决方法: 1.将这些dll打包, ...

  3. VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

    上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还 ...

  4. <2013 12 01> 一篇很好的关于windows编程的入门指导(2013年末写的,比较前沿)

    我之前做了不少嵌入式开发,从单片机到ARM到RTOS到Linux等等,可以说走的是电气工程师的路线,对编程也是实用性的,跟计算机学院的科班套路不同.最近同学做一个windowsCE的项目请我帮忙,之前 ...

  5. 非MFC工程中使用MFC库

    目录(?)[-] 需求说明 常见问题 问题分析 参考解决方法 我的解决方案 Stdafxh的原理   需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console A ...

  6. C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理

    一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程 ...

  7. VS2010-MFC(MFC常用类:MFC异常处理)

    转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C ...

  8. MFC如何使用静态MFC库

    大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人. 所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了. VS这个做的不够 ...

  9. MFC原理第二讲.MFC的初始化过程

    MFC原理第二讲MFC的初始化过程 一丶简介 通过上一讲.我们手工模拟了一个MFC程序. 但是上一讲留下了疑问. 就是WinMain在哪.以及消息处理在哪里. 这一节主要就是讲解Winmain在哪里. ...

随机推荐

  1. Ember.js 的视图层

    本指导会详尽阐述 Ember.js 视图层的细节.为想成为熟练 Ember 开发者准备,且包 含了对于入门 Ember 不必要的细节. Ember.js 有一套复杂的用于创建.管理并渲染连接到浏览器 ...

  2. 解决magento后台无法登陆/登陆没有反应的方法

    安装过magento的几个版本,安装好后在登陆后台的时候都遇到了点问题,用户名和密码都输入正确,就是登陆不了后台,经过研究发现,登陆不了后台的主要是因为magento自身缓存设置的问题,最模板解决方法 ...

  3. iOS runtime 初步学习

    注: 在Xocde5之后, 使用运行时方法需要进行2步设置1. 在Build Setting中搜索'msg', 设置'Strict Checking' 为 NO2. 使用需要导入头文件 #import ...

  4. Wiki安装

    我们推荐使用Mediawiki. MediaWiki是基于php环境的,所以如果需要使用该类wiki,就要先部署php的环境. wiki下载: https://www.mediawiki.org/wi ...

  5. 转:详解Eclipse断点

    详解Eclipse断点(原) 详解Eclipse断点 大家肯定都用过Eclipse的调试的功能,在调试的过程中自然也无法避免要使用断点(breakpoint),但不知是否对Eclipse中各类断点都有 ...

  6. HTML5 十大新特性(七)——拖放API

    拖放API是H5专门为了鼠标拖放而新提供了7个事件,可以分成三个部分来讲. 一.拖动的源对象(source)可以触发的事件 dragstart:拖动开始 drag:拖动进行中 dragend:拖动结束 ...

  7. [ubuntu]用ubuntu开发的日子----win7 ubuntu双系统

    小子终于忍不了win7某些蛋疼的设定,看群里好多大牛推荐mac,但资金紧张,只好推而求其次使用ubuntu,但是由于公司工作环境是windows,所以还必须保留windows系统,一次决定双系统. 下 ...

  8. 【Duke-Image】Week_4 Image restoration

    Chapter 5 Image Restoration and Reconstruction 图像复原与重建 5.1 A Model of the Image Defradation/Restorat ...

  9. html文件里引入文件html文件

    导入通用的代码除了使用php外 iframe在很多界面使用起来比较方便 比如说要写导航 在好几个界面都要用这个导航 可以用iframe引用 实例:这个header.html是我写的一个导航界面 在in ...

  10. jQuery基础1

    jQuery是轻量级的JavaScript库,jQuery 库位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数.更少的代码做更多的事. jQuery 可以选取某些元素并执行 ...