第1章:API编程、Windows程序基本结构.ppt_第1页
第1章:API编程、Windows程序基本结构.ppt_第2页
第1章:API编程、Windows程序基本结构.ppt_第3页
第1章:API编程、Windows程序基本结构.ppt_第4页
第1章:API编程、Windows程序基本结构.ppt_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MFC Windows应用程序设计,第1章 Windows应用程序基本知识,课程介绍,教材:MFC Windows应用程序设计(64学时) 内容: 介绍Visual C+开发过程,讲述API与MFC开发Windows应用程序的理念、方法及步骤。 教学目的: 通过本课程的学习,使我们熟悉采用面向对象编程语言进行Windows 可视化开发,掌握面向对象的编程思想,熟悉面向对象编程的消息响应。 理解Windows应用程序的基本原理。 教学方法: 讲课与上机实验相结合,并辅以实际应用案例、常见问题分析等,巩固所学内容。每次课分成两部分:基本知识案例教学。 上机与考试 周5第3大节上机,第17周周5第3

2、大节考试。,1.1 基本概念,编程工具,编程语言,源程序,编译器,目标程序,连接器,可执行程序,操作系统,加载 运行,Visual Basic Delphi Powerbuilder CBuilder Visual C Visual studio .NET Ellipse,Basic语言 Pascal语言 C语言 C.NET Basic.NET C+.NET Java,.NET FrameWork,1.1 基本概念,MFC类库,.NET FrameWork,FrameWork Class Library(FCL),Common Luanguage Runtime(CLR),1.1 基本概念,V

3、isual C:微软公司出品的C语言开发工具,允许程序员使用C语言以可视化的编程方式快速开发基于Windows平台的系统软件及应用软件。 Windows API:Windows操作系统的应用编程接口,它是操作系统的一部分,由数千个函数组成,程序员可以在自己的程序里调用API函数以利用操作系统内置的一些功能。 MFC:微软基础类库。依据面向对象编程思想将API函数封装在几百个C+类中,使程序员可以利用面向对象的方法开发程序。 C语言标准:C语言是一种通用的计算机编程语言,国际标准化组织已经对其语法和基本类库进行了标准化,很多公司依据C语言标准推出了自己的C开发工具,Visual C只是其中一种。

4、,1.1 基本概念,1、Windows应用程序的界面 窗口:屏幕上的一块区域,是应用程序的主要输入输出部件,每个应用程序都拥有一个或多个窗口,开发Windows程序的第一步就是建立窗口。 窗口有两种存在形式: 打开的窗口和图标(最小化的窗口) 编写一个Windows应用程序,首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理和数据交换的过程 菜单(工具栏):属于某个窗口,用户通过菜单向应用程序发送命令。 对话框:一种特殊的窗口,一般用于与用户交互。 控件:对话框中可以包含很多种控件,例如按钮、编辑框、列表框、滚动条等。从本质上讲,控件也是窗

5、口。,1.1 基本概念,2、开发Windows应用程序的方法 (1)使用Windows API函数: API函数是Windows系统提供的编程接口,大致分为3类: 窗口管理函数:窗口的创建、移动、修改等。 图形设备接口函数:实现在窗口的客户区绘制图形和文本。 系统服务函数:实现与操作系统有关的多种功能,例如多线程控制等。 (2)使用MFC类库: 类库中存放了大量预先定义的类,以面向对象的思想封装了API函数,程序员可以直接将这些类放到自己的程序里。 (3)使用.NET框架类库 (4)使用其它类库(OWL、JAVA SSH框架),1.1 基本概念,3、Windows应用程序中的数据类型 为了使程

6、序的语义更加丰富,Windows在C语言的基础上自定义了很多种数据类型。例如: HWND无符号32位整数 HDC HINSTANCE DWORDunsigned long BOOLbool BYTEunsigned char UINTunsigned int 注意:Windows自定义数据类型的关键字都是大写,1.1 基本概念,3、 Windows应用程序中的数据类型 为了使Windows编程工作更为直观,微软公司的SDK软件包定义了大量的数据类型,如HWND、HINSTANCE、UINT、HDC、HPEN、HBRUSH、HANDLE等。这些数据类型大部分实际上是32位整数。(参见P3) 首先

