1
第 2讲 Windows 应用程序基础
2
程序调试工具
包括源程序语
法检查、可执
行程序修改和
运行监视等
应用程序 Help
和 Setup开发
工具包
系统函数库和
系统函数开发
工具
资源管理器
包括图形化窗
口及组成元素
的多种对象的
编辑器
可选择并构成具体
语句或源程序结构
的例程库及 Help
源程序编辑
器和编译器
可视化开发
系统集成了一系
列系统可用资源
和开发工具
一,Windows编程基础
3
采用交互式方法时,可视化开发平台给出了许多选用的 对象,程序员
可选择所需 对象 并确定其属性,由此搭建起应用程序的“大框架”,
并可根据需要进一步编写必要的细节代码段,最后构成完整的 应用程

Windows的
程序设计语言
VC
VB
VJ
都是“面向 对象,
的程序设计语言
对象 是 Windows
的规范部件
窗口
菜单
按钮
对话框
程序模块
编写 Windows
程序相当一部分工
作是在创建 对象 和
为 对象 属性赋值
对象 特征:具有规范形态和操作模式
编程方法 传统编写法 -->API交互式方法 -->MFC
4
API API函数的功能
为应用程序 提
供 Windows系
统 特殊函数 及
数据结构
Win应用程序
可以利用标准
大量 API函数
调用系统功能
是 Win系统 与
Win应用程序
间的 标准程序
接口
窗口管理函数
实现窗口的创
建、移动和修
改功能
系统服务函数
:实现与操作
系统有关的多
种功能
图形设备 (GDI)
函数,实现与
设备无关的图
形操作功能
5
利用 Windows API函数编写 Windows应用程序 必
须首先了解以下内容:
(1)窗口的概念
(2)事件驱动的概念
(3)句柄
(4)消息
6
(1) 窗口
一个应用程序的窗口一般包含下列成分:
窗口边界
工作区
控制菜单框
下拉菜单
水平滚动条
垂直滚动条
最大化按钮
最小化按钮
标题栏
7
编写一个 Windows应用程序 首先应创建一个或多个窗口,随后应用
程序的运行过程即是 窗口内部, 窗口与窗口 之间,窗口与系统 之间
进行 数据处理与数据交换 的过程。
应用程
序与用
户之间
交互的
接口环

系统管理
应用程序
的基本单位
Win应用程序
基本的操作单元
8
Windows程序设计是针对 事件 或 消息 的处理进行
消息 是描述事
件发生的信息
(如按下鼠标或键盘 )
事件驱动 编程方法对于编写 交互式程序 很有用处,它避免
了死板的操作模式
Windows程序 的执行顺序取决于事件发生的顺序,程序的
执行顺序是由顺序产生的 消息 驱动的,但是 消息 的产生往
往并不要求有次序之分。
(2)事件驱动
9
常用句柄类型及其说明
句柄 是一个 4字节长的数值,用于标识应
用程序中不同的 对象 和 同类对象中不同的
实例
窗口
按钮
图标
滚动条
输出设备
控制
文件
(3) 句柄
应用程序通过
句柄 访问相应
的对象信息
HWND 窗口句柄 HDC 设备环境句柄
HBITMAP 位图句柄 HCURSOR 光标句柄
HICON 图标句柄 HFONT 字体句柄
HMENU 菜单句柄 HPEN 画笔句柄
HFILE 文件句柄 HBRUSH 画刷句柄
HINSTANCE 当前实例句柄
10
Windows应用程序 利用 Windows消息
(Message)与应用程序及系统进行信息交换。
typedef struct tagMSG
{HWND hwnd; 窗口句柄,为 null,则可检索所有驻留在消息队列中的消息
UINT message;消息值,由 Windows.h头文件中的宏定义来标识
WPARAM wParam;包含有关消息的附加信息,不同消息其值有所不同
LPARAM lParam;
DWORD time; 指定消息送至队列的时间
POINT pt;指定消息发送时屏幕光标的位置,其数据类型 POINT也是一个结构体
}MSG;
消息号:由事先定义好的消息名标识
字参数 (wParam),用于提供消息的 附加
信息
长字参数 (lParam),用于提供消息的 附
加信息


