API与MFC编程-Read.ppt

上传人:ga****84 文档编号:378342 上传时间:2018-09-29 格式:PPT 页数:66 大小:529.50KB
下载 相关 举报
API与MFC编程-Read.ppt_第1页
第1页 / 共66页
API与MFC编程-Read.ppt_第2页
第2页 / 共66页
API与MFC编程-Read.ppt_第3页
第3页 / 共66页
API与MFC编程-Read.ppt_第4页
第4页 / 共66页
API与MFC编程-Read.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、第5章 Windows应用程序 编程接口,教学要点 本章内容主要包括API的概念及分类,从API的使用看操作系统所提供的服务,操作系统内核中的文件操作API的使用,网络服务API函数的使用,利用图形设备接口API编写图形用户界面程序的方法。 要求了解API的分类及其对应的磁盘上的物理文件.DLL的名称、网络服务API的含义和网络编程的一些基本概念、进程概念及建立新进程的方法、WM_PAINT消息含义。握握API概念和其与操作系统提供的程序员接口的关系、内核中文件操作API的调用,熟悉API编写图形用户界面程序的步骤,熟练掌握API编写的图形用户界面程序的主要组成模块及含义。,第5章 目录,5.

2、1 API概述5.2 内核服务API函数的使用5.3 网络接口服务5.4 Win32 API编写图形界面程序5.5 图形设备接口与用户接口服务 习题,本章以一些API设计的控制台程序和具有图形界面的Win32程序为例,阐述了利用API函数开发程序的过程,重点在于理解操作系统所提供的各种服务以及程序员如何进行调用。,5.1 API概述,5.1.1 关于WindowsAPI编程模式5.1.2 API简介5.1.3 Windows核心三个动态链接库5.1.4 Windows API分类*5.1.5操作系统的认识,Windows API编程是一种原始的开发Windows应用程序模式,它主要使用的是C语

3、言、少量的C+通用类及“原始”的Windows应用程序编程接口API(Application Programming Interface) 。这些函数都是比较底层的函数,其地位大致相当于字符界面环境下C语言的标准库函数,只不过其运行环境为Windows的图形界面环境。 本篇的后多半部分虽然采用的是相对比较简单的MFC编程,但使用底层的API函数编写程序可以看到许多MFC编程看不到的东西,从而对Windows的内部运作有更深入的了解。进行API编程,要求用户对Windows环境比较熟悉,并且熟悉C语言。在API编程中用到大量的有关操作系统的结构体变量和控制操作系统的函数,当在使用API函数遇到问

4、题时,可以随时查阅Windows 的API文档,它位于MSDN的Platform SDK部分。,5.1.1 关于WindowsAPI编程模式,Windows操作系统向程序员提供了可以实现开启窗口、绘制图形,使用系统各种设备等的一组函数服务,称之为Application Programming Interface(应用程序编程接口),即API函数。 利用VC进行Windows应用程序的开发,除了用到各种.h头文件中的库函数及数据结构外,还需要使用Windows SDK(Software Development Kit,软件开发工具包)提供的使用于Windows应用程序的特殊库函数和数据结构、语句

5、、文件结构。所有这些内容组成了Windows应用程序设计接口API。 使用Win32 API,应用程序可以充分挖掘出Windows 32位操作系统的潜力,Microsoft的所有32位平台都支持统一的API,包括函数、结构、消息、宏及接口。使用Win32 API,不但可以开发出在各种平台上都能运行的应用程序,而且还可以充分利用每个平台上特有的功能和属性。,5.1.2 API简介,5.1.3 Windows核心 三个动态链接库,Windows操作系统核心有三个动态链接库(Kernel32.dll,User32.dll,Gdi32.dll),这些动态链接库构成了Win32 API函数。,1Wind

6、ows内核库(Kernel32.dll) 内核库中的函数用于处理操作系统功能的所有核心工作,例如多任务管理、内存管理等。另外内核库还管理系统注册表。2Windows用户界面管理库(User32.dll) 用户界面管理库包括了Windows管理、菜单、光标、定时器和通信等有关的函数。在Windows中,窗口的标识被称为“句柄”。3Windows图形设备界面库(Gdi32.dll) 图形设备界面库提供了用于管理系统支持的所有图形设备函数,包括屏幕、打印机等设备的管理。GDI库中的函数为应用程序提供与设备无关的绘图内容。应用程序中通过GDI库中的函数绘图,不是直接面向硬件操作,而是通过“设备描述表”

