资源描述
Windows编程基础知识,内容提要,1 Windows编程概述 2 基本概念 3 Windows程序基本结构 4 程序示例,1.1.Windows编程概述,1 Windows编程,Windws编程 在微软的Windows操作系统下编程 使用的工具 微软公司和其他公司(Boland等)在该操作系统下提供了了很多可视化的开发系统平台,如VC+、VB 、 BC、Delphi等。 我们使用VC+,1 Windows编程(续),可视化开发系统 (资源和工具的集成),源程序 编辑器 编译器,调试工具 语法检查 程序修改 运行监视,应用程序 Help和Setup 开发工具,函数库和 系统函数 开发工具,资源管理器 各种窗口和 控件的编辑器,例程库 及Help,其他 功能,2 Windows程序特点,Windows程序特点 1图形用户界面(窗口)统一、友好 2独立于设备的图形操作(GUI) 3支持多任务机制(多线程) 4事件驱动的程序设计(消息队列机制) 5程序和资源分开、资源共享 6支持应用程序间的数据交换(剪贴板等),2 Windows程序特点(续),一个简单的Windows程序,#include int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) / 产生一个问候小窗口 MessageBox ( NULL, “Hello World!”, “Say Hello”, MB_OK ); return 1; ,3 Windows程序设计方法,传统式写法 使用C语言语法规范的API函数(Application Programming Interface) 交互式写法 使用C+语法规范的MFC类库 (Microsoft Foundation Class) 其他写法 使用模板技术等的ATL模板库 (ActiveX Template Library) 和组件技术等,1.2.基本概念,1 Windows程序及对象,Windows应用程序使用的界面是由各种图形元素组成的图形界面 各个图形元素具有不同的功能 应用程序的用户主要是通过键盘和鼠标对应用程序界面上的图形元素进行操作来与Windows应用程序进行交互的,1 Windows程序及对象(续),在Windows程序(系统)中,存在着许多与DOS应用程序不同的复杂对象 对象和句柄 Windows的程序中,对象是具有规范形态和操作模式的部件,例如窗口、按钮、滚动条等; Windows把为这种复杂对象所定义的标识叫做句柄,应用程序过句柄访问相应的对象信息。 句柄实际上在C/C+中实现为指针(或认为其一个长度为4字节长整数值),1 Windows程序及对象(续),常用句柄类型 HWND窗口句柄 HINSTANCE当前实例句柄 HCURSOR光标句柄 HFONT字体句柄 HPEN画笔句柄 HBRUSH画刷句柄 HDC设备环境句柄 HICON图标句柄 HMENU菜单句柄 HFILE文件句柄,句柄所标识对象实例 窗口 按钮 图标 滚动条 输出设备 控件 文件 程序进程 如此等等.,2 数据类型别名,Windows应用程序中的数据量非常大,为了提高应用程序的可读性,Windows给许多基本数据类型定义了别名,例如: typedef void * HANDLE; typedef unsigned long DWORD; typedef int BOOL; typedef unsigned char BYTE; typedef unsigned short WORD;,2 数据类型别名(续),Windows应用程序还使用了一些结构类型的数据,例如: typedefstructtagPOINT LONG x, y; POINT; / 描述了一个点的位置。,3 窗口及其功能,窗口Windows程序界面的主要组成 典型窗口及其构成,控制菜单框,标题栏,3 窗口及其功能(续),窗口功能 1 系统对应用程序管理的基本单位 2 应用程序与用户之间交互的接口环境 3 Window应用程序基本的操作单元 Windows应用程序编程 创建一个或多个窗口 Windows应用程序运行 窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与交换的过程,4 消息的概念,消息应用程序与系统及其它应用程序进行信息交换的数据结构 消息的三个组成部分: 消息号:由事先定义好的消息名标识 字参数(wParam) :提供消息的附加信息 长字参数(lParam) :提供消息的附加信息 附加信息与具体消息号的值有关,4 消息的概念(续),消息的结构,typedef struct tagMSG HWND hwnd; /窗口句柄,为null,则检索队的所有消息 UINT message;/消息号,由Windows.h中的宏定义来标识 WPARAM wParam; /消息的附加信息 LPARAM lParam; /消息的附加信息 DWORD time; /指定消息送至队列的时间 POINT pt; /指定消息发送时屏幕光标的位置 MSG;,4 消息的概念(续),系统能产生很多消息 各种消息分类,分别以不同的前缀表示: WM 窗口消息 BM 按钮控制消息 CB 组合框控制消息 DM 默认下压式按钮控制消息 EM 编辑控制消息 LB 列表框控制消息 SBM 滚动条控制消息,4 消息的概念(续),常见的Windows消息有,5 事件及事件驱动,事件系统运行时发生的事情 事件通常以以下三种方式产生: l通过输入设备,如键盘和鼠标; l通过屏幕上可视的对象,如菜单、工具栏按钮、滚动条和对话框上的控件; l来自Windows内部,如当一个后面的窗口显示到前面来时。 事件的结果系统以消息的形式记录 事件的结果即消息,5 事件及事件驱动(续),Windows程序和系统是事件驱动的,事件驱动也称消息驱动,事件驱动模型如下:,5 事件及事件驱动(续),操作系统会用特定的机构管理消息 消息队列 作为结果的消息,系统以队列形式进行管理 操作系统(软件程序)有监控机构、管理机构、通讯机构等 应用程序在这些机构的管理下运行,5 事件及事件驱动(续),支持队列特征的消息驱动模型,6 API函数,Windows提供了大量预定义的用C语言编写的函数和数据结构集合,该集合叫API(Application Programming Interface) 早期的Windows应用程序设计人员要使用相应的API函数来编写程序。 类型别名和MSG等结构都包含在API中,6 API函数(续),根据Windows API函数的功能,可以将其分为三类: 1)管理函数:实现窗口和其它对象的创建、移动和修改等功能。 2)图形设备函数:实现与设备无关的图形操作功能,可以实现图形绘制。 3)系统服务函数:实现与操作系统有关的多种功能,如进程线程管理、任务调度等。,1.3.Win32程序基本结构,1 应用程序的组成,Windows 程序分为“程序代码”和“UI(User Interface)资源”两大部份 所谓 UI 资源是指功能菜单、对话框外貌、程序图标、光标形状等 一个完整的Windows应用程序通常包含如下几种类型的文件: C/C+语言源程序文件(.c或.cpp) 头文件(.h) 资源描述文件(.rc) 模块定义文件(.def).,1 应用程序的组成(续),源程序组成 源程序主要由主函数(入口函数)和窗口函数及其相关函数组成 WinMain和WinProc是Win32源程序主体 前者是应用程序的入口,类似main函数,2 WinMain函数,三个基本的组成部分: 函数说明 初始化 消息循环 功能 注册窗口类,建立窗口及初始化 进入消息循环,据消息调用相应的处理过程 当消息循环检索到WM_QUIT时终止程序运行,2 WinMain函数(续),函数(原型)说明,注意!Windows操作系统是多任务管理的,同一应用程序可能同时存在多个窗口,Windows系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识它。,int WINAPI WinMain ( HINSTANCE hThisInst,应用当前实例句柄 HINSTANCe hPrevInst,应用其他实例句柄 LPSTR lpszCmdLine, 指向命令行参数的指针 Int nCmdShow初始窗口显示方式的整数值标识 ),2 WinMain函数(续),初始化 初始化包括窗口类的定义、注册窗口类、创建窗口和显示窗口四部分。需要注意的是,在显示窗口ShowWindow函数后,需调用UpdateWindow函数更新并绘制用户区,并发出WM_PAINT消息。,2 WinMain函数(续),消息循环 应用程序通常有一段代码称为消息循环,又称为消息泵,它是程序的动力结构,形式如下,MSG msg; /从消息队列中提取消息 while (GetMessage( /将消息传送到指定窗口函数 / 以上出现的函数都是 Windows API 函数,2 WinMain函数(续),消息循环中: 函数GetMessage形式为: GetMessage(lpMSG, /指向MSG结构的指针 hwnd, nMsgFilteMin, /用于消息过滤的最小消息号值 nMsgFilterMax /用于消息过滤的最大消息号值) GetMessage从消息队列中读取消息,并将消息放在MSG结构中,返回零值,即检索到WM_QUIT消息,程序结束循环并退出,2 WinMain函数(续),DispatchMessage函数 该函数负责将消息分发给窗口函数(可以理解为其用指针间接调用了窗口过程函数) 在窗口产生过程中,要使用函数指针为窗口联系一个函数(通常为WndProc) WndProc窗口函数是程序和用户交互的主要处理部分!,3 窗口函数WinProc,WndProc函数由一个或多个switch语句组成。每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。,WndProc,包含了对各种可能接收到的消息的处理过程,定义了应用程序对接收到的不同消息的响应,窗口函数的一般形式如下: 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为应用程序的退出代码,为未定义处理过程的消息提供缺省处理,4 程序与系统之间的关系,操作系统监控机构感知事件并产生消息 系统将消息发给活动窗口消息队列 应用程序拥有一个消息队列 程序处理过程: 消息泵获得消息GetMessage,然后分发消息DispatchMessage给窗口过程WndProc(函数调用过程)作相应处理返回,接下来再获取消息,如此循环重复,直到GetMessage检到WM_QUIT消息返回0值。,4 程序与系统之间的关系(续),1.4.完整程序示例,应用程序举例,#include/包含应用程序中所需的数据类型和数据结构的定义 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;/窗口标题名,/窗口类的定义 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 ; /窗口类名为窗口,/- 以下进行窗口类的注册 - if(!RegisterClass( ,/- 显示窗口 - ShowWindow( hwnd, nCmdShow) ; /- 绘制用户区 - UpdateWindow(hwnd); /- 消息循环 - while( GetMessage(/消息循环结束即程序终止时将信息返回系统 ,/窗口函数 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消息,第1章 Windows编程基础知识,完,
展开阅读全文