7、需要说明的是,这些数据类型不属于标准C的范围,它们是微软公司自己使用typedef关键字定义的,目的是使编程更为方便。 另外,微软还定义了大量的符号常量(参见P4),如 WM_KEYDOWN、WM_PAINT、WM_CLOSE(消息号) SW_SHOW SW_SHOWMINIMIZE SW_SHOWMAXMIZE(窗口显示方式) 这些符号常量对应着一个具体的数值,例如: #define WM_KEYDOWN0 x0100 #define WM_KEYUP0 x0101 #define WM_MOUSEMOVE0 x0100 在程序中当然可以直接使用具体数值,但很不方便,推荐使用符号常量。 数据

8、类型和符号常量的定义带来两个结果:一方面使初学者难以入门,觉得Windows程序晦涩难懂,一方面使程序更易维护和升级。,1.1 基本概念,4、匈牙利表示法: 一个标识符可由多个英文单词组成,每个英文单词的第一个字母大写。例如: CreateWindow、ShowWindow、GetMessage HWND CreateWindow( LPCTSTR lpClassName, / pointer to registered class name LPCTSTR lpWindowName, / pointer to window name DWORD dwStyle, / window style

9、 int x, / horizontal position of window int y, / vertical position of window int nWidth, / window width int nHeight, / window height HWND hWndParent, / handle to parent or owner window HMENU hMenu, / handle to menu or child-window identifier HANDLE hInstance, / handle to application instance LPVOID

10、lpParam / pointer to window-creation data );,1.1 基本概念,5、Windows对象与句柄 Windows对象是内存中构建的程序实体,Windows预定义了很多数据类型和数据结构,包括窗口、按钮、对话框、画笔、画刷、字体等。我们编程序时要按照预定义的数据结构在内存中构建具体的对象,并使用API函数操纵这些对象,最终完成用户要求的功能。 句柄(handle)是应用程序中能够唯一表示对象的一个整数数值,通过句柄可访问句柄代表的对象,进行适当的操作。形象地说,句柄是Windows世界里对象的身份证号码。如HWND。(P3) 注意:C对象与Windows对

11、象是两个不同的概念,Windows对象是C语言概念上的数据集合,可以理解为Windows系统的组成部分。而C对象属于应用程序,是根据C类构造的数据的集合,并拥有自己的行为-成员函数。 在MFC编程中,我们经常将一个C对象与一个Windows对象关联起来,以面向对象的方式进行编程。,1.1 基本概念,6、事件驱动 与传统的基于DOS的程序不同(我们学C语言时编制的程序都是传统的程序)。Windows程序的运行是由事件驱动的。所谓事件,指用户对计算机的一个操作,如敲击键盘、点击鼠标等。(注:Windows内核也可以产生事件。) 开发基于DOS的程序时,程序开发者处于完全支配的状态,程序执行流程遵从

12、程序员预先规定的路径。 Windows程序的执行顺序取决于事件发生的顺序。 以学生成绩管理系统为例: 如果选择增加一名学生,必须将这个操作进行到底,而如果是Windows程序,可以在操作中间切换到其他操作。,1.1 基本概念,7、消息 所谓消息,是对事件的描述。 Windows系统为所有可能的事件都预定义了消息,当事件发生时,Windows就产生描述该事件的消息,并将其发往适当的应用程序,应用程序收到消息后执行与消息对应的代码段。 例如,当用户敲击键盘,便产生了两条消息: WM_KEYDOWN和WM_KEYUP,它们分别对应某个键的按下与释放。如果我们在程序中为这两个消息指定了代码段,该代码段

13、将被执行。 程序的执行顺序由顺序产生的消息驱动,所以Windows程序设计的重点是编写处理消息的代码段。 程序员可根据消息类型编写程序以处理接收的消息,或者发出其他消息以驱动其他程序,但是不必预先确定消息产生的次序。,1.1 基本概念,8、描述消息的C结构 typedef struct tagMSG / msg HWND hwnd; /Handle to the window whose window procedure receives the message. UINT message; /Specifies the message number WPARAM wParam; /Speci

14、fies additional information about the message. The exact meaning depends on the value of the message member LPARAM lParam; /Specifies additional information about the message. The exact meaning depends on the value of the message member. DWORD time; /Specifies the time at which the message was poste

15、d. POINT pt; /Specifies the cursor position, in screen coordinates, when the message was posted MSG; MSG由Windows系统负责生成和填写,每发生一个事件,就会生成一个结构变量,然后放到消息队列中,等待应用程序将其取走。,1.1 基本概念,9、消息循环 无论是用户消息还是系统消息,消息产生后首先交给操作系统,操作系统将消息暂存在消息队列里。Windows为每个应用程序建立了消息队列。可以同时为多个应用程序接收和分配消息。 由于程序的运行是事件驱动的,所以程序加载后便开始等待消息的到来,根据到

