1 / 211

Windows 程序设计

Windows 程序设计. 主讲:王茂芝 副教授 wangmz@cdut.edu.cn. 参考文献. [1] Windows 程序设计 [ 第 5 版 , 上下册 ] 北京大学出版社 2004 年 , ¥ 160 [2] 黄维通 . Visual C++ 面向对象与可视化程序设计 , 清华大学出版社 ,2000 年 , ¥ 26 [3] 王世同 . VC++6.0 编程基础 , 清华大学出版社 ,1999 年 , ¥ 19.8 [4] 刘文智 . VC++6.0 教程 , 电子工业出版社 , 2000 年 , ¥ 35. 几个概念. C C++

sol
Download Presentation

Windows 程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Windows程序设计 主讲:王茂芝 副教授wangmz@cdut.edu.cn

  2. 参考文献 • [1] Windows程序设计[第5版,上下册] 北京大学出版社 2004年, ¥160 • [2] 黄维通. Visual C++面向对象与可视化程序设计,清华大学出版社,2000年,¥26 • [3] 王世同. VC++6.0编程基础, 清华大学出版社,1999年,¥19.8 • [4] 刘文智. VC++6.0教程, 电子工业出版社, 2000年, ¥35

  3. 几个概念 • C • C++ • VC++ • MFC • Windows程序设计

  4. 几个概念 • 两个技术层面 • 使用API函数进行可视化编程 • 使用MFC进行可视化编程 • 平台与环境 • VC++ 6.0 • Visual Studio(其它) • OS(Win32)

  5. 第一章 开始 • 前提条件 • 从用户角度熟悉windows • 了解C语言:特别是C语言的结构和指针 • 在机器上安装适合运行windows编程的32位C语言编译器和开发环境.在此,我们使用MS VC++ 6.0

  6. 1.1 windows环境 • Windows简史 • 1981年秋天,IBM PC推出不久,PC上的主流操作系统将是MS-DOS.由于内存和硬件的限制,成熟的图形环境是慢慢来到小型计算机中的. • Windows是由MS在1983年11月宣布,并在两年后的1985年11月推出.(平铺窗口) • Windows2.0是在1987年11月推出的.(层迭窗口) • Windows3.0是在1990年5月22日发布的. • MS windows3.1是1992年4月推出的. • 1993年7月引入的windows NT是支持32位模式的第一个windows版本. • Windows95是在1995年8月发布的.(32位) • Windows98是在1998年6月发布的.

  7. Windows操作系统 • Windows98和windows NT都是32位抢占式多任务及多线程图形操作系统. • Windows拥有一个图形用户界面(GUI).所有GUI都是基于位图的视频显示器上使用图形.图形提供了使用屏幕的最佳方式、传递消息的可视化环境、能够WYSIWYG( what you see is what you get:所见即所得)的图形视频显示.

  8. 动态链接 • Windows运转的核心是一个被称为动态链接的概念. • Windows提供了应用程序可利用的丰富的函数调用,大多数用于实现其用户界面和在视频显示器上显示文本和图形.这些函数采用动态链接库即DLL实现. • Kernel32.dll处理传统上由操作系统内核处理的事务:内存管理、文件I/O和任务处理. • User32.dll指用户界面,实现所有窗口逻辑. • GDI32.dll是一个图形设备接口,允许程序在屏幕和打印机上显示文本和图形.

  9. 动态链接(续) • 在windows程序中,使用windows函数的方式通常与使用C库函数的方式相同.主要的区别在于C库函数的机器代码链接到你的程序代码中,而windows函数的代码位于你的程序之外的DLL中.

  10. 1.2 windows编程选项 • API和内存模式 • 对于程序员来说,操作系统是由本身的API定义的.API包含了所有应用程序构造操作系统的函数调用,同时包含了相关的数据类型和结构. • 用于16位版本windows的API(windows1.0到windows3.0)现在被称作win16.用于32位版本windows的API(windows95、windows98和所有版本的windows NT)现在被称作win32.

  11. windows编程选项 • 语言选项 • 使用C语言和原始的API不是编写windows程序的唯一方法.然而,这种方法却提供给你最佳的性能、最强大的功能以及在发掘windows特性方面最大的灵活性. • MS VB或者Borland Delphi • MFC在一个C++类集合中封装了许多windows编程的繁重内容. • Java • Windows是一个复杂的系统,在API上增加一个编程层并未减少它的复杂性,仅仅是掩盖了它.

  12. 编程环境 • 本书假定使用MS VC++6.0,可以是标准版、专业版和企业版. • MS VC++软件包中包含C编译器和其它编译和链接windows程序所需的文件和工具. • MSDN: microsoft developer network

  13. API文档 • http://www.microsoft.com/msdn/

  14. 编程关系与层次图

  15. 1.3 编写第一个windows程序 • 字符模式模型 • #include “stdio.h” • int main() • { • printf(“hello, world\n”); • return 0; • }

  16. Windows等价程序 • 有一个include申明,一个程序入口点,一个函数调用和一个返回语句. • #include “windows.h” • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) • { • MessageBox(NULL,TEXT(“Hello,Windows 98!”),TEXT(“HelloMsg”),0); • return 0; • }

  17. 头文件 • Windows.h是主要的包含文件.它包含了其它windows头文件,这些头文件的某些也包含了其它头文件.这些头文件最重要和最基本的是: • WINDEF.H 基本类型定义 • WINNT.H 支持Uniode的类型定义 • WINBASE.H 内核函数 • WINUSER.H 用户接口函数 • WINGDI.H 图形设备接口函数

  18. 程序入口点 • 正如在C程序中的入口点是函数main一样, windows程序的入口点是WinMain • WinMain的第一个参数称为实例句柄 • WinMain的第二个参数总是NULL • WinMain的第三个参数是用于运行程序的命令行.某些windows应用程序使用这个参数以在程序启动时将文件加载到内存. • WinMain的第四个参数指出程序最初显示的方式.可以是正常地或者是最大化地充满整个窗口,或者是最小化显示在任务列表栏中.

  19. MessageBox函数 • MessageBox的第一个参数通常是窗口句柄 • 第二个参数是在消息框主体中显示的字符串 • 第三个参数是出现在消息框标题栏上的字符串 • 第四个参数可以是在WINUSER.H中定义的一组以前缀MB_开始的常数的组合.

  20. 编译、链接和运行 • 正常情况下,编译阶段编译器把C源代码文件转换成.OBJ目标文件 • 在链接阶段,链接程序结合.OBJ文件和.LIB库文件以建立.EXE可执行文件.

  21. 第二章 窗口和消息 • 在windows中,窗口一词有确切的含义.一个窗口就是屏幕上一个矩形区域,它接受用户的输入,并以文本或图形的格式显示输出内容.

  22. 2.1 自己的窗口 • 创建窗口很简单,只需调用CreateWindows函数即可. • 虽然创建窗口的函数被命名为CreateWindows,但它的第一个参数就是所谓的“窗口类名称”,并且该窗口类连接所谓的“窗口过程”.

  23. 总体结构 • 桌面上最明显的窗口就是应用程序窗口.这些窗口含有显示程序名称的标题栏、菜单,甚至可能还有工具栏和滚动条.另一类窗口就是对话框. • 窗口以消息的形式接受窗口的输入,窗口也用消息与其它窗口通讯.对消息的理解将是学习如何编写windows程序必须逾越的障碍之一.

  24. • 这有一个windows的消息示例:我们知道,大多数windows程序都有大小合适的应用程序的窗口.也就是说,你能够通过鼠标拖动窗口的边框来改变窗口的大小.通常,程序将通过改变窗口中的内容来响应这种大小的变化. • 是Windows本身而不是应用程序正在处理与用户重新调整窗口大小相关的全部代码.

  25. • 应用程序是如何知道用户改变了窗口的大小的呢?问题的关键在于理解windows所使用的体系结构.当用户改变窗口的大小时, windows给程序发动一条消息指出新窗口的大小.然后程序就可以调整窗口中的内容,以反映大小的变化. • 其实,所谓windows给程序发送消息,是指windows调用程序中的一个函数,该函数的参数描述了这个特定消息.这种位于windows程序中的函数被称为窗口过程. • 读者所不习惯的,可能是操作系统调用程序,而这正是windows面向对向体系结构的基础.

  26. • 程序创建的每一个窗口都有相关的窗口过程.这个过程是一个函数,既可以在程序中,也可以在动态链接库中.windows通过调用窗口过程来给窗口发送消息,窗口过程根据此消息进行处理,然后将控制返回给windows. • 更确切地说,窗口通常是在窗口类的基础上创建的.窗口类标识了处理窗口消息的窗口过程.使用窗口类使多个窗口能够基于同一个窗口类,并且使用同一个窗口过程.例如,所有windows程序中的按钮均基于同一个窗口类.这个窗口类与一个位于windows动态链接库处理所有的按钮窗口消息的窗口过程相联系.

  27. • 在面向对象的程序设计中,对象是代码与数据的结合.窗口是一种对象,其代码是窗口过程,数据是窗口过程保存的信息,以及windows为每个窗口系统中那个窗口类保存的信息. • 窗口过程处理给窗口发送的消息. • Windows程序开始执行后,windows为该程序创建一个消息队列,这个消息队列用来保存该程序可能创建的各种不同窗口消息.程序中有一小段代码,叫做消息循环,用来从队列中取出消息.并且将他们发送给相应的窗口过程.有些消息直接发送给窗口过程,不用放入消息队列中.

  28. HELLOWIN程序 • 创建一个窗口首先需要注册一个窗口类,那需要一个窗口过程来处理窗口消息.这包括一段几乎出现在每一个windows程序中的固定代码. • 实例见VC++6.0源程序代码

  29. 总体考虑 • 注意,在hellowin.c中没有调用WndProc的代码,然而,在WinMain中有对WndProc的声明,这就是函数要在程序顶部附近声明的原因.

  30. LoadIcon LoadCursor GetStockObject RegisterClass MessageBox CreateWindow ShowWindow UpdateWindow GetMessage TranslateMessage DispatchMessage PlaySound BeginPaint GetClientRect DrawText EndPaint PostQuitMessage DefWindowProc Windows函数调用

  31. 这些都是简单的数值常量.前缀指示该常量所属的类别.这些都是简单的数值常量.前缀指示该常量所属的类别. 在编写windows程序时,不用记这些数值常量,实际上, windows中使用的每个数值常量在头文件中均有相应的标识符定义. CS 类风格选项 CW 创建窗口选项 DT 绘制文本选项 IDI 图标ID号 IDC 光标ID号 MB 消息框选项 SND 声音选项 WM 窗口消息 WS 窗口风格 大写的标识符

  32. 新的数据类型 • MSG 消息结构 • WNDCLASS 窗口类结构 • PAINTSTRUCT 绘图结构 • RECT 矩形结构

  33. 句柄简介 • 句柄是一个数(通常为32位),它代表一个对象.windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄.程序几乎总是通过调用windows函数获取句柄.程序在其它windows函数中使用这个句柄,以引用它代表的对象. • HINSTANCE 实例(程序自身)句柄 • HWND 窗口句柄 • HDC 设备描述表句柄

  34. 匈牙利表示法 • 许多windows程序员使用一种叫做匈牙利表示法的变量命名约定.变量名以一个或者多个小写字母开始,这些字母表示变量的数据类型. • 在命名结构变量时,可以用结构名的小写作为变量名的前缀,或者用作整个变量名. • 匈牙利表示法能够帮助程序员及早发现并避免代码中的错误.

  35. c char或WCHAR或TCHAR by BYTE无符号字符 n short i int x,y int分别用作x和y坐标 cx,cy int分别用作x和y的长度 b,f BOOL(int);flag w WORD无符号short l LONG长整型 dw DWORD无符号长整型 fn 函数 s string(串) sz 以0字节结尾的串 h 句柄 p 指针 续

  36. 程序结构安排 • 注册窗口类 • 创建窗口 • 消息循环 • 窗口过程 • 处理消息

  37. 注册窗口类 • 在为程序创建窗口之前,必须首先调用RegisterClass注册一个窗口类.该函数只需一个参数,即一个指向类型为WNDCLASS的结构指针. • 在WNDCLASS结构中最重要的两个域是第二个和最后一个.第二个域是所有基于这个类来创建的窗口所使用的窗口过程的地址.最后一个域是窗口类的文本名.程序员可以随意定义其名称.在只创建一个窗口的程序中,窗口类名称通常设置为程序名称.

  38. 创建窗口 • 窗口类定义了窗口的一般特征,因此可以使用同一窗口类创建许多不同的窗口.实际调用CreateWindow创建窗口时,可能指定有关窗口的更详细的信息. • 新的windows程序员可能有时会混淆窗口类和窗口之间的区别,以及为什么一个窗口的所有特征不能一步到位地指定.实际上,以这种方式分开这些风格信息是非常方便的. • 传递给RegisterClass函数的信息在一个数据结构中说明,而传递给CreateWindow函数的信息作为函数的单独参数来说明.

  39. 显示窗口 • 在CreateWindow调用返回之后,window内部已经创建了这个窗口.这就是说,windows已经分配了一块内存,用来保存关于在CreateWindow调用中指定窗口的全部信息,再加上windows在随后所能找到的所有其它信息.

  40. 消息循环 • Windows为当前运行的每个windows程序维护一个消息队列.在发生输入事件之后, windows将事件转换为一个消息,并将消息放入程序的消息队列中. • 程序通过执行一块被称为消息循环的代码从消息队列中取出消息.

  41. 窗口过程 • 实际的动作发生在窗口过程中.窗口过程确定了在窗口的客户区域中显示些什么,以及窗口怎样响应用户输入. • 一个windows程序可以包含多个窗口过程,一个窗口过程总是与调用RegisterClass注册的特定窗口类相关联.CreateWindow函数根据特定窗口类创建一个窗口.但基于一个窗口类,可以创建多个窗口. • 程序通常不直接调用窗口过程,窗口过程通常由windows本身调用.

  42. 处理消息 • 一般来说,windows程序员使用switch和case结构来确定窗口过程接受的是什么消息,以及如何适当地处理它.窗口过程在处理消息时,必须返回0.窗口过程不予处理的所有消息应该被传给名为DefWindowProc的windows函数.从DefWindowProc返回的值必须由窗口过程返回. • 调用DefWindowProc来为窗口过程不予处理的所有消息提供默认处理,这是很重要的.

  43. WM_PAINT消息 • 这个消息在windows程序设计中是很重要的.当窗口客户区域的一部分或者全部变为无效,以致于必须刷新时,将由这个消息通知程序.

  44. 2.2 windows编程的难点 • 在为传统环境编写简单的C程序时,整个程序可能包含在main函数中,而在WinMain中只包含了注册窗口类、创建窗口、从消息队列中取出消息和发送消息所必须的代码. • 程序的所有实际动作均在窗口过程中发生. • Windows程序所做的一切都是响应发送给窗口过程的消息.这是概念上的主要难点之一,在开始编写windows程序之前,必须先搞清楚.

  45. 别调用我,我会调用你 • Windows也调用用户程序.windows通过调用窗口过程来给窗口发送一个消息. • 在大多数windows程序中,程序的主要部分都用来处理消息.windows可以发送给窗口过程的消息通常都以WM打头的名字标识,并且都在WINUSER.H头文件中定义.

  46. 也就是说,进队的消息发送给消息队列,而不进队的消息发送给窗口过程.任何情况下,窗口过程都将获得窗口所有的消息(包括进队的和不进队的),窗口过程是窗口的消息中心.也就是说,进队的消息发送给消息队列,而不进队的消息发送给窗口过程.任何情况下,窗口过程都将获得窗口所有的消息(包括进队的和不进队的),窗口过程是窗口的消息中心. 进队消息和不进队消息 消息 程序消息队列 进队消息 GetMessage 不进队消息 窗口过程 Windows DispatchMessage

  47. 第三章 VC++程序设计基础 • 应用程序的类型: • P47有详细的描述与说明 • 比较常用的几种 • 创建基于对话框的应用程序 • 过程演示 • 使用消息框 • 图标和按钮(组合使用)

  48. 其它问题 • VC++中基本数据类型 • Windows编程约定 • 匈牙利命名规则 • 其它前缀约定 • AFX和AppWizard前缀

  49. 第四章 制作含编辑框的应用程序 • 将windows风格中的图形用户界面中比较常用的重要控件的制作进行详细介绍 • 本章介绍的编辑框控件,在windows风格的图形用户界面中是一个很重要的控件

  50. 应用程序的功能

More Related