1 / 161

第二章

第二章. Windows 编程基础. Windows 操作系统简介. 标准的用户界面 图形用户界面 WYSIWYG 多任务 内存管理机制 设备独立性. Windows 编程的特点. 消息驱动体系 DOS 编程方式属过程驱动。 Windows 编程方式属消息驱动 (程序的工作是产生消息,传递消息和处理消息)。. 开始. 开始. 事件 1. 过程 1. 事件 2. 过程 2. 消息 处理. 事件 3. …. 过程 n. 事件 n. 结束. 结束. 过程驱动编程模型. 事件驱动编程模型. 图形用户界面.

jeb
Download Presentation

第二章

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 编程基础

  2. Windows 操作系统简介 • 标准的用户界面 • 图形用户界面 • WYSIWYG • 多任务 • 内存管理机制 • 设备独立性

  3. Windows 编程的特点 消息驱动体系 DOS 编程方式属过程驱动。 Windows 编程方式属消息驱动 (程序的工作是产生消息,传递消息和处理消息)。

  4. 开始 开始 事件1 过程1 事件2 过程2 消息 处理 事件3 ... …... 过程n 事件n 结束 结束 过程驱动编程模型 事件驱动编程模型

  5. 图形用户界面 • 窗口 (window) 由句柄唯一标识 • 对话框 (Dialog) 人机交互 • 图标 (Icon) 代表某项操作或程序的图符 • 位图 (Bitmap) 用位模式形成的图像 • 菜单(Menu) 命令 • 工具栏 (ToolBar) 常用的菜单项 • 状态栏(StateBar) 操作状态或操作提示

  6. 2.2 Windows编程基础 桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。另一类窗口是对话框,它可以有标题列也可以没有标题列。 装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。

  7. 窗口以「消息」的形式接收窗口的输入,窗口也用消息与其它窗口通讯 . 所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。 窗口消息处理程序根据此消息进行处理,然后将控制传回给Windows。

  8. 窗口代码分析 程序中有主函数WinMain函数,还有另外一个函数,名为WndProc。这就是窗口消息处理程序 。 • 程序中用了16个Windows函数。下面以它们在程序中出现的次序列出这些函数以及各自的简明描述: • LoadIcon 加载图标供程序使用。 • LoadCursor 加载鼠标光标供程序使用。 • GetStockObject 取得一个图形对象(在这个例子中,是取得绘制窗口背景的画刷对象)。

  9. RegisterClass Ex为程序窗口注册窗口类别。 • CreateWindow Ex根据窗口类别建立一个窗口。 • MessageBox 显示消息框。 • ShowWindow 在屏幕上显示窗口。 • UpdateWindow 指示窗口自我更新。 • GetMessage 从消息队列中取得消息。 • TranslateMessage 转译某些键盘消息。 • DispatchMessage 将消息发送给窗口消息处理程序。

  10. BeginPaint 开始绘制窗口。 • TextOut 显示字符串。 • EndPaint 结束绘制窗口。 • PostQuitMessage 在消息队列中插入一个「退出程序」消息。 • DefWindowProc 执行内定的消息处理。

  11. 程序中遇到的标示符

  12. 前缀 类别 CS 窗口类别样式 CW 建立窗口 DT 绘制文字 IDI 图示ID IDC 游标ID MB 消息框 SND 声音 WM 窗口消息 WS 窗口样式

  13. 新的数据型态 • 新的数据型态,也在Windows表头文件中使用typedef叙述或者#define叙述加以定义。 • WndProc函数传回一个型态为LRESULT的值,该值简单地被定义为一个LONG。WinMain函数被指定了一个WINAPI型态(在表头文件中定义的所有Windows函数都被指定这种型态),而WndProc函数被指定一个CALLBACK型态。这两个标识符都被定义为_stdcall,表示在Windows本身和使用者的应用程序之间发生的函数呼叫的呼叫参数传递方式。

  14. 数据结构 结构 含义 • MSG 消息结构 • WNDCLASS 窗口类别结构 • PAINTSTRUCT 绘图结构 • RECT 矩形结构

  15. 句柄 标识符 含义 HINSTANCE 执行实体(程序自身)句柄 HWND 窗口句柄 HDC 设备内容句柄 句柄是一个(通常为32位的)整数,它代表一个对象。Windows中的句柄类似传统C或者MS-DOS程序设计中使用的文件句柄。程序几乎总是通过呼叫Windows函数取得句柄。程序在其它Windows函数中使用这个句柄,以使用它代表的对象。代号的实际值对程序来说是无关紧要的。但是,向您的程序提供代号的Windows模块知道如何利用它来使用相对应的对象。

  16. 匈牙利表示法 变量名以一个或者多个小写字母开始,这些字母表示变量的数据型态。例如,szCmdLine中的sz代表「以0结尾的字符串」。在hInstance和hPrevInstance中的h前缀表示「句柄」;在iCmdShow中的i前缀表示「整数」。 在命名结构变量时,可以用结构名(或者结构名的一种缩写)的小写作为变量名的前缀,或者用作整个变量名。例如,在WinMain函数中,msg变量是MSG型态的结构;wndclass是WNDCLASSEX型态的一个结构。在WndPmc函数中,ps是一个PAINTSTRUCT结构,rect是一个RECT结构。

  17. Windows变量的常用前缀 前 缀 变量意义 b 布尔量(非0是TRUE,0是FALSE) c 字符量(一个字节值) dw 32位无符号长型整数 f 用16位整数表示的一种位标记 h 16位句柄 l 32位长整数 lp 32位长指针 n 16位短整数 p 16位短指针 pt 坐标量(x,y),放在32位无符号整数中 rgb RGB颜色值,放在32位整数中

  18. 注册窗口类别 不同窗口可以依照同一种窗口类别建立。例如,Windows中的所有按钮窗口-包括按键、复选框,以及单选按钮-都是依据同一种窗口类别建立的。窗口类别定义了窗口消息处理程序和依据此类别建立的窗口的其它特征。在建立窗口时,要定义一些该窗口所独有的特征。 WNDCLASS wndclass ;

  19. 然后,初始化该结构的10个字段,并呼叫RegisterClass。然后,初始化该结构的10个字段,并呼叫RegisterClass。 在WNDCLASS结构中最重要的两个字段是第三个和倒数第二个,第三个字段(lpfnWndProc) 是依据这个类别来建立的所有窗口所使用的窗口消息处理程序的地址。倒数第二个字段是窗口类别的文字名称。程序写作者可以随意定义其名称。在只建立一个窗口的程序中,窗口类别名称通常设定为程序名称。 在初始化该结构的10个字段后,呼叫RegisterClass来注册这个窗口类别。该函数只有一个参数,即指向WNDCLASS结构的指针

  20. 窗口类别和窗口之间的区别 所有的按钮窗口都可以依据同样的窗口类别来建立,与这个窗口类别相关的窗口消息处理程序位于Windows内部。由窗口类别来负责处理按钮的键盘和鼠标输入,并定义按钮在屏幕上的外观形象。从这一点看来,所有的按钮都是以同样的方式工作的。但是并非所有的按钮都是一样的。它们可以有不同的大小,不同的屏幕位置,以及不同的字符串。后面的这样一些特征是窗口定义的一部分,而不是窗口类别定义的。

  21. WS_OVERLAPPEDWINDOW,出现在CreateWindow的「窗口样式」参数中。在WINUSER.H,中它是几种位旗标的组合: #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | \ WS_CAPTION | \ WS_SYSMENU | \ WS_THICKFRAME | \ WS_MINIMIZEBOX | \ WS_MAXIMIZEBOX)

  22. API函数分类Application Programming Interface • 窗口管理接口函数USER32.DLL • 图形设备接口函数GDI32.DLL • 系统服务接口函数KERNEL32.DLL

  23. 消息 • 消息的功能: • (1)帮助Windows实现多任务 • (2)通知应用程序某一事件已经发生,各应用程序给予响应

  24. 消息的种类 • 标准Windows消息 • 除WM_COMMAND外,所有以WM_ 为前缀的消息,由窗口和视图处理。 • 控制消息 • 由控件和子窗口发给父窗口的消息。 • 命令消息 • 来自用户接口对象。如:菜单、工具条和加速键等。

  25. 消息的定义 typedef struct tagMSG { HWND hwnd; //接收窗口 UINT message; //消息标识 WPARAM wParam; //附加 LPARAM lParam; //附加 DWORD time; //入队时间 POINT pt; //光标位置 } MSG;

  26. 消息的产生 • 用户产生消息 • Windows 本身产生消息 • 应用程序本身产生消息 • 其他应用程序产生消息

  27. 消息的传递 • Windows系统有一个存放消息的队列,每个应用程序也有一个消息队列。Windows系统先将收到的消息存放在系统队列中;然后再分发到相应的应用程序队列中。应用程序则从自身的队列中获取消息并进行处理。

  28. 事 件 事 件 事件 系统消息队列 应用程序队列 应用程序队列 应用程序队列 应用程序 应用程序 应用程序

  29. case WM_CREATE: • { • PlaySound( "C:\\WINDOWS\\Media\\ringin.wav", NULL, SND_FILENAME | SND_ASYNC) ; • return 0 ; • }

  30. case WM_LBUTTONDOWN: • { • char szPoint[56]; • wsprintf(szPoint,"X =%d,Y =%d",LOWORD(lParam),HIWORD(lParam)) • str = szPoint; • if(wParam & MK_SHIFT) • str = str + " Shift Key is down"; • ::InvalidateRect(hwnd,NULL,1); • return 0; • }

  31. WM_PAINT消息 • 大多数Windows程序在WinMain中进入消息循环之前的初始化期间都要呼叫函数UpdateWindow。Windows利用这个机会给窗口消息处理程序发送第一个WM_PAINT消息。这个消息通知窗口消息处理程序:必须绘制显示区域。 在发生下面几种事件之一时,窗口消息处理程序会接收到一个WM_PAINT消息: • 1.在使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重新可见。  • 2.使用者改变窗口的大小(如果窗口类别样式有着CS_HREDRAW和CS_VREDRAW位设定)。  • 3.程序使用ScrollWindow或ScrollDC函数滚动显示区域的一部分。  • 4.程序使用InvalidateRect或InvalidateRgn函数刻意产生WM_PAINT消息。

  32. 在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息:在某些情况下,显示区域的一部分被临时覆盖,Windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功。在以下情况下,Windows可能发送WM_PAINT消息: • 1.Windows擦除覆盖了部分窗口的对话框或消息框。  • 2.菜单下拉出来,然后被释放。  • 3.显示工具提示消息。  • 在某些情况下,Windows总是保存它所覆盖的显示区域,然后恢复它。这些情况是: • 鼠标光标穿越显示区域。  • 图标拖过显示区域。

  33. 有效矩形和无效矩形 尽管窗口消息处理程序一旦接收到WM_PAINT消息之后,就准备更新整个显示区域,但它经常只需要更新一个较小的区域 。 如:当对话框覆盖了部分显示区域时,在擦除对话框之后,需要重画的只是先前被对话框遮住的矩形区域。 这个区域称为「无效区域」或「更新区域

  34. 要在窗口的显示区域绘图,可以使用Windows的图形设备接口(GDI)函数。Windows提供了几个GDI函数,用于将字符串输出到窗口的显示区域内。要在窗口的显示区域绘图,可以使用Windows的图形设备接口(GDI)函数。Windows提供了几个GDI函数,用于将字符串输出到窗口的显示区域内。 • 目前使用最为普遍的文字输出函数是TextOut。该函数的格式如下: • TextOut (hdc, x, y, psText, iLength) ; • TextOut向窗口的显示区域写入字符串。psText参数是指向字符串的指针,iLength是字符串的长度。x和y参数定义了字符串在显示区域的开始位置

  35. 什么是类 • “类”就是一种类型的对象的表示形式;可以将它想像为描述对象的蓝图。就像一幅蓝图可以用于建成多座建筑一样,一个类也可以用于创建对象的多个副本。

  36. class Humam{var $sex,$name;  //人类有性别,有名字等等//构造函数function Humam()    {......}    //人的出生function Born()    {......}    //人要吃饭function Eat($food)    {......}    //人要睡觉function Sleep($time)    {......}}世界上的物体都可以抽象成一个类,这个类包含了该物体的属性,行为等信息。

  37. 什么是MFC Microsoft Foundation Classes MFC是微软封装了的API。windows作为一个提供功能强大的应用程序接口编程的操作系统,的确方便了许多程序员,传统的win32开发(直接使用windows的接口函数API)对于程序员来说非常的困难,因为,API函数实在太多了,而且名称很乱,从零构架一个窗口动辄就是上百行的代码。MFC是面向对象程序设计与Application framework的完美结合,他将传统的API进行了分类封装,并且为你创建了程序的一般框架。

  38. MFC,实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分 。

  39. MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在Windows(用MFC编写的程序绝大部分都在Windows中运行)中实现内部处理的类,如数据库的管理类等。

  40. 应用程序框架 “应用程序框架” 定义了应用程序的轮廓,为用户提供了标准的实现接口。Windows应用程序的建立都是基于这个框架展开的。

  41. CObject CCmdTarget CWinThread CWnd CFrameWnd CWinApp 程序框架有关的 MFC类结构

  42. CCmdTarget类 CCmdTarget 是 MFC 消息映射 结构的基类。消息映射将命令或 消息发送给应用程序编写的处理 命令或消息的响应函数。具有消 息处理能力的类均应为该类的派 生类。

  43. CWinThread 类 • Microsoft 的类库支持多个线程的并行执行。每个应用程序至少有一个线程(被称作主线程)。CWinThread 封装了操作系统的调度功能。

  44. CWinApp类 • CWinApp 封装了 Windows 应用程序初始化、运行、终止应用程序的代码。基于框架建立的应用程序必须有一个且只有一个从CWinApp派生的类对象。

  45. CWnd类 • CWnd是各种窗口、对话框和控制框的通用基类,提供窗口处理中公共的窗口类注册、窗口创建与撤消等处理操作。

  46. CFrameWnd类 • 提供了一个 Windows 单文档界面,该界面具有重叠或弹出功能,并且可以通过成员函数实现对窗口的某些控制操作。

  47. 基于框架窗口的应用程序结构的类关系 CWinApp 应用程序对象 • m_pMainWnd CFrameWnd 应用程序框架窗口

  48. WinMain函数 • WinMain函数是应用程序的入口。 • 用户不需要编写该函数代码,由应用程序框架提供。主要完成注册窗口类及消息循环等标准服务。程序运行时,Windows自动调用该函数。

  49. CWinApp 对象 • CWinApp 的派生类对象要作为全程量定义。WinMain 函数将会调用 InitApplication和 InitInstance 成员函数。注意:InitInstance是必须覆盖的成员函数。

  50. InitInstance成员函数 • 通常主要负责创建应用程序的主窗口对象,并更新、显示该主窗口。 New ShowWindow UpdateWindow

More Related