16、来的消息内容执行各种不同的操作。 应用程序如何等待消息到来? 方法是在程序中编写一个无限循环语句,每一次循环都从自己的消息队列里取出一个消息,经过适当处理后发送给相应的窗口。 while(GetMessage( /分发消息,实际上是调用相应窗口函数 ,1.1 基本概念,消息获取函数的原型: BOOL GetMessage( LPMSG lpMsg, / address of structure with message HWND hWnd, / handle of window UINT wMsgFilterMin, / first message UINT wMsgFilterMax / l

17、ast message ); 注:如果第二个参数为NULL GetMessage retrieves messages for any window that belongs to the calling thread and thread messages posted to the calling thread via PostThreadMessage. 注: thread messages 表示线程消息,消息分为窗口消息和线程消息,图解消息传递过程(单个应用程序的鼠标消息),Windows,用户在窗口内按下鼠标左键产生 WM_LBUTTONDOWN消息,系统队列,应用程序队列,应用程序

18、,WinMain函数 消息循环 DispatchMessage,Windows收到消息并根据消息中的窗口句柄传送给相应的窗口函数,窗口函数WndProc 调用API函数,执行API函数,图解消息传递过程(多个应用程序的消息传递),用户输入,Windows,应用程序A,应用程序B,系统队列,应用程序A的消息队列,应用程序B的消息队列,WinMain函数 消息循环,窗口函数1,窗口函数2,WinMain函数 消息循环,窗口函数1,窗口函数2,1.2 Windows应用程序的结构,(演示程序ex1_1) Windwos 应用程序具有相对固定的基本结构,由WinMain函数和WndProc函数构成。

19、WinMain函数:是所有Windows程序的入口,类似C语言的main函数,完成一系列的定义和初始化工作,并产生消息循环。消息循环是整个程序运行的核心。 WndProc函数:窗口函数,与应用程序的某个窗口对应,发往窗口的消息由与之对应的窗口函数处理,编程的主要工作是编写WndProc函数。 注:WinMain函数的名字是固定的,WndProc函数的名字可以自己指定,只要将它与某个窗口联系起来即可。,1.2 Windows应用程序的结构,#include LRESULT CALLBACK WndProc(); int WINAPI WinMain() /变量声明 /注册窗口类 /创建并显示窗口

20、 /消息循环 LRESULT CALLBACK WndProc() switch(message) case : break; case WM_DESTROY:/退出 PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0; ,1.2 Windows应用程序的结构,1、两个函数的原型: LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance

21、, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) (1)WinMain函数: DOS环境下编程时,主函数的名字是main,一般没有参数,而WinMain函数有4个参数。首先的问题是: 谁调用WinMain函数? 调用WinMain函数时谁提供并填充4个参数? 答案:Windows操作系统。 Windows对应用程序的管理主要包括:加载并撤销应用程序、为应用程序传递消息、为应用程序提供功能调用。 当用户双击某个可执行文件加载程序时,Windows系统在磁盘上找到该程序所在位置,将其内容拷贝到内存,同时还为应用程序指定实例句柄、命令参数

22、、窗口显示方式等信息。,1.2 Windows应用程序的结构, WinMain 的4个参数: HINSTANCE :Windows系统定义的数据类型,实际上是32位整数,用来代表一个应用程序的实例,称为“实例句柄”。 什么是应用程序实例? Windows中的应用程序可能被多次启动,即多个相同的应用程序同时运行,为了不造成混乱,必须把每个应用程序实例唯一的标志出来, 办法是给每个应用程序(不管相同或不同)一个唯一的句柄。 Windows每次启动应用程序都要传递两个句柄,一是新形成的,准备赋给即将启动的程序实例的句柄( hInstance ),一个是以前的实例句柄(hPrevInst ),如果内存

23、中已经有一个相同的程序实例,则把这个已经存在的实例句柄放到hPrevInst里传递给新程序实例。否则hPrevInst为NULL。 LPSTR:Windows系统定义的数据类型,指向字符串的指针,表示启动应用程序时传递给它的命令参数。由用户指定。 用户怎么指定?演示如何给Word传递命令参数。,1.2 Windows应用程序的结构,int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) int nCmdShow:指定程序的窗口以何种形式显示。窗口的显示方式有很多种