附加信息 与具体
消息号的值有关,
在 Win中消息用
结构体 MSG表示
typedef struct tagPOINT
{LONG x;
LONG y;
} POINT;
(4) 消息
11
(4) 消息
VC中存在几种系统定义的消息分类,不同的前缀符号经常用于
消息宏识别消息附属的分类,系统定义的消息宏前缀如下:
BM 表示按钮控制消息
CB 表示组合框控制消息
DM 表示默认下压式按钮控制消息
EM 表示编辑控制消息
LB 表示列表框控制消息
SBM 表示滚动条控制消息
WM 表示窗口消息
窗口管理消息
初始化消息
输入消息
系统消息
剪贴板消息
控制处理消息
控制通知消息
滚动条通知消息
非用户区消息
MDI消息
DDE消息
应用程序自定义的消息
Windows

程 常用消

12
二,Windows应用程序常用消息
1,WM_LBUTTONDOWN,产生单击鼠标左键的消息
此外,相似的消息还有:
?WM_LBUTTONUP:放开鼠标左键时产生;
?WM_RBUTTONDOWN:单击鼠标右键时产生;
?WM_RBUTTONUP:放开鼠标右键时产生;
?WM_LBUTTONDBLCLK:双击鼠标左键时产生;
?WM_RBUTTONDBLCLK:双击鼠标右键时产生。
lParam 高字节 包含当前光标的 Y坐标 值低字节 包含当前光标的 X坐标 值
wParam包含一整
数值以标识鼠标键
的 按下状态
MK_LBUTTON 按下鼠标左键
MK_MBUTTON 按下鼠标中键
MK_RBUTTON 按下鼠标右键
13
2,WM_KEYDOWN,按下一个 非系统键 时产生的消息
系统键 是指实现系统操作的组合键,例如 Alt与某个功
能键的组合以实现系统菜单操作等。
3,WM_ CHAR,按下一个 非系统键 时产生的消息
wParam 为按键的 ASCII码
lParam 与 WM_KEYDOWN的相同
wParam:按下键的 虚拟键码,用以标识按下或释放的键
lParam:记录了按键的重复次数、扫描码、转移代码、先前键的状态
等信息。
相似的消息还有 WM_KEYUP,在放开非系统键时产生
如 F1的虚拟键码
在 Windows.h文
件中定义为 VK_F1
14
4,WM_CREATE,由 CreateWindow函数发出的消息
wParam:未用
lParam:包含一个指向 CREATESTRUCT数据结构
的指针
5,WM_CLOSE,关闭窗口时产生的消息
wParam和 lParam均未用。
6,WM_DESTROY:由 DestroyWiodow函数发出的消息
wParam和 lParam均未用。
15
7,WM_QUIT,由 PostQuitMessage函数发出的消息
退出应用程序时发出的消息
wParam:含退出代码,标识程序退出运行时的有关信息
1Param:未用
8,WM_PAINT
用户区移动或显示
用户窗口改变大小
程序通过滚动条滚动窗口
下拉式菜单关闭并需要恢复被覆盖的部分
Windows清除对话框等对象,并需要恢复被覆盖的部分
均产生
WM_PAINT
消息
16
三,Windows中的事件驱动程序设计
启动
输入姓名
输入第一次测试成绩
输入第二次测试成绩
输入第三次测试成绩
计算平均成绩
结束
过程驱动 方法计算平均成绩
启动
消息处理
结束
输入姓名
输入第一次成绩
输入第二次成绩
输入第三次成绩
计算平均成绩
事件驱动 方法计算平均成绩
17
四,Windows应用程序组成及编程步骤
1,应用程序的组成
一个完整的 Windows
应用程序 通常由 五种
类型 的文件组成 。 1.C语言源程序文件
2.头文件
3.模块定义文件
4.资源描述文件
5.项目文件
18
2,源程序组成结构
入口函数 WinMain
窗口函数 WndProc
Windows
应用程序
构成基
本框架
包含各种
数据类型、
数据结构
与函数等
1,所有应用程序的入口,类似 Main函数,
2,完成一系列的定义和初始化,并产生消息循环
WinMain和 WinProc是
Windows应用程序的主体
19
(1) WinMain函数
三个基本的组成部分, 函数说明, 初始化 和 消息循环
功能
注册窗口类,建立窗口及执行必要的初始化
进入消息循环,据接受的消息调用相应的处理过程
当消息循环检索到 WM_QUIT时终止程序运行
WinMain函数
WinMain函数说明
WinMain函数的说明如下:
int WINAPI WinMain
( HINSTANCE hThisInst,∥ 应用程序当前实例句柄
HINSTANCe hPrevInst,∥ 应用程序其他实例句柄
LPSTR lpszCmdLine,∥ 指向程序命令行参数的指针
Int nCmdShow ∥ 应用程序开始执行时窗口显示方式的整数值标识
)
注意! Win是多任务管理的,同一应
用程序的多个窗口可能会同时存,Win
系统对每个窗口的执行称为一个实例,
并用一个实例句柄来唯一标识
20
(2) 初始化
(a)窗口类定义
通过给窗口类数据结构 WNDCLASS赋值完成,该数据结构中
包含窗口类的各种属性。窗口类定义常用以下函数:
LoadIcon的作用是在应用程序中加载一个窗口图标。其原型为:
HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName)
图标资源名或系统预定义图标标识名图标资源所在的模块句柄,NULL则使用系统预定义图标