7、来进行操作,它通过句柄hDC来跟踪。,Windows三个核心库中的API函数的原型声名在windows.h中有说明,这就是我们在编写Win32应用程序时要在程序开头放#include “windows.h”语句的原因。,5.1.4 Windows API分类,根据Windows API函数完成的功能,可以将其分为如下的类别:,1内核服务 通过内核服务函数,应用程序可以使用计算机中的资源和操作系统的特性,例如内存,文件系统、设备、进程、线程等。拿一个简单的文件输入输出函数来说,通过这些函数,程序员可以存取本地计算机或网络中某台计算机中的文件、目录、输入输出设备,并且这些文件函数支持各种各样的文件

8、系统,包括FAT、NTFS的文件系统。 内核服务体现了Windows操作系统“服务”的观点。作为一个程序员我们应该利用这些服务函数来充分发挥操作系统的功能。对于这部分API函数的使用,我们可以在基于控制台的应用程序中编写,因为这些函数都是一些与Windows图形用户界面无关的,在字符方式下操作比较简单。后面有关这方面函数的操作就是在基于控制台的应用程序中使用的。 内核服务的函数大部分包含在Windows内核库Kernel32.dll中。,5.1.4 WindowsAPI分类(续),2图形设备接口 图形设备接口是Windows最原始的图形输出库(最原始意味着除了GDI外,还有工业界用的OpenG

9、l和游戏界用的DirectX,VC都对他们提供支持)。当看到图形或文本显示在屏幕上时,这就是GDI的功劳。它提供了在显示器、打印机或其它设备上生成图形的函数与相关的数据结构。利用GDI函数,你可以画直线、曲线、文本、位图等。你还可以使用各种各样的绘图对象如笔、画刷、字体等,使得所绘制的图形更加丰富多彩。另外,Windows本身也是通过GDI来绘制其用户界面,包括窗口、菜单和对话框。 顾名思义,图形设备接口是与图形界面有关的,因此这些函数的使用要在图形用户界面下操作。即必须建立基于Win32的应用程序,建立的步骤如4.4节所示。 图形设备接口的函数是包含在Windows图形设备界面库Gdi32.

10、dll中。,5.1.4 Windows API分类(续),3用户接口服务 用户接口服务函数可以创建和使用Windows来显示输出、提示用户输入和执行与用户交互的任务。用户接口服务是通过一些常见的Windows对象来实现的,例如按钮、组合框、编辑框、菜单、键盘输入、定时器等。 用户接口服务的函数是在Windows用户界面管理库User32.dll中。4网络服务 网络服务允许分布在网络中不同计算机上的应用程序进行通讯。通过这些函数可以创建和管理共享资源,例如共享目录和网络打印机。 网络服务的函数是在网络接口函数库Mpr.dll、Wininet.dll和Winsock32.dll中。5多媒体服务 多

11、媒体技术是指利用计算机综合处理多媒体信息文本、图形、图象和声音等,使多种信息建立逻辑连接,集成为一个系统并具有交互性。多媒体服务提供了数字音频、视频、图形、图象等服务。 该服务的函数主要包含在多媒体函数库Winmm.dll中。,5.1.4 WindowsAPI分类(续),6客户/服务方式存取服务 在客户/服务方式存取模式中,客户可以连接到服务器上以使用服务器的功能和数据,服务器通过客户端的标识和权限来决定客户端可以使用的功能。Win2K提供了一套函数来限制和允许客户端对服务端的访问。这些函数扩展了Win2k的存取控制模型来使用服务端的私有对象和使用服务端的功能。客户/服务方式存取服务又称操作系

12、统高级编程接口,这些函数包含在高级编程接口函数库Advapi32.dll中。7版本服务 版本服务主要提供有关文件的版本信息。这些服务所对应的函数包含在版本函数库Version.dll中。8公共对话框服务 公共对话框,又叫通用对话框,是Windows预定义的对话框,可以使用通用对话框来执行六种标准操作,选择文件,指定字体、选择颜色、打印设置、查找文本、保存文件。这些服务所对应的函数包含在公共对话框函数库Comdlg32.dll中。,5.1.4 WindowsAPI分类(续),9打印管理服务 在Windows操作系统下,可以实现在各种设备下的打印。打印管理服务提供了完整的函数集支持这些操作,例如检