24、,如正常、最大化、最小化、隐藏等。Windows操作系统一般把整数“1”放到nCmdShow中传递给应用程序,表示常规窗口。 程序员可以在程序中指定窗口的显示方式,而且不用具体指定某个整数,Windows系统定义了很多符号常量,可以使用那些容易识别和记忆的符号常量规定窗口的显示,详细内容在ShowWindow函数中有介绍。,1.2 Windows应用程序的结构,(2)窗口函数(WndProc) LRESULT CALLBACK WndProc ( HWND, UINT, WPARAM, LPARAM); 谁调用窗口函数? 以前编程序时,除了主函数外,其他函数都会在程序中显式地调用(即明确地调用

25、),而在Windows程序中,却找不到调用窗口函数的语句,那么窗口函数由谁来调用? 答案:也是由Windows操作系统调用。 当操作系统收到一个来自应用程序的消息,它就查找该应用程序的窗口函数,然后把应用程序的窗口句柄、消息号、消息附加信息等作为参数传递给该应用程序的窗口函数,让机器执行窗口函数中的语句。,1.2 Windows应用程序的结构,(2)窗口函数(WndProc) LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); 窗口函数的类型: LRESULT:Windows系统自定义的一种数据类型,实际上是一个32位整数,专门表示窗口函数的返

26、回值,窗口函数必须返回一个值,一般为0。 CALLBACK:回调函数的标志,所谓回调函数,是自动由操作系统调用的函数。大多数情况下,我们在程序里调用操作系统的API函数,有时候我们需要操作系统调用我们程序里的函数,这时就把函数声明为 CALL BACK 这里把窗口函数定义为CALL BACK,作用是当操作系统收到发往本窗口的消息时,自动调用该窗口的窗口函数,进行相应的操作。 WndProc:窗口函数的名字,可由程序员自己指定。,1.2 Windows应用程序的结构,窗口函数的4个参数 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HWND

27、:Windows系统自定义的数据类型,32位整数,代表某窗口的句柄,应用程序的实例有句柄,窗口、按钮、图标、滚动条、输出设备、控制、文件等等都有自己的句柄,Windows通过句柄对它们实施管理,程序通过句柄对它们实施操作。 UINT: Windows系统自定义的数据类型,无符号32位整数,这里代表消息的编号,简称消息号,Windows为所有可能的事件指定了消息,为所有的消息编制了唯一的号码,具体定义在windows.h文件中。 WPARAM和LPARAM:与消息有关的附加信息。消息不同,其值的含义也不同。例如在键盘消息中,这两个参数中存放的是虚拟键码。,1.2 Windows应用程序的结构,2

28、、WinMain函数的具体实现 HWND hwnd; /声明了一个窗口句柄,存放本程序的主窗口句柄 MSG Msg; /声明了一个消息结构,从消息队列获取的消息就放到这个结构变量里,然后发送给Windows,Windows调用相应的窗口函数,同时把消息传递给它。 char lpszClassName = SampleWindow; /字符串,程序员给自己的窗口类起的名字 char lpszTitle = “这是我的第一个窗口”; /字符串,显示在窗口标题栏上的文字 WNDCLASS wndclass; /声明了一个窗口类的实例。窗口类实际上是一个结构体,它定义在windows.h文件中。通过设

29、置窗口类的成员,可以确定窗口的属性,如style(类型)、hIcon(图标)、hCursor(光标形状)等。 具体内容参见P7。 Windows中的任何一个窗口都是依据某个窗口类建立的,类似我们以前说过的类与对象的关系,我们能在屏幕上看到的窗口实际上是一个“窗口实例”,它的属性是由与之对应的窗口类决定的。多个窗口可以对应一个窗口类。,1.2 Windows应用程序的结构,2、WinMain函数的具体实现 /设置窗口类的成员 wndclass.style = 0; /窗口类型为默认类型 wndclass.lpfnWndProc = WndProc; /为窗口指定窗口函数,这里指定前面声明的Wnd