显示窗口
创建窗口实例
窗口类的注册:窗口类必须先注册后使用
窗口类的定义:定义窗口的形式与功能
LoadIcon
LoadCursor
GetStockObject
RegisterClass
CreateWindow
ShowWindow, UpdateWindow
21
LoadCursor的作用是在应用程序中加载一个窗口光标
HCURSOR LoadCursor(HINSTANCE hInstance,
LPCTSTR lpCursorName)
光标资源所在的模
块句柄,NULL则使
用系统预定义光标 光标资源名或系统
预定义光标标识名
应用程序调用函数 GetStockObject获取系统提供的背景刷
HBRUSH GetStockObject(int nBrush);
22
(b)注册窗口类
Win系统本身提供部分预定义的窗口类,程序员也可以自定
义窗口类,窗口类必须先注册后使用。窗口类的注册由函数
RegisterClass()实现。
RegisterClass(&wndclass); //wndclass为窗口类结构
RegisterClass函数的返回为 布尔值,注册成功则返回 真
23
(c) 创建窗口实例
创建一个窗口类的实例由函数 CreateWindow()实现
函数原型如下:
HWND CreateWindow
( LPCTSTR lpszClassName,∥ 窗口类名
LPCTSTR lpszTitle,∥ 窗口标题名
DWORD dwStyle,∥ 创建窗口的样式
int x,y,∥ 窗口左上角坐标
int nWidth,nHeight,∥ 窗口宽度和度高
HWND hwndParent,∥ 该窗口的父窗口句柄
HMENU hMenu,∥ 窗口主菜单句柄
HINSTANCE hInstance,∥ 创建窗口的应用程序当前句柄
LPVOID lpParam ∥ 指向一个传递给窗口的参数值的指针
)
24
常用窗口样式
标识 说明
W S_BO R D ER 创建一带边框的窗口
W S_C A P TIO N 创建一带标题栏的窗口
W S_ V SC R OL L 创建一带垂直滚动条的窗口
W S_M A X IM IZ EBO X 创建一带最大化框的窗口
W S_M A X IM IZ E 创建一最大尺寸的窗口
W S_M IN IM IZ EBO X 创建一带最小化框的窗口
W S_M IN IM IZ E 创建一最小尺寸的窗口
W S_O V ER LA P P ED 创建一带边框和标题的窗口
W S_O V ER LA P P ED W IN D OW 创建一带边框、标题栏、系统菜单及最大、
最小化 框的窗口
W S_P OP U P 创建一弹出式窗口
W S_P OP U P W IN D OW 创建一带边框和系统菜单的弹出式窗口
W S_SY SM EN U 创建一带系统菜单的窗口
W S_ H SC R OL L 创建一带水平滚动条的菜单
25
(d)显示窗口
窗口类的显示由 ShowWindow和 UpdateWindow函数实现。应用程序调
用 ShowWindow函数在屏幕上显示窗口
ShowWindow(hwnd,nCmdshow); //nCmdshow为窗口显示形式标识S W _ HID E
隐藏窗口
S W _ S HO W N OR M AL 显示并激活窗口
S W _ S HO W M IN IM IZ E 显示并最小化窗口
S W _ S HO W M AX M IZ E 显示并最大化窗口
S W _ S HO W N OAC T I V E 显示但不激活窗口
S W _ R E S T OR E 恢复窗口的原来位置及尺寸
显示窗口后,应用程序调用 UpdateWindow更新并绘制用户
区,并发出 WM_PAINT消息。
UpdateWindow(hwnd);
26
(3) 消息循环
消息循环的常见格式如下:
MSG Msg;

