MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

1.1 Windows编程模型

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

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

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

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

1.1.1 消息

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

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

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

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

  消息ID:WM_PAINT等

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

1.1.2 Windows程序设计

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

 

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型
 1 #include <windows.h>
 2 
 3 LONG WINAPI WndProc(HWND, UINT,WPARAM,LPARAM);
 4 
 5 int WINAPI WinMain(HINSTANCE        hInstance,
 6                    HINSTANCE        hPrevInstance,
 7                    LPSTR            lpCmdLine,
 8                    int              nCmdShow)  
 9 { 
10     WNDCLASS            wc;
11     HWND                hwnd;
12     MSG                 msg;
13 
14     wc.style          = 0;
15     wc.lpfnWndProc    = (WNDPROC) WndProc;
16     wc.cbClsExtra     = 0;
17     wc.cbWndExtra     = 0;
18     wc.hInstance      = hInstance;
19     wc.hIcon          = LoadIcon(NULL,IDI_WINLOGO);
20     wc.hCursor        = LoadCursor(NULL,IDC_ARROW);
21     wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
22     wc.lpszMenuName   = NULL;
23     wc.lpszClassName  = "Wang Wenping";
24 
25     RegisterClass(&wc);
26 
27     hwnd = CreateWindow(
28                 "Wang Wenping",      // WNDCLASS的名字,将由此生成窗口
29                 "Wang Wenping",      // 窗口标题栏中显示文本
30                 WS_OVERLAPPEDWINDOW,   // 窗口的样式
31                 CW_USEDEFAULT,       // 窗口的初始化初始位置和大小
32                 CW_USEDEFAULT,
33                 CW_USEDEFAULT,
34                 CW_USEDEFAULT,
35                 HWND_DESKTOP,       // 该窗口的父窗口句柄
36                 NULL,            // 与窗口关联的菜单句柄
37                 hInstance,         // 应用程序的实例句柄
38                 NULL);           // 指向特定应用程序的窗口生成数据的指针
39 
40     ShowWindow(hwnd,nCmdShow);
41     UpdateWindow(hwnd);
42 
43     while ((GetMessage(&msg,NULL,0,0)) != 0)
44     {
45         TranslateMessage(&msg);
46         DispatchMessage(&msg);
47     }
48 
49     return msg.wParam;
50 }
51 
52 LRESULT CALLBACK WndProc(HWND hwnd, UINT message,WPARAM wParam,LPARAM lParam)
53 {
54     PAINTSTRUCT ps;
55     HDC hdc;
56     switch(message)
57     {
58     case WM_PAINT:
59         hdc= BeginPaint(hwnd,&ps);
60         Ellipse(hdc,0,0,200,100);
61         EndPaint(hwnd,&ps);
62         return 0;
63 
64     case WM_DESTROY:
65         PostQuitMessage(0);
66         return 0;
67     }
68 
69     return DefWindowProc(hwnd,message,wParam,lParam);
70 }
MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

 

 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”

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

  最后生成的界面如下图:

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

1.1.3 匈牙利标记法

先讲个匈牙利的笑话:

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

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

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

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

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

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

答:"他是摄政王。"

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

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

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

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

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

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

 

可见匈牙利是多么矛盾。  

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

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

 

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

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

            

            

            

                      


  

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型,布布扣,bubuko.com

MFC-01-Chapter01:Hello,MFC---1.1 Windows 编程模型

上一篇:Python函数编程——闭包和装饰器


下一篇:WordPress插件制作教程(四): 将数据保存到数据库