第一课 windows应用程序基础
1-1 windows应用程序的特点
windo应用本身
编写windows程序相当一部分工作就是在创建对象和为对象赋属性
对象特征
具有规范形态和操作模式
两种机制
消息循环
事件响应
多任务和多线程
多种形式的输入手段
硬件方式
软件方式
设备无关的图形输出
GDI(Graphics Device Interface, 图形设备接口)
1-2 可视化编程
即可视化程序设计
所见即所得的编程思想
随时可以看到编程的效果,程序与结果的调整同步
仅仅是界面的设计工作无需操作
API函数
API是一些预先定义的函数
提供应用程序与开发人员基于某些软件或硬件得以访问一组例程的能力,
而无需访问源码,或理解内部工作机制的细节
MFC架构的编程
微软基础类库,是一个微软公司提供的类库
以C++类的形式封装了windows API
包含一个应用程序矿建,以减少应用程序开发人员的工作量
对象
选择对象确定属性->搭建程序"大框架"->编写细节代码构成完整程序
1-3 关于API
定义
Application Programming Interface
功能
-为应用程序提供windows系统特殊函数及数据结构
-Win应用程序可以利用变准大量APi函数调用系统功能
-是Win系统与Win应用程序间的标准程序接口
-窗口管理函数:实现窗口的创建,移动和修改功能
-系统服务函数:实现与操作系统有关的多种功能
-图形设备函数:实现与设备无关的图形操作功能
必须首先了解的内容:
(1)窗口的概念
系统管理应用程序的基本单位
用用程序与用户之间交互的接口环境
编写一个windows应用程序首先应创建一个或多个窗口
随后应用程序的运行过程即是窗口内部,窗口与窗口之间,窗口与系统之间
进行数据处理与数据交换的过程
(2)事件驱动的概念
所谓事件驱动,简单地说就是点击什么对象(即产生什么事件),
系统就执行什么操作(即调用什么函数)
Windows程序设计是针对事件驱动进行的,事件驱动是针对事件消息的描述
Windows程序的执行顺序取决于事件的发生顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生旺旺并不要求有次序之分
(3)句柄的概念
句柄是一个8字节长(相对64位操作系统)的数值,于标识应用程序中不同的对象和同类对象中不同的实例
应用程序通过句柄访问相应的对象信息
(4)消息的概念
Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换
消息号
由事先定义好的消息名标识
字参数(wParam)
用于提供消息的附加信息
长字参数(lParam)
用于提供消息的附加信息
附加信息
与具体消息号有关,在Windows中消息用结构体 MSG 表示
MSG结构体
typedef struct tagMSG
{
HWND hwnd; //窗口句柄,为null,则可检索所有驻留在消息队列中的消息
UINT message; //消息值,由Windows.h头文件中的宏定义来标识
WPARAM wParam; //包含有关消息的附加信息,不同消息其值有所不同
LPARAM lParam; //
DWORD time; //指定消息送至队列的时间
POINT pt; //制定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体
}MSG;
typedef struct tagPOINT
{
LONG x;
LONG y;
}POINT;
消息分类
不同的前缀符号经常用于消息宏识别消息附属的分类
系统消息的消息宏前缀
BM 表示按钮控制消息
CB 表示组合框控制消息
DM 表示默认下压式按钮控制消息
EM 表示编辑控制消息
LB 表示列表框控制消息
SBM 表示滚动条控制消息
WM 表示窗口消息
常用的消息
WM_LBUTTONBOWN 产生单机鼠标左键的消息
lParam
低字节 包含当前光标的X坐标值
X = LOWORD(lParam);
高字节 包含当前光标的Y坐标值
Y = HIWORD(lParam);
wParam
包含一整数值,用来标识鼠标键的按下状态
通过switch-case来识别
一般的
MK_LBUTTON 按下鼠标左键
MK_MBUTTON 按下鼠标中键
MK_RBUTTON 按下鼠标右键
MK_SHIFT 按下SHIFT键
MK_CONTROL 按下CONTROL键
相似的消息
WM_LBUTTONUP 放开鼠标左键时产生
WM_RBUTTONUP 放开鼠标右键时产生
WM_RBUTTONDOWN 单击鼠标右键时产生
WM_LBUTTONDOWN 单击鼠标左键时产生
WM_LBUTTONDBCLK 双击鼠标左键时产生
WM_RBUTTONDBCLK 双击鼠标右键时产生
WM_MOUSEMOVE 鼠标经过窗口的显示区域时产生
WM_MBUTTONUP 放开鼠标中键时产生
WM_KEYDOWN按下一个非系统键时产生的消息
系统键
是指实现系统操作的组合键,
如Alt与某个功能键的组合以实现系统菜单操作等,
非系统键就是不与alt联用的键
字参数 包含了键的虚拟码
虚拟码
用以标识按下或释放的键
lParam 记录了按键的重复次数,扫描码,转移代码,先前键的状态等信息
WM_CHAR 按下一个非系统键时产生的消息
wParam 为按键的ASCLL码
lParam 与WM_KEYDOWN的相同
WM_CREATE 由CreateWindow函数发出的消息
wParam 未用
lParam 包含一个指向CREATESTRUCT数据结构的指针
WM_CLOSE 关闭窗口时产生的消息
wParam 未用
lParam 未用
WM_DESTROY 由DestroyWindow函数发出的消息
wParam 未用
lParam 未用
WM_QUIT 由PostQuitMessage函数发出的消息
wParam 含推出代码,标识程序推出运行时的有关信息
lParam 未用
WM_PAINT 屏幕刷新时产生的消息
用户区移动或显示
程序通过滚动条滚动窗口
用户窗口改变大小
下拉式菜单关闭并需要恢复被覆盖的部分
Windows清除对话框等对象,并需要恢复被覆盖的部分
1-4 Windows 应用程序组成及编程步骤
应用程序的组成
1 源程序文件
2 头文件
3 模块定义文件
4 资源描述文件
5 项目文件
源程序组成结构
入口函数
所有程序的入口,类似Main函数,完成定义和初始化,产生消息循环
功能:
注册窗口类,简历窗口及执行必要的初始化
进入消息循环,据接受的消息调用响应的处理过程
当消息循环检索到WM_QUIT时,终止程序运行
基本组成
函数说明
Win是多任务管理的,同一应用程序的多个窗口可能同时存在
Win系统时对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识
int WINAPI WinMain
{
HINSTANCE hThisInst, // 应用程序当前实例句柄
HINSTANCE hPrevInst, // 应用程序其他实例句柄
LPSTR lpszCmdLine, // 指向程序命令行参数的指针
Int nCmdShow // 应用程序开始执行时窗口显示方式的整数值标识
}
初始化
窗口类定义
通过给窗口类数据结构WNDCLASS 赋值完成,该数据结构中包含窗口类的各种属性
LoadIcon
作用 在应用程序中加载一个窗口图标
原型 HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName)
为哪个窗口 哪个图标
LoadCursor
作用 是在应用程序中加载一个窗口坐标
原型 HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
哪个窗口 什么样的光标
调用 GetStockObject 函数获取系统提供的背景刷
HBRUSH GetStockObject(int nBrush);
窗口类的注册
Win系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用
窗口类的注册由函数RegisterClass()实现与操作系统有关的多种功能
RegisterClass(&wndclass); // wndclass为注册窗口类结构
返回值为布尔值,成功为真
创建窗口实例
创建一个窗口类的实例由函数CreatWindow()实现
函数原型
HWND CreateWindow
{
LPCTSTR lpszClassName, //窗口类名
LPCTSTR lpszTitle, //窗口标题名
DWORD dwStyle, //创建窗口的样式
int x, y, //窗口左上角坐标
int nWidth, nHeight, //窗口宽度和高度
HWND hwndParent, //该窗口父窗口句柄
HMENU hMenu, //窗口主菜单句柄
HINSTANCE hInstance, //创建窗口的应用程序当前句柄
LPVOID lpParam //指向一个传递给窗口的参数值的指针
}
显示窗口
窗口类的显示 由showWindow和UpdateWindow函数实现
窗口显示形式标识 ShowWindow(hwnd, nCmdshow); //nCmdshow
应用程序调用ShowWindow函数在屏幕上显示窗口
SW_HIDE 隐藏窗口
SW_SHOWNORMAL 显示并激活窗口
SW_SHOWMINIMIZE 显示并最小化窗口
SW_SHOWMAXMIZE 显示并最大化窗口
SW_SHOWNOACTIVE 显示但不激活窗口
SW_RESTORE 回复窗口的原来位置及尺寸
显示窗口后程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息
消息循环
Windows产生消息-> 消息队列(WinMain函数) ->将消息传递给窗口函数的相应过程处理(WndProc函数)
MSG Msg;
while( GetMessage (&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg); // 将消息的虚拟键转换为字符消息
DispatchMessage(&Msg); // 将消息传送到制定窗口函数
}
GetMessage 从消息队列中读取一条消息,并将消息放在MSG结构中
(lpMSG, //指向MSG结构的指针
hwnd, //从哪个窗口获得
nMsgFilterMin, //用于消息过滤的最小消息号值
nMsgFilterMax) //用于消息过滤的最大消息号值
窗口函数
数据类型
LRESULT:
消息处理结果的返回值的数据类型,实际上时LONG
CALLBAK:
表示这个函数是给系统调用的,也称作"回调"
RECT结构
typedef struct_RECT
{
LONG left; //矩形框左上角x坐标
LONG top; //矩形框左上角y坐标
LONG right; //矩形框右下角x坐标
LONG bottom; //矩形框右下角y坐标
}RECT;
1-1 windows应用程序的特点
windo应用本身
编写windows程序相当一部分工作就是在创建对象和为对象赋属性
对象特征
具有规范形态和操作模式
两种机制
消息循环
事件响应
多任务和多线程
多种形式的输入手段
硬件方式
软件方式
设备无关的图形输出
GDI(Graphics Device Interface, 图形设备接口)
1-2 可视化编程
即可视化程序设计
所见即所得的编程思想
随时可以看到编程的效果,程序与结果的调整同步
仅仅是界面的设计工作无需操作
API函数
API是一些预先定义的函数
提供应用程序与开发人员基于某些软件或硬件得以访问一组例程的能力,
而无需访问源码,或理解内部工作机制的细节
MFC架构的编程
微软基础类库,是一个微软公司提供的类库
以C++类的形式封装了windows API
包含一个应用程序矿建,以减少应用程序开发人员的工作量
对象
选择对象确定属性->搭建程序"大框架"->编写细节代码构成完整程序
1-3 关于API
定义
Application Programming Interface
功能
-为应用程序提供windows系统特殊函数及数据结构
-Win应用程序可以利用变准大量APi函数调用系统功能
-是Win系统与Win应用程序间的标准程序接口
-窗口管理函数:实现窗口的创建,移动和修改功能
-系统服务函数:实现与操作系统有关的多种功能
-图形设备函数:实现与设备无关的图形操作功能
必须首先了解的内容:
(1)窗口的概念
系统管理应用程序的基本单位
用用程序与用户之间交互的接口环境
编写一个windows应用程序首先应创建一个或多个窗口
随后应用程序的运行过程即是窗口内部,窗口与窗口之间,窗口与系统之间
进行数据处理与数据交换的过程
(2)事件驱动的概念
所谓事件驱动,简单地说就是点击什么对象(即产生什么事件),
系统就执行什么操作(即调用什么函数)
Windows程序设计是针对事件驱动进行的,事件驱动是针对事件消息的描述
Windows程序的执行顺序取决于事件的发生顺序,程序的执行顺序是由顺序产生的消息驱动的,但是消息的产生旺旺并不要求有次序之分
(3)句柄的概念
句柄是一个8字节长(相对64位操作系统)的数值,于标识应用程序中不同的对象和同类对象中不同的实例
应用程序通过句柄访问相应的对象信息
(4)消息的概念
Windows应用程序利用Windows消息(Message)与应用程序及系统进行信息交换
消息号
由事先定义好的消息名标识
字参数(wParam)
用于提供消息的附加信息
长字参数(lParam)
用于提供消息的附加信息
附加信息
与具体消息号有关,在Windows中消息用结构体 MSG 表示
MSG结构体
typedef struct tagMSG
{
HWND hwnd; //窗口句柄,为null,则可检索所有驻留在消息队列中的消息
UINT message; //消息值,由Windows.h头文件中的宏定义来标识
WPARAM wParam; //包含有关消息的附加信息,不同消息其值有所不同
LPARAM lParam; //
DWORD time; //指定消息送至队列的时间
POINT pt; //制定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体
}MSG;
typedef struct tagPOINT
{
LONG x;
LONG y;
}POINT;
消息分类
不同的前缀符号经常用于消息宏识别消息附属的分类
系统消息的消息宏前缀
BM 表示按钮控制消息
CB 表示组合框控制消息
DM 表示默认下压式按钮控制消息
EM 表示编辑控制消息
LB 表示列表框控制消息
SBM 表示滚动条控制消息
WM 表示窗口消息
常用的消息
WM_LBUTTONBOWN 产生单机鼠标左键的消息
lParam
低字节 包含当前光标的X坐标值
X = LOWORD(lParam);
高字节 包含当前光标的Y坐标值
Y = HIWORD(lParam);
wParam
包含一整数值,用来标识鼠标键的按下状态
通过switch-case来识别
一般的
MK_LBUTTON 按下鼠标左键
MK_MBUTTON 按下鼠标中键
MK_RBUTTON 按下鼠标右键
MK_SHIFT 按下SHIFT键
MK_CONTROL 按下CONTROL键
相似的消息
WM_LBUTTONUP 放开鼠标左键时产生
WM_RBUTTONUP 放开鼠标右键时产生
WM_RBUTTONDOWN 单击鼠标右键时产生
WM_LBUTTONDOWN 单击鼠标左键时产生
WM_LBUTTONDBCLK 双击鼠标左键时产生
WM_RBUTTONDBCLK 双击鼠标右键时产生
WM_MOUSEMOVE 鼠标经过窗口的显示区域时产生
WM_MBUTTONUP 放开鼠标中键时产生
WM_KEYDOWN按下一个非系统键时产生的消息
系统键
是指实现系统操作的组合键,
如Alt与某个功能键的组合以实现系统菜单操作等,
非系统键就是不与alt联用的键
字参数 包含了键的虚拟码
虚拟码
用以标识按下或释放的键
lParam 记录了按键的重复次数,扫描码,转移代码,先前键的状态等信息
WM_CHAR 按下一个非系统键时产生的消息
wParam 为按键的ASCLL码
lParam 与WM_KEYDOWN的相同
WM_CREATE 由CreateWindow函数发出的消息
wParam 未用
lParam 包含一个指向CREATESTRUCT数据结构的指针
WM_CLOSE 关闭窗口时产生的消息
wParam 未用
lParam 未用
WM_DESTROY 由DestroyWindow函数发出的消息
wParam 未用
lParam 未用
WM_QUIT 由PostQuitMessage函数发出的消息
wParam 含推出代码,标识程序推出运行时的有关信息
lParam 未用
WM_PAINT 屏幕刷新时产生的消息
用户区移动或显示
程序通过滚动条滚动窗口
用户窗口改变大小
下拉式菜单关闭并需要恢复被覆盖的部分
Windows清除对话框等对象,并需要恢复被覆盖的部分
1-4 Windows 应用程序组成及编程步骤
应用程序的组成
1 源程序文件
2 头文件
3 模块定义文件
4 资源描述文件
5 项目文件
源程序组成结构
入口函数
所有程序的入口,类似Main函数,完成定义和初始化,产生消息循环
功能:
注册窗口类,简历窗口及执行必要的初始化
进入消息循环,据接受的消息调用响应的处理过程
当消息循环检索到WM_QUIT时,终止程序运行
基本组成
函数说明
Win是多任务管理的,同一应用程序的多个窗口可能同时存在
Win系统时对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识
int WINAPI WinMain
{
HINSTANCE hThisInst, // 应用程序当前实例句柄
HINSTANCE hPrevInst, // 应用程序其他实例句柄
LPSTR lpszCmdLine, // 指向程序命令行参数的指针
Int nCmdShow // 应用程序开始执行时窗口显示方式的整数值标识
}
初始化
窗口类定义
通过给窗口类数据结构WNDCLASS 赋值完成,该数据结构中包含窗口类的各种属性
LoadIcon
作用 在应用程序中加载一个窗口图标
原型 HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName)
为哪个窗口 哪个图标
LoadCursor
作用 是在应用程序中加载一个窗口坐标
原型 HCURSOR LoadCursor(HINSTANCE hInstance, LPCTSTR lpCursorName)
哪个窗口 什么样的光标
调用 GetStockObject 函数获取系统提供的背景刷
HBRUSH GetStockObject(int nBrush);
窗口类的注册
Win系统本身提供部分预定义的窗口类,程序员也可以自定义窗口类,窗口类必须先注册后使用
窗口类的注册由函数RegisterClass()实现与操作系统有关的多种功能
RegisterClass(&wndclass); // wndclass为注册窗口类结构
返回值为布尔值,成功为真
创建窗口实例
创建一个窗口类的实例由函数CreatWindow()实现
函数原型
HWND CreateWindow
{
LPCTSTR lpszClassName, //窗口类名
LPCTSTR lpszTitle, //窗口标题名
DWORD dwStyle, //创建窗口的样式
int x, y, //窗口左上角坐标
int nWidth, nHeight, //窗口宽度和高度
HWND hwndParent, //该窗口父窗口句柄
HMENU hMenu, //窗口主菜单句柄
HINSTANCE hInstance, //创建窗口的应用程序当前句柄
LPVOID lpParam //指向一个传递给窗口的参数值的指针
}
显示窗口
窗口类的显示 由showWindow和UpdateWindow函数实现
窗口显示形式标识 ShowWindow(hwnd, nCmdshow); //nCmdshow
应用程序调用ShowWindow函数在屏幕上显示窗口
SW_HIDE 隐藏窗口
SW_SHOWNORMAL 显示并激活窗口
SW_SHOWMINIMIZE 显示并最小化窗口
SW_SHOWMAXMIZE 显示并最大化窗口
SW_SHOWNOACTIVE 显示但不激活窗口
SW_RESTORE 回复窗口的原来位置及尺寸
显示窗口后程序调用UpdateWindow更新并绘制用户区,并发出WM_PAINT消息
消息循环
Windows产生消息-> 消息队列(WinMain函数) ->将消息传递给窗口函数的相应过程处理(WndProc函数)
MSG Msg;
while( GetMessage (&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg); // 将消息的虚拟键转换为字符消息
DispatchMessage(&Msg); // 将消息传送到制定窗口函数
}
GetMessage 从消息队列中读取一条消息,并将消息放在MSG结构中
(lpMSG, //指向MSG结构的指针
hwnd, //从哪个窗口获得
nMsgFilterMin, //用于消息过滤的最小消息号值
nMsgFilterMax) //用于消息过滤的最大消息号值
窗口函数
数据类型
LRESULT:
消息处理结果的返回值的数据类型,实际上时LONG
CALLBAK:
表示这个函数是给系统调用的,也称作"回调"
RECT结构
typedef struct_RECT
{
LONG left; //矩形框左上角x坐标
LONG top; //矩形框左上角y坐标
LONG right; //矩形框右下角x坐标
LONG bottom; //矩形框右下角y坐标
}RECT;