while (GetMessage (&Msg,NULL,0,0))
{ TranslateMessage(&Msg);
DispatchMessage(&Msg); }
将消息的虚拟键
转换为字符信息
将消息传送到
指定窗口函数
从消息队列中读取
一条消息,并将消
息放在 MSG结构中
其中函数 GetMessage形式为:
GetMessage
( lpMSG,//指向 MSG结构的指针
hwnd,
nMsgFilteMin,//用于消息过滤的最小消息号值
nMsgFilterMax //用于消息过滤的最大消息号值

返回零值,即检索
到 WM_QUIT消息,程
序结束循环并退出
将消息传递给
窗口函数的相
应过程处理消息


Windows将
产生的消息
27
2,窗口函数 WinProc
WinProc函数由一个或多个 switch语句组成。每一条 case
语句对应一种消息,当应用程序接收到一个消息时,相应
的 case语句被激活并执行相应的响应程序模块。
WinProc
包含了对各种可能接收到的消息的处理过程
定义 了应用程序对接收到的不同消息的响应
28
窗口函数的一般形式如下:
LRESULT CALLBACK WndProc(HWND hwnd,UINT messgae,
WPARAM wParam,LPARAM lParam )
{ …
switch(message) ∥ message 为标识的消息
{ case …

break;

case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
在消息处理程序段中一般都有对 WM_DESTROY
的处理,该消息是关闭窗口时发出的。它向应用
程序发出 WM_QUIT消息,请求退出 处理函数,
void PostQuitMessage(int nExitCode)
//nExitCode为应用程序的退出代码
为未定义处理过程的消息提供缺省处理
29
3.数据类型
数据类型 说 明
WO R D 16 位无符号整数
L O N G 32 位有符号整数
D W O R D 32 位无符号整数
H AN D L E 句柄
U I NT 32 位无符号整数
B O O L 布尔值
L P T S T R 指向字符串的 32 位指针
L P CT S T R 指向字符串常量的 32 位指针
在 Windows.h中 定义了 Windows应用程序 中包含种类繁
多的数据类型
30
4,一些重要的数据结构
MSG:包含一个消息的全部信息,是消息发送的格式
WNDCLASS:包含一个窗口类的全部信息及属性
POINT:定义了屏幕上或窗口中的一个点的 X和 Y坐标
RECT:定义了一个矩形区域及其左上角和右下角的坐标







31
五、应用程序举例
【 例 2-1】 创建应用程序框架。本例的目的在于
说明创建 Windows应用程序的方法及过程
#include<windows.h> //包含应用程序中所需的数据类型和数据结构的定义
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); //窗口函数说明
//--------------- 以下初始化窗口类 ----------------------
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
WNDCLASS wndclass ;
char lpszClassName[] = "窗口 "; //窗口类名
char lpszTitle[]= "My_Windows"; //窗口标题名
32
//窗口类的定义
wndclass.style=0; //窗口类型为缺省类型
wndclass.lpfnWndProc=WndProc; //定义窗口处理函数
wndclass.cbClsExtra=0; //窗口类无扩展
wndclass.cbWndExtra=0; //窗口实例无扩展
wndclass.hInstance=hInstance; //当前实例句柄
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
//窗口的最小化图标为缺省图标
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW) ;
//窗口采用箭头光标
wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);
//窗口背景为白色
wndclass.lpszMenuName=NULL; //窗口中无菜单
wndclass.lpszClassName=lpszClassName ;
//窗口类名为 "窗口 "
33
//--------------- 以下进行窗口类的注册 -------
if(!RegisterClass( &wndclass))//如果注册失败则发出警告
{ MessageBeep(0) ; return FALSE ; }
//---------------- 创建窗口 -------------------
hwnd=CreateWindow
(
lpszClassName,//窗口类名
lpszTitle,//窗口实例的标题名
WS_OVERLAPPEDWINDOW,//窗口的风格
CW_USEDEFAULT,
CW_USEDEFAULT,//窗口左上角坐标为缺省值
CW_USEDEFAULT,
CW_USEDEFAULT,,//窗口的高和宽为缺省值
NULL,//此窗口无父窗口
NULL,//此窗口无主菜单
hInstance,//创建此窗口的应用程序的当前句柄
NULL //不使用该值
);
34
//--------------- 显示窗口 ----------------------
ShowWindow( hwnd,nCmdShow) ;
//-------------- 绘制用户区 ---------------------
UpdateWindow(hwnd);
//----------------- 消 息 循 环 ----------------------
while( GetMessage(&Msg,NULL,0,0))
{
TranslateMessage( &Msg) ;
DispatchMessage( &Msg) ;
}
return Msg.wParam; //消息循环结束即程序终止时将信息返回系

}
35
/窗口函数
LRESULT CALLBACK WndProc
( HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam
)
{ switch(message)
{ case WM_DESTROY:
PostQuitMessage(0);
default,//缺省时采用系统消息缺省处理函数
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
调用 PostQuitMessage
发出 WM_QUIT消息