MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型
1.1 Windows编程模型
为传统的操作系统编写的程序使用的是过程化模型,即程序从头到尾按顺序执行。例如C程序,从main函数入口开始执行,中间调用不同的函数一直到程序结束返回,这种过程是程序本身决定何时调用何种函数,操作系统病没有办法决定。
Windows程序与传统的C程序执行不同,应用程序通过处理操作系统发送过来的消息来响应事件,事件可以是鼠标双击、单击、窗口更新命令等。Windows程序也有入口函数,该函数为WinMain,但是大多数操作是在窗口过程函数中进行的,窗口过程函数用来处理发送给窗口的消息。WinMain函数创建该窗口并进入消息循环,即获取消息或将其调度给窗口过程。消息被检索之前处于消息队列之中。当收到WM_QUIT消息时,应用程序结束,消息循环停止,WinMain函数返回。整个处理过程如下图。
窗口过程一般需要调用其它函数来处理接收到的消息,可以调用自己的函数也可以调用Windows API函数(API函数包含在DLL模块)。处理特定消息的程序称为消息处理程序。如果有不能处理的消息则默认提供给DefWindows函数。
1.1.1 消息
Windows定义了成千上万的消息,消息可以分为很多类型,大师认为,认识到消息在应用程序运行中关键作用比了解分类更重要。
消息的定义以WM_开头,消息以调用一个窗口的窗口过程形式来表明自己的存在(任何事物都需要找存在感),上图展示了常用的消息类型。调用窗口过程时同时需要4个输入参数:消息所指的消息句柄、消息ID、wParam(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 编程模型的更多相关文章
- C++,C++编程,Windows编程,MFC
编程 我们日常生活中接触到的电子类产品中的应用都是由编程而来 为什么编程,偷懒 我们通过编程驱使(指挥,命令)的是电信号 为什么上面说编程是偷懒,电的发现,给人们带来了便利,人们在各个方面驱使(换成“ ...
- MFC编译程序,缺少MFC动态链接库的解决
MFC编译程序,缺少MFC动态链接库的解决 问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 解决方法: 1.将这些dll打包, ...
- VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)
上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还 ...
- <2013 12 01> 一篇很好的关于windows编程的入门指导(2013年末写的,比较前沿)
我之前做了不少嵌入式开发,从单片机到ARM到RTOS到Linux等等,可以说走的是电气工程师的路线,对编程也是实用性的,跟计算机学院的科班套路不同.最近同学做一个windowsCE的项目请我帮忙,之前 ...
- 非MFC工程中使用MFC库
目录(?)[-] 需求说明 常见问题 问题分析 参考解决方法 我的解决方案 Stdafxh的原理 需求说明 C++工程的类型有很多,从VS(或VC)可以看到常见的有:Win32 Console A ...
- C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
一.MFC概念和作用 1.全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程 ...
- VS2010-MFC(MFC常用类:MFC异常处理)
转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理. 在鸡啄米C++编程入门系列的最后一节鸡啄米:C ...
- MFC如何使用静态MFC库
大部分MFC程序都是使用 在共享DLL中使用MFC ,但是VS每一个版本都需要一个 MFC运行库,实在是有点烦人. 所以我选择了使用静态MFC库,虽然文件会大一些,但是至少不麻烦了. VS这个做的不够 ...
- MFC原理第二讲.MFC的初始化过程
MFC原理第二讲MFC的初始化过程 一丶简介 通过上一讲.我们手工模拟了一个MFC程序. 但是上一讲留下了疑问. 就是WinMain在哪.以及消息处理在哪里. 这一节主要就是讲解Winmain在哪里. ...
随机推荐
- Ember.js 的视图层
本指导会详尽阐述 Ember.js 视图层的细节.为想成为熟练 Ember 开发者准备,且包 含了对于入门 Ember 不必要的细节. Ember.js 有一套复杂的用于创建.管理并渲染连接到浏览器 ...
- 解决magento后台无法登陆/登陆没有反应的方法
安装过magento的几个版本,安装好后在登陆后台的时候都遇到了点问题,用户名和密码都输入正确,就是登陆不了后台,经过研究发现,登陆不了后台的主要是因为magento自身缓存设置的问题,最模板解决方法 ...
- iOS runtime 初步学习
注: 在Xocde5之后, 使用运行时方法需要进行2步设置1. 在Build Setting中搜索'msg', 设置'Strict Checking' 为 NO2. 使用需要导入头文件 #import ...
- Wiki安装
我们推荐使用Mediawiki. MediaWiki是基于php环境的,所以如果需要使用该类wiki,就要先部署php的环境. wiki下载: https://www.mediawiki.org/wi ...
- 转:详解Eclipse断点
详解Eclipse断点(原) 详解Eclipse断点 大家肯定都用过Eclipse的调试的功能,在调试的过程中自然也无法避免要使用断点(breakpoint),但不知是否对Eclipse中各类断点都有 ...
- HTML5 十大新特性(七)——拖放API
拖放API是H5专门为了鼠标拖放而新提供了7个事件,可以分成三个部分来讲. 一.拖动的源对象(source)可以触发的事件 dragstart:拖动开始 drag:拖动进行中 dragend:拖动结束 ...
- [ubuntu]用ubuntu开发的日子----win7 ubuntu双系统
小子终于忍不了win7某些蛋疼的设定,看群里好多大牛推荐mac,但资金紧张,只好推而求其次使用ubuntu,但是由于公司工作环境是windows,所以还必须保留windows系统,一次决定双系统. 下 ...
- 【Duke-Image】Week_4 Image restoration
Chapter 5 Image Restoration and Reconstruction 图像复原与重建 5.1 A Model of the Image Defradation/Restorat ...
- html文件里引入文件html文件
导入通用的代码除了使用php外 iframe在很多界面使用起来比较方便 比如说要写导航 在好几个界面都要用这个导航 可以用iframe引用 实例:这个header.html是我写的一个导航界面 在in ...
- jQuery基础1
jQuery是轻量级的JavaScript库,jQuery 库位于一个 JavaScript 文件中,其中包含了所有的 jQuery 函数.更少的代码做更多的事. jQuery 可以选取某些元素并执行 ...