13、索打印机,准备打印等。这些服务所对应的函数包含在打印管理函数库Winspool.drv中。10解/压缩文件服务 该服务提供了对文件的压缩和解压服务。这些服务所对应的函数包含在函数库Lz32.dll。 在VC6.0中提供了一个文件Win32api.csv。它是一个Win16与Win32函数的对照表。通过它,读者可以浏览到Windows各种版本下API函数的原型说明。,5.1.5 操作系统的认识,操作系统有两个接口:一个是用户接口,另一个是程序员接口。 VC开发工具的强大,其中很重要的一个方面就是对于Windows API的直接调用,其它任何开发工具中的函数都是对其的一个封装。凡是在Windows

14、工作环境下执行的应用程序,都可以通过某种特定方式调用Woindows API函数。可以毫不夸张地说,Windows API函数是构建整个Windows框架的基石,在它下面是Windows操作系统核心,在它上面则是所有华丽的Windows应用程序。 事实上,任何开发工具提供的类库和构件都是架构在Win32 API函数基础上,是封装了的API函数集合。这些类库和构件简化了程序的开发,但其功能有限。在实际应用中,如果我们希望开发出更灵活、更实用、更具效率的程序时,则必须要涉及直接使用API函数。虽然类库和构件使应用程序的开发简单了,但它们只提供Windows的常用的一般功能,对于比较复杂和特殊的功能

15、来说,使用类库和构件中提供的方法是非常难以实现的,这时就需要直接调用特定的API函数。,5.2 内核服务API函数的使用,内核服务是最能体现API函数威力的地方,通过这些函数,用户能够使用操作系统内核所提供的核心功能。操作系统的进程管理、文件管理、内存管理都是属于内核的功能。,5.2.1 文件管理内核服务5.2.2 进程操作5.2.3 计算机系统信息操作,VC下提供了对文件操作的四种方式:(1)使用C语言中的fopen()、fprintf()、fread()等基本的函数进行文件操作;(2)使用C+中的流式文件接口fstream中的函数进行操作;(3)使用面向对象的类CFile进行操作;(4)使

16、用有关的文件API进行操作。,5.2.1 文件管理内核服务,1.文件操作 2.驱动器操作,API为一般的文件操作提供了三个函数:移动、复制和删除。文件拷贝的API函数如下所示:BOOL CopyFile( /从源文件向目标文件复制内容 LPCTSTR lpExistingFileName, / 源文件名称 LPCTSTR lpNewFileName, / 目标文件名称 BOOL bFailIfExists /目标文件存在时的操作模式,为true时,函数调用失败,为False /时,现有文件将被覆盖); 文件移动和文件删除的API函数是MoveFileEx()和DeleteFile()【例5-1

17、】调用API函数CopyFile实现文件拷贝实例。Windows的内核功能的实现不一定要在Windows的图形界面下完成,在字符方式下也可以。由于目前Windows图形用户接口程序的开发还没有讲(5.4节和5.5节中讲),并且我们目前掌握的重点是利用API函数实现Windows内核功能的演示,所以下面的程序仍然是字符界面下的单文件控制台工程,该程序的主文件的名称为FileCopy.cpp。,1.文件操作,#include / windows操作系统API函数的头文件#include void main()char SourceFileNameMAX_PATH;char DestFileName

18、MAX_PATH;BOOL Success;coutSourceFileName; coutDestFileName; Success=CopyFile(SourceFileName,DestFileName,TRUE); /调用API函数CopyFile实现文件拷贝if (!Success)cout拷贝失败,错误的代码为: GetLastError()endl;/调用API函数GetLastError()求出错的代码elsecout文件拷贝成功n;文件移动和文件删除的API函数是MoveFileEx()和DeleteFile(),详细请查看MSDN的说明。,程序,(1)取驱动器个数计算机上一