30、Proc函数。窗口函数与窗口类对应,所有依据该窗口类建立的窗口实例都使用同一个窗口函数。 wndclass.cbClsExtra = 0; /类扩展,为窗口类申请额外内存 wndclass.cbWndExtra = 0;/实例扩展,为窗口实例申请额外内存 wndclass.hInstance = hInstance; /应用程序实例的句柄,系统启动WinMain函数时传递进来的hInstance wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);/使用API装入图标 wndclass.hCursor = LoadCursor(NULL,IDC_AR

31、ROW);/使用API装入光标 / IDI_APPLICATION和 IDC_ARROW是预定义的符号常量 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); /指定窗口显示时的画刷, wndclass.lpszMenuName = NULL;/没有菜单 wndclass.lpszClassName = lpszClassName;/指定本窗口类的名字,为前面定义的字符串lpszClassName,1.2 Windows应用程序的结构,/注册窗口类 if(!RegisterClass( /利用API函数RegisterCl

32、ass注册窗口类,实际上是在内存中申请一片内存空间,存放依据窗口类建立的结构变量。 窗口类设置好以后,要登记到Windows系统中,这样当应用程序建立或显示窗口实例时,Windows可以依据已注册的窗口类完成任务。 从程序员的角度看,他可以独占某个窗口实例,但事实并非如此,对窗口的很多操作实际上时Windows操作系统完成的,例如窗口的位置、边框、标题的显示等,但应用程序可以完全控制窗口客户区的显示。 客户区:窗口中除标题栏和边框以外的区域。,1.2 Windows应用程序的结构,/创建窗口 有了窗口类后,下一步是依据窗口类在内存建立一个具体的窗口,即窗口实例。 办法是利用API函数Creat

33、eWindow创建窗口。 该函数返回一个HWND类型的整数,是系统指定的新窗口的句柄。 下面这条语句创建了一个窗口实例,并把该实例的句柄存储到程序先前声明的HWND型变量hwnd中。 窗口实例要依据某个窗口类创建,窗口类中的一些参数将决定窗口实例的属性,如图标、光标、菜单等。,1.2 Windows应用程序的结构,hwnd = CreateWindow( lpszClassName, /窗口类的名字,新窗口将具有该结构变量所确定的一些属性。 /这里是程序先前定义的字符串,在定义窗口类时我们将它作为了窗口类的名字, lpszTitle, /显示在窗口标题栏上的文字,这里是程序先前定义的字符数组。

34、 WS_OVERLAPPEDWINDOW, /窗口的样式,本样式为有标题栏、边框、系统菜单、最大最小按钮。 /窗口实例可以有很多中样式,具体参见MSDN CW_USEDEFAULT, CW_USEDEFAULT, /窗口左上角的坐标,可以直接指定为整数。 CW_USEDEFAULT, CW_USEDEFAULT,/窗口的高度和宽度,可以直接指定为整数 NULL,/该窗口父窗口的句柄 NULL,/窗口的主菜单句柄 hInstance,/创建窗口的应用程序句柄 NULL);/指向传递给窗口的CREATESTRUCT指针,如果是多文档窗口,必须有这一项。,1.2 Windows应用程序的结构,/显示

35、窗口 ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); ShowWindow函数:显示窗口,它有两个参数,一个是被显示窗口实例的句柄,一个是显示方式,其中显示方式是操作系统启动WinMain函数时传递进来的参数,一般为1。可以指定显示方式,例如: SW_HIDE Hides the window and activates another window. SW_MAXIMIZE Maximizes the specified window. SW_MINIMIZE Minimizes the specified window and activate

36、s the next top-level window in the Z order. UpdateWindow函数:刷新窗口。它只有一个参数,即被刷新的窗口句柄。主要功能是显示窗口需要重新显示的部分,例如窗口的一部分被其他窗口盖住,则可利用该函数将盖住的部分重新画出来。 但具体的重画工作并不是由该函数完成的,而是由窗口函数完成的,该函数只是发送一个WM_PAINT消息给窗口函数。,1.2 Windows应用程序的结构,/消息循环 窗口被创建并显示后,就进入了消息循环。 while(GetMessage( /将处理后的消息返回给Windows,Windows再调用相应的窗口函数并将消息发送给它

37、。 ,1.2 Windows应用程序的结构,/消息循环 (1)GetMessage( break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0;,窗口函数的作用: 对可能接受到的消息进行处理,由一个或多个switch语句构成,每个case对应一种消息,当应用程序接受到一个消息时,相应的case语句被激活并执行,1.2 Windows应用程序的结构,3、窗口函数的具体实现 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LP

38、ARAM lParam) switch(message) case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,message,wParam,lParam); return 0;,这里只对一种消息进行了处理,当用户关闭窗口时,Windows发送WM_DESTORY消息给窗口函数,窗口函数收到消息后,使用PostQuitMessage函数发送WM_QUIT消息给应用程序的消息队列,当WinMain函数中的消息循环收到WM_QUIT后,GetMessage函数返回FALSE,终止消息循环并退出程

39、序。,上机,输入并调试例11 观察本课使用的程序ex01,并完成下列任务: (1)设置窗口的背景为黑色 (2)让窗口的光标显示沙漏光标 (3)让窗口启动后以最大化(最小化)形式显示 (4)把你的名字最为标题显示在标题栏内 (5)为窗口函数增加消息响应:按Ctrl键(VK_CONTROL)使窗口最大化,按SHIFT键(VK_SHIFT)使窗口最小化。 (6)让程序同时创建两个窗口。,1.2 Windows应用程序的结构,4、编写消息处理代码 当鼠标在窗口内按下鼠标左键时,在鼠标位置画一个圆形。 相应消息:WM_LBUTTONDOWN 鼠标位置:存放在消息结构的成员lParam中, xPos =

40、LOWORD(lParam);/低16位 yPos = HIWORD(lParam);/高16位 设备环境句柄:HDC 设备环境:简称DC,存放了与某个特定窗口有关的绘图属性。 画笔和画刷:HPEN和HBRUSH 绘制圆形的API函数:Ellipse 参见程序ex1_2.cpp,1.2 Windows应用程序的结构,5、单线程多窗口 可以在一个程序中同时创建多个窗口。 每个窗口都可以对应一个窗口函数,每个窗口函数执行不同的动作 (1)声明并注册多个窗口类 (2)使用CreateWindow函数按照WNDCLASS建立多个窗口 (3)在WNDCLASS中关联不同的WndProc 参见例程ex1_

41、3.cpp,1.2 Windows应用程序的结构,6、窗口的刷新 当窗口改变大小、移动或被其他对象覆盖后,窗口客户区内的内容将消失,必须重新绘制这块区域,这个操作称为窗口的刷新。 由于Windows不知道程序员要在窗口中绘制什么内容, 所以只在很少的情况下,刷新操作由Windows完成,例如菜单显示和隐藏。 大多数情况下,Windows无法完成刷新操作,而是向应用程序发送WM_PAINT消息,程序员需要在程序中编写完成刷新操作的代码。 窗口的刷新大致分为以下几种情况:,1.2 Windows应用程序的结构,系统对刷新请求的响应: (1)窗口移动后的刷新 当发生窗口移动、改变大小、窗口滚动等事件

42、时,Windows不能自动完成刷新操作,它将向应用程序发送WM_PAINT消息,让应用程序自己刷新窗口。 (2)被覆盖区域刷新 当下拉菜单关闭、对话框关闭等事件发生时,Windows会试图自动完成刷新操作,如果成功,就不发送WM_PAINT,否则就发送。 (3)对象穿越后的刷新 当鼠标或被拖曳的图标穿过客户区时,Windows能够自动完成刷新操作,程序员不必考虑。 (4)无效区域: 窗口被覆盖的部分称作“无效区域”,Windows系统为每个窗口建立了一个PAINTSTRUCT结构变量,用来保存该窗口的无效区域,应用程序可以利用这个结构变量更新窗口。,1.2 Windows应用程序的结构,在ex

43、1_2.cpp的基础上加入刷新代码: PAINTSTRUCT ps; /该结构用来保存无效区域 HDC hdcClient;/图形设备句柄 case WM_PAINT: hdcClient = BeginPaint (hwnd, ,1.2 Windows应用程序的结构,6、用户数据的保存 用户用鼠标绘制的图形应该保留在窗口中,这就需要将用户点击鼠标的位置记录下来,当窗口刷新时根据鼠标位置重新绘制图形。,设计数据结构: typedef struct tagPoint bool flag; int x,y; Point; Point MyPoint1000; int pointer = 0;,保存

44、鼠标位置: MyPointpointer.flag = true; MyPointpointer.x = xPos; MyPointpointer.y = yPos; pointer +;,刷新时重画图形 for(i= 0;ipointer;i+) if(MyPointi.flag) Ellipse() ,参见draw.cpp,1.6 Windows程序的代码重构,1、将响应不同消息的代码封装为不同的函数,使程序结构更为清晰 例如: LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); void On_LButtonDown (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void On_Paint (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); void On_Destroy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论