19、般都有软盘、硬盘和光盘,有时候应用程序需要查看系统中一共有多少个逻辑驱动器,这时可以调用API函数GetLogicalDrives()来完成。其函数的原型为:DWORD GetLogicalDrives(VOID); 该函数返回一个DWORD类型的值,这32位的每一位代表某个驱动器是否存在。如果存在A盘,则第0位被设置为1;依次类推,如果存在C盘,则第2位被设置为1。当我们需要知道在该计算机上总共有几个驱动器时,可以用如下的代码完成: DWORD DiskInfo; _int8 DiskCount=0; /定义8位的整型变量 DiskInfo=GetLogicalDrives(); while

20、(DiskInfo) if(DiskInfo,2.驱动器操作,(2)取所有驱动器字符串信息取所有驱动器字符串信息通过API函数GetLogicalDriveStrings()来完成,其原型为:DWORD GetLogicalDriveStrings( DWORD nBufferLength, / 缓冲区的长度 LPTSTR lpBuffer / 指向所有驱动器字符串的指针);使用该函数一般分两个步骤:求所有驱动器的字符串信息长度把0传递给API函数GetLogicalDriveStrings()的两个形参,函数的返回值就是所有驱动器的字符串信息长度。语句为:DriveStringLength=

21、GetLogicalDriveStrings(0, NULL); 动态分配内存空间保存所有驱动器的字符串信息通过new函数在栈区申请内存于字符指针变量DriverStr,然后把上一步求的所有驱动器的字符串信息长度DriveStringLength和准备保存所有驱动器的字符串缓冲区地址DriverStr传递给API函数GetLogicalDriveStrings()的两个形参,,2.驱动器操作(续),这样求得的所有驱动器的字符串信息就保存到缓冲区DriverStr中,注意每个驱动器字符串的长度为4,假设该机器有A、B、C、D四个驱动器则在缓冲区DriverStr保存的内容是A:B: C:D:,其

22、中表示的是空字符,各个驱动器之间靠来分隔,最后以结束。典型的代码为:DriverStr=new charDriveStringLength+1;GetLogicalDriveStrings(DriveStringLength,(LPTSTR)DriverStr); 取驱动器类型 倘若还要知道每个驱动器标识符各代表什么类型的驱动器时,如A:代表软盘还是硬盘,F:代表光盘还是U盘(可移动盘),就要使用API函数GetDriveType(),该函数的原型为:UINT GetDriveType( LPCTSTR lpRootPathName / 驱动器的根目录); 函数返回值为驱动器的类型,若值为DR

23、IVE_REMOVABLE,代表的是可移动U盘,若值为DRIVE_FIXED,代表的是固定盘,若值为CDROM,代表的是光盘等。,2.驱动器操作(续),【例5-2】调用驱动器操作API函数的演示实例,程序主文件为:DrivesInfo.cpp。#include void main()DWORD DiskInfo;char *DriverStr;UINT type;short DriveStringLength;_int8 DiskCount=0; /定义8位的整型变量DiskInfo=GetLogicalDrives(); /取机器上的驱动器信息于DiskInfowhile(DiskInfo)

24、 if(DiskInfo,【例5-2】(续),cout该机器共有DiskCount个逻辑驱动器n;DriveStringLength=GetLogicalDriveStrings(0,NULL);/求整个驱动器的字符串信息的长度,每个驱动器字符串的长度为4DriverStr=new charDriveStringLength+1;GetLogicalDriveStrings(DriveStringLength,(LPTSTR)DriverStr);/求整个驱动器的字符串信息于DriverStr for(short i=0;i(int)(DriveStringLength/4);i+)type=

25、GetDriveType(DriverStr+i*4); /取驱动器的类型是软盘、硬盘、光盘、可移动U盘if(type=DRIVE_CDROM) /如果是光驱的话cout驱动器DriverStr+i*4InChar;if(InChar=Y|InChar=y),5.2.2 进程操作(续),【例5-3】(续),BOOL IsSuccess;char NotePadFile255; /存放记事本程序的路径UINT uSize=255; GetWindowsDirectory(NotePadFile,uSize); /调用API函数GetWindowsDirectory()取得Windows的系统目录

26、strcat(NotePadFile,“notepad.exe”); /取得记事本程序的 完整路径PROCESS_INFORMATION NewProcessInformation; /建立进程信息变量NewProcessInformationSTARTUPINFO StartUpInformation; /建立进程的启动信息变量StartUpInformationmemset(,Windows内核Kernel32.dll中包含了大量有关计算机系统的信息。这些信息包括计算机的硬件配置信息、计算机的名称、用户的名称、操作系统的版本信息等。一个应用程序的可移植性,往往反映在程序运行时,要检测当前程

27、序运行的外部环境,其中获取计算机系统信息是很重要的,Win32 API提供了这些服务。其中:GetComputerName()可以取得本机器的名称,GetSystemInfo()可以取得CPU的信息,GlobalMemoryStatus()可以取得内存的状态信息,例5-4,5.2.3 计算机系统信息操作,5.3 网络接口服务,当今,计算机网络的发展一日千里,就连蜜蜂这个“空姐”找对象时都想找蜘蛛,原因是蜘蛛好赖是一个搞“网络”的。随着因特网“飞入寻常百姓家”,人们对网络服务应用程序的要求越来越高,如何开发网络应用程序,最基本的是搞清楚Windows操作系统对网络的支持,对程序员来说,要掌握网络

28、编程的一些概念,最终掌握有关网络使用的一些API函数。,5.3.1 套接字的使用与Winsock API5.3.2 因特网服务WinInet,什么是套接字 套接字(socket)是一种网络编程接口,它是对通信端点的一种抽象,提供了一种发送数据和接收数据的机制。Winsock是Windows操作系统下的套接字,它是一套Microsoft Windows下的网络编程接口,使用该接口可以充分利用Windows消息驱动机制进行编程,在应用程序中是通过调用WinSock API实现相互之间的通讯。,5.3.1 套接字的使用与 Winsock API,初始化套接字 在使用Winsock进行编程之前,必须对

29、它进行初始化,使用WSAStartup()就可以完成。该函数的原型为:int WSAStartup( WORD wVersionRequested,/ Socket动态链接库的版本号 LPWSADATA lpWSAData /指向一个WSADATA数据结构, /该数据结构返回Windows Socket实现的详细信息); 第一个参数指明了要调用的Socket动态链接库的版本号;第二个参数为指针类型,指向一个WSADATA数据结构,该数据结构返回Windows Socket实现的详细信息。 该函数通过一个过程调用来完成使用Windows中Socket动态链接库的初始化工作,它调用成功后就可以调用

30、Windows Socket API函数。,5.3.1 套接字的使用与WinsockAPI(续),用WinsockAPI函数取本机名和IP地址 取本机名称的函数为: int gethostname( char FAR *name, int namelen ); 其中参数name为传出参数,指向接收主机名称的缓冲区;后面的参数为传入参数,它指定了缓冲区的长度。取主机信息的函数为:struct hostent FAR *gethostbyname( const char FAR *name );该函数用来通过主机名称获取主机的详细信息。参数name就是gethostname()函数的返回结果,该函

31、数执行成功后,将返回一个hostent结构的指针,该结构包含了当前主机的详细信息。该结构定义如下:,5.3.1 套接字的使用与 WinsockAPI(续),struct hostent char FAR * h_name; /主机的官方名称 char FAR * FAR * h_aliases;/主机的别名 short h_addrtype; /地址类型 short h_length; /该数据结构的大小 char FAR * FAR * h_addr_list; /主机地址列表,包含了主机的IP;【例5-5】调用Windows网络API函数取计算机的名称和IP地址。程序主文件为MyCompu

32、ter.cpp。,例5-5,5.3.1 套接字的使用与WinsockAPI(续),WinInet是Windows Internet扩展应用程序的接口,它包含了一个C语言的函数集。使用WinInet可以为应用程序添加向InterNet服务器的连接,而无需考虑基本的通讯协议和底层的数据传输工作。WinInet支持文本传输协议(FTP)、超文本传输协议(HTTP)等。 1利用WinInet检测计算机是否接入因特网及接入方式 在开发网络应用程序的时候,如果设计到Internet方面的处理问题,则首先必须要能判断当前计算机是否接入Internet。因为,如果用户当前的计算机没有接入网的话,随后的任何操作

33、过程都必出现错误。我们可以通过软件的方式检测当前计算机是否接入Internet及当前的接入方式。,5.3.2 因特网服务WinInet,2WinInet中的API函数InternetGetConnectedState通过API函数InternetGetConnectedState可以检测当前计算机是否接入Internet及接入的方式。该函数原型为: BOOL InternetGetConnectedState( OUT LPDWORD lpdwFlags, IN DWORD dwReserved );该函数第一个参数表示网络的接入类型,第二个值保留,一般取0,当函数返回值为真时,代表已经接入因

34、特网。否则,没有接入。【例5-6】调用因特网API函数检测本机是否接入因特网的实例。程序的主文件为LinkInternet.cpp程序。,例5-6,5.3.2 因特网服务WinInet(续),本章的前几节利用API函数来操纵操作系统,编写的都是控制台工程,下面讲解利用API函数来编写图形界面的程序,它是本节的重点和难点,读者要花大力气去学习。,5.4 Win32API编写图形界面程序,5.4.1使用AppWizard生成W32应用程序5.4.2程序的入口WinMain()5.4.3定义和注册窗口类5.4.4初始化实例5.4.5维护消息循环5.4.6窗口函数和消息处理5.4.7常见消息的处理5.

35、4.8几个重要的结构*5.4.9WinMain()执行规程描述*5.4.10利用Win32 API编写图形界面的关键,【例5-7】调用API函数建立一个图形界面的程序Hello。1建立Hello工程(1)启动Visual C+的集成开发环境Developer Studio。(2)选择菜单命令“File|New|Projects|Win32 Application”。(3)在Project Name的编辑框中输入一个应用程序的名称“Hello”,界面如图5.1 所示。完后单击OK按钮。进入下一个界面,如图5.2所示。(4)选择一个Windows应用程序的类型A Typical“ Hello Wo

36、rld!” Application。完后单击Finish按钮。进入下一个界面,单击OK按钮,一个应用程序已经生成。(5)单击WorkSpace视图的ClassView标签下Hello Classes根结点下的子结点Globals。界面如图5.3 所示。(6)双击WinMain()函数结点,进入到程序的主文件Hello.cpp文件中。我们的主要工作就是剖析该文件的内容。文件的主要内容如2小节所示(作了简单修改)。2Hello.cpp的主要内容( 详细内容请参见程序),5.4.1 使用AppWizard生成 Win32应用程序,图(一),图5.1选择工程类型窗口,图5.2 选择win32应用程序类

37、型窗口,图5.3 选择WinMain函数的界面,WinMain()函数是所有Windows应用程序的入口,类似于C语言中的Main()函数,其功能是完成一些初始化工作并维持一个消息循环。消息循环是整个程序运行的核心。在WinMain()函数中,要完成以下几步工作: 利用自定义函数MyRegisterClass()注册应用程序窗口类 利用自定义函数InitInstance()初始化应用程序的实例,该函数主要完成创建和显示窗口,并进行其它必要的初始化处理 利用API函数GetMessage()启动应用程序的消息循环,把从应用程序消息队列接收的消息进行翻译,并送到窗口函数中进行处理 窗口函数WinP

38、roc()是Windows应用程序的消息处理中心,它能够处理所有的消息 当消息循环检索到WM_QUIT消息时,则退出应用程序。 如果WinMain()调用成功,那么将会在接收到WM_QUIT时退出。,5.4.2程序的入口WinMain(),Windows下窗口的生成都是基于窗口类的。每个窗口都有一些基本属性,如标题栏文字、窗口大小和位置、图标、窗体的背景颜色等,窗口类就是充当定义这些属性的模板。 WinMain()函数中,通常要对主窗口定义一个窗口类,即把窗口类的具体属性填入WNDCLASSEX结构的相应成员中。然后进行注册,它是通过调用RegisterClassEx()来完成。窗口创建函数C

39、reateWindows创建窗体。窗口类的注册在函数MyRegisterClass()中完成。 代码,5.4.3定义和注册窗口类,在初始化应用程序实例过程中,主要作的工作有:创建窗口; 显示窗口;更新窗口。这些步骤的完成是放在向导生成的函数InitInstance()中。,5.4.4 初始化实例,BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) HWND hWnd;hInst = hInstance; / Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文资料库 > 毕业论文

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。