三内存管理应用程序设计

上传人:san****019 文档编号:23748201 上传时间:2021-06-10 格式:PPT 页数:116 大小:1.04MB
收藏 版权申诉 举报 下载
三内存管理应用程序设计_第1页
第1页 / 共116页
三内存管理应用程序设计_第2页
第2页 / 共116页
三内存管理应用程序设计_第3页
第3页 / 共116页
资源描述:

《三内存管理应用程序设计》由会员分享,可在线阅读,更多相关《三内存管理应用程序设计(116页珍藏版)》请在装配图网上搜索。

1、下一页 2021年 4月 12日 主讲老师 :刘志强 第 3章(二) 主讲:刘志强 操作系统及程序设计 软件开发基础基础 下一页 上一页 停止放映 第 2/76 页 三、 内存管理应用程序设计 内存管理的相关概念 内存数据空间的动态分配 内存代码空间的动态分配 下一页 上一页 停止放映 第 3/76 页 1内存管理 主要任务 对内存储器进行分配、变换、保护和扩充, 存储管理还应该能够在内存和外存之间交换 数据和代码。 在 Windows操作系统下,存储器被保护起来, 程序和用户无法直接访问,需要在程序中通 过静态和动态两种方式来访问。 Windows的内存管理完成物理内存和虚拟内 存之间的交换

2、,虚拟内存是 32位的,多达 4GB 的大小,内存管理还提供了一个核心服务, 完成内存映射文件、写时复制内存和用户程 序使用的大量和稀疏内存的管理。 下一页 上一页 停止放映 第 4/76 页 两种使用内存的基本方法 静态方法 数组,例如 Student student501 动态方法 指针,例如 Student *student=new Studentcount+1 下一页 上一页 停止放映 第 5/76 页 Windows NT 内存管理 Windows可以管理 4GB大小的空间;操 作系统使用其中 2GB空间,每个用户进 程可以使用 2GB的专用地址空间。 Win32 API提供: Vi

3、rtualXXX形式的以页为单位的虚拟内 存函数; CreateMapFile、 MapViewofFile内存映 射文件函数; HeapXXX堆栈函数。 下一页 上一页 停止放映 第 6/76 页 内存管理 Windows NT在 X86体系下虚拟地址空间的分布: 下一页 上一页 停止放映 第 7/76 页 例 3-6 动态申请虚拟内存 整数阶乘计算到 13就会出错。怎么办? 使用动态申请的虚拟内存空间编写计算任何数的 阶乘的程序。 解体思路: 计算较大数的阶乘的计算一般使用数组来存放 阶乘的位数。但是 C+中数组最大长度是 10万, 这将影响使用的范围。 可以通过使用动态内存分配(指针)来

4、解决。 本程序采用动态申请虚拟内存空间的方法,不 使用物理内存,而是使用虚拟内存,从而使求 解问题的范围扩大。 阶乘源代码 阶乘执行代码 下一页 上一页 停止放映 第 8/76 页 程序算法 从命令行接收输入并使用 strtol函数将其转换为 long型的整数( n为要求阶乘的数)。 通过函数 VirtualAlloc保留 n 10240的地址空 间,申请 n 1024的地址空间。 调用计算阶乘函数 lfac。 一位一位显示阶乘结果。 通过函数 VirtulFree释放虚拟内存。 下一页 上一页 停止放映 第 9/76 页 函数 VirtualAlloc 用函数 VirtualAlloc保留或

5、申请虚拟内存空间 。 该函数格式如下: LPVOID VirtualAlloc( LPVOID lpAddress, / 起始地址 DWORD dwSize, / 大小 DWORD flAllocationType, / 分配类型( MEM_COMMIT等) DWORD flProtect / 保权限 ( PAGE_READWRITE等) ); 下一页 上一页 停止放映 第 10/76 页 函数 VirtualFree 使用函数 VirtualFree释放虚拟内存,函数格式: BOOL VirtualFree( LPVOID lpAddress, /起始地址 DWORD dwSize, /大小

6、 DWORD dwFreeType /释放类型( MEM_RELEASE等) ); 下一页 上一页 停止放映 第 11/76 页 源程序 #include #include int lfac(int *a, int n) int sum,sc; for(int i=0;in*1024;i+) /空间清零 ai=0; a0=1; /最低位设为 1 for(i=2;i=n;i+) /n的阶乘的循环 sc=0; for(int j=0;j0) return -1; else return 0; 下一页 上一页 停止放映 第 12/76 页 举例求 5! a0=1; /最低位设为 1 for(i=2;

7、i=n;i+) /n的阶乘的循环 sc=0; for(int j=0;jn*1024;j+) /阶乘每一位处理的循环 sum=aj*i+sc; /上一次进位值和当前计算结果求和 sc=sum/10; /存放进位数值 aj=sum%10; /将余数存入数组 i =2(2!=2) i =3(3!=6) i =4(4!=24) i =5(5!=120) j=0 sum=2 sc=0 a0=2 2!=a0=2 j=0 sum=6 sc=0 a0=6 3!=a0=6 j=0 sum=24 sc=2 a0=4 j=0 sum=20 sc=2 a0=0 j=2 sum=20 sc=0 a2=1 j=1 su

8、m=2 sc=2 a1=2 3!=a1a0=24 j=1 sum=12 sc=1 a1=2 6!=a2a1a0=120 下一页 上一页 停止放映 第 13/76 页 主函数 int main() char *p; int n; coutn; if(n0) couta输入数据错 ; return 1; int * lpBase =(int *) VirtualAlloc(NULL, 1024, MEM_COMMIT, PAGE_READWRITE); /保留 n*10240总的地址空间 int * lpPage = (int *)VirtualAlloc (lpBase + 0, n*1024,

9、MEM_COMMIT,PAGE_READWRITE); /提交 n*1024的页地址空间 bool flag=FALSE; if(lfac(lpPage,n)0) cout溢出 =0;i-) if(flag | lpPagei0) flag=TRUE; coutlpPagei; /输出每一位 coutendl; VirtualFree (int *)lpPage + 0,n*1024,MEM_DECOMMIT);/ 对页地址解除提交内存 VirtualFree (lpBase,n*10240,MEM_RELEASE); / 释放整个范围的地址 return 0; 例 3-6源代码 例 3-6执

10、行代码 下一页 上一页 停止放映 第 14/76 页 程序执行结果 下一页 上一页 停止放映 第 15/76 页 2 动态连接库的使用 动态链接库 ( Dynamic-Link Library),简称 DLL,是基 于 Windows程序设计的一个重要组成部分。 优点: 1 使用 DLL的动态连接不是将库代码拷贝,只在程序中记录 函数的入口点和接口,在程序执行时才将库代码装入内存, 如果有多个程序使用相同的 DLL,也只需将 DLL在内存中装 载一次,节省了内存开销。 2 DLL是基于 Windows的程序模块,它不仅包含可执行代码, 还可以包含数据,各种资源,扩大了库文件的使用范围。 3 对

11、于一个大型的、不断更新的应用程序,可以将许多重复 的功能写成 DLL,用主程序调用,这样既减少了开发的工作 量,又提高了访问速度。 4 DLL独立于编程语言,可以使用目前流行的多种计算机语 言或开发工具来编制和调用,比如: VC+、 C+Builder、 PB、 VB、 Delphi和汇编语言等。 下一页 上一页 停止放映 第 16/76 页 例 3-7 编写计算圆周率的程序 解题思路 o 已经提供可以计算任意位小数的圆周率的动态 链接库文件 “ pi.dll” 和静态库文件 “ pi.lib” , 需要将它们拷贝到工程的 “ Debug” 子目录中 。 o 在 “ pi.dll” 中 存 在

12、 计 算 圆 周 率 的 函 数 ComputPI, 格式如下: int ComputPI(long bits); o 其中 , 参数 bits代表要求的圆周率的小数位数; 返回值是 0表示成功 , 是 1表示失败 。 下一页 上一页 停止放映 第 17/76 页 程序步骤 建立 “ Win32控制台工程 ” ,工程名称为 “ Example3_7”; 在工程中添加一个 C+源程序文件,文件名称 为 “ Example3_7.cpp”; 在工程中加入文件 “ pi.lib”。 下一页 上一页 停止放映 第 18/76 页 源程序 #include #include int ComputPI(l

13、ong bits); int main(int argc, char *argv) if (argc 2) couta使用方法 : Example3_7 ; return 1; char *p; long n=strtol(argv1, /转换为 long型整数 if(n0) cout“a输入数据错 ” ; return 1; if(ComputPI(n)=1) couta计算出错数据错 endl; return 0; 例 3-7源代码 例 3-7执行代码 下一页 上一页 停止放映 第 19/76 页 程序执行结果 下一页 上一页 停止放映 第 20/76 页 四、 设备与文件管理应用程序设计

14、 设备管理、文件管理于人机接口管理 的相关概念 设备管理程序设计 文件设备管理程序设计 人机接口管理程序设计 下一页 上一页 停止放映 第 21/76 页 1. 设备管理与程序设计 主要任务 根据确定的设备分配原则对设备进 行分配,使设备与主机能够并行工 作,为用户提供良好的设备使用界 面,以提高设备与设备之间,设备 与之间,进程与进程之间的 并行性,从而提高整个操作系统的 效率。 下一页 上一页 停止放映 第 22/76 页 设备和内存之间数据传输方式 操作系统的设备管理程序通 过四种控制方式完成设备与 内存之间的数据传送。 1程序直接控制方式 中断控制方式 DMA方式 通道方式 下一页 上

15、一页 停止放映 第 23/76 页 ( 1)循环探测 I/O方式 通过设置一个测试 I/O设备 “ 忙 /闲 ” 状态标志的 触发器。若它置 “ 闲 ” ,则执行 I/O操作,若它 置 “ 忙 ” ,则 CPU不断对它进行监测,直至设 备 “ 闲 ” 下来为止。在早期计算机系统中主要 采用这种方式。 由于 CPU速度比 I/O设备速度高得多,而循环测 试 I/O方式使得 CPU与外部设备只能串行工作, 因此 CPU绝大部分时间都处于等待 I/O设备完成 的循环测试中, CPU资源浪费极大。 优点: 管理简单 缺点: 浪费了 CPU资源 下一页 上一页 停止放映 第 24/76 页 ( 2)中断

16、处理方式 为了克服循环测试方式的缺点( CPU必须不断主 动测试 I/O设备是否空闲),引入中断处理技术。 该方式的核心就是使 I/O设备具有主动 “ 汇报 ” 的 能力;每当完成 I/O操作后,便给 CPU发一个通告 信号。只有当 CPU接到 I/O设备中断请求后,才处 理 I/O操作。 优点 : 速度快,提高了资源的利用率。 缺点 : I/O操作还依赖于 CPU,如果 I/O处理频繁, CPU也将很忙。特别是对字符设备,传送一个字 符,就要响应一次中断处理;若字符 I/O设备很多、 传输量很大时, CPU可能完全陷入 I/O处理中而不 能自拔。 示例 下一页 上一页 停止放映 第 25/7

17、6 页 DMA方式 ( Direct Memory Access) 中断方式只能提高 CPU的利用率,但在传送数据量大、 速度高的情况下,其处理效率就不理想了。 目前在块设备的 I/O系统中,采用 DMA方式。它是一种简 单的通道方式,即在硬件的支持下,通过占用总线控制 权,实现信息交换。这种方法并不中断当前 CPU的工作, 而只是在 CPU暂停的几个周期内由 DMA控制器实现信息 交换。即 DMA为具有部分 CPU功能的装置。 优点: I/O操作处理速度快。 缺点: DMA方式只能完成简单的数据传输,不能满足更 复杂的 I/O操作要求,在大、中型计算机系统中,普遍采 用 I/O处理机来管理外

18、部设备和主存之间的信息交换。 下一页 上一页 停止放映 第 26/76 页 ( 4)通道( Channel)方式 要想把 CPU从繁忙的杂务中解放出来,必须使 I/O设备的管理不再依赖于 CPU。“通道”是 具有相对独立的 I/O处理能力的装置。如大型 机的前端机, PC机的 Intel 8090( I/O通道)等。 在通道方式下, I/O处理变成了处理机之间的 通讯问题。 在采用通道方式的 I/O系统中, CPU有两个作 用:一是将 I/O操作任务下达给通道,由通道 代替 CPU专门处理 I/O工作;二是随时了解通 道、控制器和设备工作的情况。 下一页 上一页 停止放映 第 27/76 页

19、设备管理示意图 CPU CH1 CH2 CHn CU1 CU2 CUm DV1 DV2 DV3 DV4 DVk DVk+1 通道 控制器 设备 下一页 上一页 停止放映 第 28/76 页 缓冲技术与设备分配 缓冲技术 单缓冲、双缓冲、多缓冲和单缓冲池 设备分配 专门的数据结构 最佳的设备分配原则和策略 设备驱动程序 下一页 上一页 停止放映 第 29/76 页 例 3-8 光驱管理程序 算法分析 通过使用媒体控制接口 (MCI) 的 API函数,实 现对光驱的操作。 编写命令行式的程序,格式为: 光驱操作命令 光驱号 操作参数 接收命令行的 argv1参数,代表光驱盘符, 和 argv2参数

20、,代表操作命令( O表示打开, C表示关闭); 根据 argv2参数的值,分别传递 argv1参数 调用函数 OnCdopen打开光驱和 OnCdclose关 闭光驱。 下一页 上一页 停止放映 第 30/76 页 解题思路 使用“ mmsystem.h”中的媒体控制接口 (MCI) API函数; MCI_OPEN_PARMS /打开光驱参数结构体 MCI_STATUS_PARMS /光驱状态参数结构体 ZeroMemory函数 /光驱参数赋零,将光驱类型 /参数设为 CD_AUDIO mciSendCommand函数 /发送设备打开命令 根据命令参数打开光驱和关闭光驱 最后释放设备存储。 下

21、一页 上一页 停止放映 第 31/76 页 对话框框架程序用到的元素 MCI_OPEN_PARMS结构体 MCI_STATUS_PARMS结构体 mciSendCommand函数 ZeroMemory函数 下一页 上一页 停止放映 第 32/76 页 结构体说明 光驱管理程序 typedef struct tagMCI_OPEN_PARMS /打开光驱参数 DWORD dwCallback; / MCIDEVICEID wDeviceID; WORD wReserved0; LPCSTR lpstrDeviceType; LPCSTR lpstrElementName; LPCSTR lpst

22、rAlias; MCI_OPEN_PARMS; typedef struct tag MCI_STATUS_PARMS /光驱状态参数 DWORD dwCallback; DWORD dwReturn; DWORD dwItem; DWORD dwTrack; MCI_STATUS_PARMS; 下一页 上一页 停止放映 第 33/76 页 设备控制函数说明 MCIERROR mciSendCommand( /发送打开设备命令 MCIDEVICEID IDDevice, /设备标示号 UINT uMsg, /命令消息 DWORD fdwCommand, /命令消息标志 DWORD dwPara

23、m /命令消息参数 ); void ZeroMemory ( /初始化数据函数 PVOID Destination, /填充地址 DWORD Length /填充字节大小 ); 下一页 上一页 停止放映 第 34/76 页 源程序 #include #include #include /MCI API函数头文件 #pragma comment(lib,winmm) void CD_OpenCloseDrive(BOOL bOpenDrive, TCHAR cDrive) MCI_OPEN_PARMS op; /光驱打开参数结构 MCI_STATUS_PARMS st; /光驱状态参数结构 DW

24、ORD flags; TCHAR szDriveName4; /光驱盘符变量 strcpy(szDriveName, X:); :ZeroMemory( /光驱参数赋值为 0 op.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO; /光驱类型参数为 CD_AUDIO if (cDrive 1) szDriveName0 = cDrive; op.lpstrElementName = szDriveName; /光驱盘符参数为函数参数 flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEME

25、NT | MCI_OPEN_SHAREABLE; else flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_SHAREABLE; if ( !mciSendCommand(0,MCI_OPEN,flags,(unsigned long) if(bOpenDrive) mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0); /打开光驱 else mciSendCommand(op.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0); /关闭光驱 mci

26、SendCommand(op.wDeviceID,MCI_CLOSE,MCI_WAIT,0); /释放设备存取 下一页 上一页 停止放映 第 35/76 页 子函数源程序 void OnCdopen(CString m_Letter) /打开光驱子函数 CString new_letter = m_Letter; /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/打开指定盘符光驱 m_Letter = ; void OnCdclose(CString m_Letter) /关闭光驱子函数 CString new_letter = m_Letter;

27、 /取得输入光驱盘符 CD_OpenCloseDrive(TRUE, new_letter0);/关闭指定盘符光驱 m_Letter = ; 下一页 上一页 停止放映 第 36/76 页 主函数 int main(int argc, char *argv) if (argc 3) couta使用方法 : Example3_8 ; return 1; if( argv20=O ) OnCdopen(argv1); else OnCdclose(argv1); return 0; 例 3-8源代码 例 3-8执行代码 下一页 上一页 停止放映 第 37/76 页 例 3-9 双缓冲显示位图程序 在

28、程序设计中,普通的绘图方法是一个图形 一个图形地直接绘制到屏幕上,这样做的缺 点是会引起屏幕闪烁。 采用双缓冲技术 可 以减少屏幕的闪烁。 下一页 上一页 停止放映 第 38/76 页 解题思路 本程序采用单文档 /视图框架 ; 本程序中定义一个内存显示设备对象 MemDC、屏幕显 示设备对象 pDC和位图对象 m_Bitmap; 其中 CBitmap是 MFC提供的一个表示位图文件的位图 类,一个位图具有它的类型、大小和颜色值等 ; 通过 MemDC的函数 CreateCompatibleDC建立与屏幕 显示兼容的内存显示设备 ; 通过 m_Bitmap的函数 CreateCompatibl

29、eBitmap建立 一个与屏幕显示兼容的位图 ; 通过 MemDC的函数 SelectObject将位图选入到内存显 示设备中 ; 接着在内存位图中进行绘制 ; 绘制完成后通过 pDC的函数 BitBlt将内存中的图拷贝到 屏幕上进行显示 ; 使用完成后,需要清除位图对象 m_Bitmap和内存显示 设备 MemDC。 下一页 上一页 停止放映 第 39/76 页 程序步骤 建立单文档 /视图框架程序,工程名为“ Example3_9”; 在文件“ Example3_9View.cpp”的 OnDraw(CDC* pDC) 函数中添加如下代码: CDC MemDC; /首先定义一个显示设备对象

30、 CBitmap m_Bitmap; /定义一个位图对象 int nWidth=500; /绘图宽度 int nHeight=500; /绘图高度 MemDC.CreateCompatibleDC(NULL); /建立与屏幕显示兼容的内存显示设备 m_Bitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight); /建立一个与屏幕 显示兼容的位图 MemDC.SelectObject( /将位图选入到内存显示设备中 MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(192,192,192); /画实心矩形 MemDC.E

31、llipse(100,100,400,400); /画圆 MemDC.MoveTo(100,100); /移动到指定位置 MemDC.LineTo(400,400); /画直线 MemDC.TextOut(220,250,“欢迎” ); /显示文字 pDC-BitBlt(0,0,nWidth,nHeight, /将内存中的图拷 贝到屏幕上进行显示 m_Bitmap.DeleteObject(); /清除位图对象 MemDC.DeleteDC(); /清除内存显示设备 程序运行即可得到结果 . 下一页 上一页 停止放映 第 40/76 页 程序运行结果 例 3-9执行代码 下一页 上一页 停止放

32、映 第 41/76 页 2. 文件管理与程序设计 主要任务 有效地管理文件的存储空间,合理地组 织和管理文件系统,为文件访问和文件 保护提供更有效的方法及手段,并把这 种存储、检索、共享和保护文件的手段 提供给操作系统本身和用户,以达到方 便用户和提高资源利用率的目的。 下一页 上一页 停止放映 第 42/76 页 文件 有关概念 文件 一组相关信息的集合,文件具有一定的数据结构、 数据、分类属性和访问权限。 文件从物理上,由位( bit)、字节( byte)、块 ( block)、页( page)和盘( disk)等组成; 物理结构有连续文件结构、串联文件结构和索引 文件结构。 从逻辑上,有

33、字( word)、字段( segment)、 记录( record)、虚拟块( virtual block)、文 件( file)、文件目录( file directory)、文件 夹( folder)和文件卷( volume)等。 逻辑结构可分为两大类:字符流式的无结构文件 和记录式的有结构文件。 下一页 上一页 停止放映 第 43/76 页 文件系统 文件管理程序和所管理的全部文件(文件与目录 的集合)。 最常用的一些文件类型是: .exe 可执行文件 .wav 声音文件 .lib静态库文件 .jpg 图片文件 .dll动态库文件 .doc Word文件 .ocx 组件文件 .mdb Ac

34、cess数据库文件 .cpp C+源程序文件 .log日志文件 .java Java源程序文件 .bmp 位图文件 .html 网页文件 .ini初始化文件 .chk磁盘整理文件等等 下一页 上一页 停止放映 第 44/76 页 文件保护 文件的保护可以通过改变文件属性 为可读、可写、可执行、隐藏和归 挡来进行。 下一页 上一页 停止放映 第 45/76 页 文件系统格式 Windows操作系统采用 FAT32和 NTFS两种 文件系统格式: 其中 FAT32采用 文件目录表 ( file directory table,FDT)和 文件分配表 ( file allocate table,FA

35、T)相结合的方式来管 理文件。 FAT32的文件分配表是 32位的, 增强了对磁盘的管理能力,减少了磁盘空 间的浪费。 NTFS采用压缩存储方式,具有文件权限 的管理功能,能够更好地管理文件。 下一页 上一页 停止放映 第 46/76 页 文件结构 文件的结构包括 物理结构 和 逻辑结构 。 文件的物理结构又称为文件的存储结构,它是 指文件在外存上的存储组织形式,与存储介质 的存储性能有关。 常用的物理结构有 连续文件 结构、 串联 文件结 构和 索引 文件结构。文件的逻辑结构是用户所 观察到的文件组织形式,是用户可以直接处理 的数据及结构,它独立于物理特性,又称为文 件组织( FILE OR

36、GANIZATION)。 文件的逻辑结构可分为两大类: 字符流式 的无 结构文件和 记录式 的有结构文件。 下一页 上一页 停止放映 第 47/76 页 文件的逻辑结构 文件的逻辑结构分为两种形式: 一种是有结构的 记录式文件 ,它由一组相关 记录组成。文件中的记录可按顺序编号为记录 1、 记录 2、 、记录 n。 例如,数据库文件。 另一种是无结构的 流式文件 ,它是指由字符 序列集合组成的文件。 例如,一个 Word文件。 在 UNIX中,所有文件都被看作是流式文件, 包括打印机、显示器等 I/O设备。 示例 示例 下一页 上一页 停止放映 第 48/76 页 文件的物理结构 是指文件在存

37、储设备上的存放形式 。 文件在逻辑上是连续的 , 但在存储设备上存放时却 有几种不同形式: 连续文件 。又称顺序文件。其特点是文件存放在存储设 备的相临的物理块中,即连续存放。 串联文件 。又称链表文件。它采用非连续的物理块来存 放文件信息,将文件的所有物理块串联组成一个链表, 块之间通过指针链接。 索引文件 。索引文件要求系统为每一个文件创建一张索 引表,索引表的表项给出文件的逻辑块号和物理块号的 对应关系。 Hash(散列)文件 。它采用计算寻址方法,将记录键值 通过 Hash函数计算转换成相应记录的地址。 示例 下一页 上一页 停止放映 第 49/76 页 文件的目录结构 文件组织体系中

38、还包括文 件的目录结构 。 用户使用的是文件的逻辑 结构 , 系统使用的是文件的 物理结构 , 在两种不同的组 织结构之间似乎应该有衔接 的纽带 。 衔接的纽带就是 文件 的目录结构 。 通过文件的目录结构 , 将 文件的逻辑结构和文件的物 理结构联系在了一起 。 下一页 上一页 停止放映 第 50/76 页 例 3-10 驱动器浏览程序 解题思路: 本程序显示操作系统中的所有盘符,程序中用到 MFC和 Windows API函数; CString代表一个字符串对象; SetAt 函数改变字符串某个位置的字符; GetLength函数取得字符的长度; GetBuffer函数将一个 CStrin

39、g型的字符串转换为 LPTSTR类型的指定长度的字符串; 宏变量 DRIVE_REMOVABLE、 DRIVE_FIXED、 DRIVE_REMOTE、 DRIVE_CDROM和 DRIVE_RAMDISK分别表示不同类型的盘,在程 序代码中有说明。 下一页 上一页 停止放映 第 51/76 页 程序步骤 调用 API函数 GetLogicalDrives取得“我的电脑” 中的所有逻辑盘,并得到一个 DWORD类型的数, 其中的某一位为 1时表示该位代表的盘存在。其中 GetLogicalDrives函数的格式为: DWORD GetLogicalDrives(VOID); 通过提取 dwDr

40、iveList的每一位,得到所有盘符; 调用 API函数 GetDriveType判别每一盘符的类型, 其中 GetDriveType函数的格式为: UINT GetDriveType(int nDrive) 下一页 上一页 停止放映 第 52/76 页 程序 #include #include void main() int nPos = 0; UINT nCount = 0; CString strDrive = ?:; DWORD dwDriveList = GetLogicalDrives (); /取得我的电脑的所有盘 CString cTmp; UINT nType; cout我的

41、电脑包含如下盘 : endl; while (dwDriveList) if (dwDriveList strDrive.SetAt (0, 0 x41 + nPos); /将数字表示的盘符转换为字母 coutstrDrive.GetBuffer(strDrive.GetLength(); /将字符串转换为指定格式 nType = GetDriveType (LPCTSTR) strDrive); /取得每个盘的类型 switch (nType) case DRIVE_REMOVABLE: cout可移动盘 endl; break; case DRIVE_FIXED: cout逻辑硬盘 end

42、l; break; case DRIVE_REMOTE: cout网络盘 endl; break; case DRIVE_CDROM: coutCDROM盘 endl; break; case DRIVE_RAMDISK: coutRAM盘 endl; break; default: cout未知类型盘 = 1; /准备取得下一个盘符 nPos+; cout共: nCount个盘 endl; 下一页 上一页 停止放映 第 53/76 页 程序运行结果 例 3-10执行代码 下一页 上一页 停止放映 第 54/76 页 例 3-11 判别指定文件或文件夹属性 算法分析 1. 从命令行输入指定的文

43、件或目录名称,可以包含通配 符 ( “*” 和“ ?”)。命令格式为: 命令 文件名 1. 使用 FMC的 CFileFind类的 FindFile函数对指定文件进 行查找。 2. CFileFind类的 FindNextFile函数对指定文件继续进行 查找(因指定的文件可能含有通配符)。 3. 分别通过函数 GetFileName、 GetFilePath、 IsDirectory、 IsReadOnly和 GetCreateTime得到文 件的名称、路径、是否目录、是否只读和建立时间等, 并显示相应结果。 下一页 上一页 停止放映 第 55/76 页 解题思路 本应用用到 MFC的 CFi

44、leFind类的 FindFile、 FindNextFile、 GetFileName、 GetFilePath、 IsDirectory、 IsReadOnly和 GetCreateTime 函数; 还用到 CTime类的 GetYear、 GetMonth、 GetDay函数取得文件建立的时间(年、月、 日)。 下一页 上一页 停止放映 第 56/76 页 源程序 #include #include void main(int argc,char *argv) if(argc2) cout 使用格式: Example3_11 endl; exit(1); CFileFind finder

45、; BOOL bWorking = finder.FindFile(argv1); /取得命令行参数指定的文件名 ,并查询 while (bWorking) bWorking = finder.FindNextFile(); /继续查询下一个文件 cout 文件名称: (LPCTSTR) finder.GetFileName() endl; cout 文件路径: (LPCTSTR) finder.GetFilePath() endl; if(finder.IsDirectory( ) cout 目录 endl; else cout 文件 endl; if(finder.IsReadOnly(

46、) cout 只读 endl; CTime fileTime; finder.GetCreationTime(fileTime); /取得文件建立时间 cout 建立时间是: fileTime.GetYear()年 ; cout fileTime.GetMonth()月 ; cout fileTime.GetDay()日 endlendl; 下一页 上一页 停止放映 第 57/76 页 程序运行结果 例 3-11执行代码 下一页 上一页 停止放映 第 58/76 页 例 3-12 读取位图文件属性程序 算法分析 从命令行输入指定的位图文件名称; 命令格式为: 命令 位图文件名 定义位图文件头结

47、构变量 BitmapFileHeader; 定义位图信息结构变量 BitmapInfo; 打开指定文件; 使用函数 fread分别读取位图文件头和位图信息; 关闭指定文件。并显示位图文件名称、位图文 件类型、图像宽度、图像高度和每个像素的位数。 下一页 上一页 停止放映 第 59/76 页 解题思路 位图文件是 Windows操作系统中很重要的一种图 形格式 , 本例是对位图文件的简单操作 。 本程序用到的结构体和函数有: BITMAPFILEHEADER /位图文件头结构 体 BITMAPINFO /位图信息结构体 fread( ) 函数 /文件读函数 下一页 上一页 停止放映 第 60/7

48、6 页 BITMAPFILEHEADER格式 位图文件头结构体为: typedef struct tagBITMAPFILEHEADER WORD bfType; /文件类型 DWORD bfSize; /文件大小 WORD bfReserved1; /文件保留 1 WORD bfReserved2; /文件保留 2 DWORD bfOffBits; / ; 下一页 上一页 停止放映 第 61/76 页 位图信息结构体 位图信息结构体 BITMAPINFO的格式为: typedef struct tagBITMAPINFO BITMAPINFOHEADER bmiHeader; /位图像素、像

49、素位数 RGBQUAD bmiColors1; /颜色 BITMAPINFO; 下一页 上一页 停止放映 第 62/76 页 Fread函数 函数 fread的格式如下: size_t fread( void *buffer, /文件缓冲区 size_t size, /缓冲区块长度 size_t count, /缓冲区块个数 FILE *stream /文件流指针 ); 下一页 上一页 停止放映 第 63/76 页 源程序 #include #include #include void main(int argc,char *argv) if(argc2) cout用法: Example3_1

50、2 endl; exit(1); BITMAPFILEHEADER BitmapFileHeader; /定义位图文件头结构变量 BITMAPINFO BitmapInfo; /定义位图信息结构变量 FILE *fp=fopen(argv1,rb); /打开命令行指定的文件 if(fp=NULL) cout文件 :argv1打开错误 endl; exit(1); fread( /读位图文件头 fread( /读位图信息 fclose(fp); /关闭文件 cout位图文件名称为 : argv1endl; cout位图文件类型为 : (char)BitmapFileHeader.bfType;

51、cout(char)(BitmapFileHeader.bfType/0 x100)endl; cout位图文件的大小 : BitmapFileHeader.bfSizebytesendl; cout图像宽度 : BitmapInfo.bmiHeader.biWidth点 endl; cout图像高度 : BitmapInfo.bmiHeader.biHeight点 endl; switch(BitmapInfo.bmiHeader.biBitCount) /每个像素的位数 case 0: coutJPEG图 endl; break; case 1: cout单色图 endl; break;

52、case 4: cout16色图 endl; break; case 8: cout256色图 endl; break; case 16: cout64K图 endl; break; case 24: cout16M真彩色图 endl; break; case 32: cout4G真彩色图 endl; break; default: cout单位像素位数未知 GetSafeHwnd()取得 ; lpOperation可以是“ open”(打开)、“ print”(打印)和 “ explore”(浏览目录)、 参数 lpFile为需要处理的文件名、 参数 lpParameters为文件参数,参数

53、 pDirectory为文件目录,参数 nShowCmd为窗口打开的大小( SW_SHOWNORMAL、 SW_SHOWMAXIMIZED等)。 下一页 上一页 停止放映 第 67/76 页 程序步骤 在 VC+中建立文档视图的程序框架,工程命名为 “ Example3_15”; 加入一个新对话框,并按下列要求设计对话框资源: 对话框资源号为:“ IDD_STUDENTDIALOG”; 对话框窗口标题为:“增加学生期末考试成绩”; 设置对话框中对象的属性;放置 6个静态文本控件, 6个 编辑文本控件, 2个按钮控件,以及对应的控件变量。 在工程中增加一个 Student类: 创建菜单、修改菜单

54、属性; 在类“ Example3_14View”中增加成员变量: public: int count; Student student501; 在文件“ Example3_14View.cpp”中加入操作代码。 下一页 上一页 停止放映 第 68/76 页 Student 类成员 public: int No; CString Name; float MathScore,EnglishScore,ComputerScore, AverageScore; Student() MathScore=EnglishScore=ComputerScore=Average Score=0; 下一页 上一页

55、 停止放映 第 69/76 页 CExample3_14View()的代码 #include Student.h #include StudentDialog.h CExample3_14View:CExample3_14View() count=0; 下一页 上一页 停止放映 第 70/76 页 CExample3_14View:OnAdd() 代码 void CExample3_14View:OnAdd() CStudentDlg dlg; dlg.m_Count=count; int result=dlg.DoModal(); if(result=IDOK) studentcount.N

56、o=dlg.m_No; studentcount.Name=dlg.m_Name; studentcount.MathScore=dlg.m_MathScore; studentcount.EnglishScore=dlg.m_EnglishScore; studentcount.ComputerScore=dlg.m_ComputerScore; studentcount.AverageScore=(studentcount.MathScore+ studentcount.EnglishScore+ studentcount.ComputerScore)/3; count+; 下一页 上一页

57、 停止放映 第 71/76 页 CExample3_14View:OnShow()代码 void CExample3_14View:OnShow() FILE *file=fopen(Student.txt,wt); char *p; char p1256; p= 学生期末考试成绩单 rn学号 姓名 数学 英语 计算机 均分 rn; fputs(p, file); p=rn; fputs(p, file); for(int i=0;iGetSafeHwnd(), open, Student.txt, NULL, NULL, SW_SHOWNORMAL); 下一页 上一页 停止放映 第 72/7

58、6 页 CExample3_14View:OnTotal()代码 void CExample3_14View:OnTotal() FILE *file=fopen(StudentTotal.txt,wt); char *p; char p1256; p= 学生总成绩单 rn人数 数学 英语 计算 rn; fputs(p, file); p=rn; fputs(p, file); studentcount.MathScore=0; studentcount.EnglishScore=0; studentcount.ComputerScore=0; for(int i=0;iGetSafeHwnd

59、(), open, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL); 下一页 上一页 停止放映 第 73/76 页 CExample3_14View:OnPrint()代码 void CExample3_14View:OnPrint() ShellExecute(this-GetSafeHwnd(), print, Student.txt, NULL, NULL, SW_SHOWNORMAL); 下一页 上一页 停止放映 第 74/76 页 CExample3_14View:OnTotalprint()代码 void CExample3_14View:

60、OnTotalprint() ShellExecute(this-GetSafeHwnd(), print, StudentTotal.txt, NULL, NULL, SW_SHOWNORMAL); 下一页 上一页 停止放映 第 75/76 页 例 3-14运行结果 (b)数据输入 (c)学生成绩单 (d)学生统计成绩单 图 3-44 例 3-14的运行结果 例 3-14执行代码 下一页 上一页 停止放映 第 76/76 页 作业、思考题 作业: 第 3章 一、二、三题的全部 答疑时间: 星期四、五:下午: 4:00 6:00点 答疑地点: 计教中心 505房间 下一页 上一页 停止放映 第

61、 77/76 页 结束语 欢迎参加到中心网站 软件基础 课程 的学习讨论中来。 中心网址: http: / 我的 E-mail地址 : LZQ 谢谢,再见! 下一页 上一页 停止放映 第 78/76 页 Cstring类 Cstring类是 MFC中提供的一个有关字符串操作的应用程序类。它 的定义放在 头文件中。其成员函数有: SetAt( int nIndex, TCHAR ch)替换指定位置上的字符 GetAt( int nIndex)返回指定位置的字符 GetLength()返回字符串的长度 GetBuffer()将 Cstring型字符串转换为 LPTSTR型字符串 Insert()在

62、字符串指定位置插入子串 MakeReverse()将字符串中字符倒序 Format()格式化输出 Find()返回指定字符在字符串中的位置 返回 下一页 上一页 停止放映 第 79/76 页 MFC的概述 MFC是一个 Windows应用程序框架,它定义了 应用程序的结构,并实现了标准的用户接口。 MFC提供了管理窗口、菜单、对话框的代码,可 实现基本的输入 /输出和数据存储。 使用 MFC库,可以在 Windows软件开发专家的 工作基础上建立自己的应用程序。 应用程序框架的核心是“文档 -视图”结构。文档 类的作用是将应用程序的数据保存在文档类对象 中,视图类的作用是显示数据和编辑数据。

63、MFC库协调着文档、视图、框架窗口以及应用程 序对象之间的相互作用。 下一页 上一页 停止放映 第 80/76 页 MFC类功能简介 1. 根类 CObject 2. MFC应用结构类 应用和线程支持类、命令例程类、文档类、文 档模板类 3. 窗口、对话和控件类 CWnd类、框架窗口类、对话框类、视图类、控件类、 控件条类 4. 菜单类 5. 绘图和打印类、输出(设备上下文)类、绘图工具类 6. 简单的数据类型类 7. 数组、列表和映射类 8. 文件和数据库类 文件 I/O类、 DAO类、 ODBC类 9. Internet和网络类 10. OLE类 11. 调试和异常类 下一页 上一页 停止

64、放映 第 81/76 页 MFC类层次 MFC的类可分为两种:从 CObject派生的类及非派生类。 CObject 应用结构类 文件服务类 绘图工具类 框架窗口类 CCmdTarget CWnd CDC CFile 所有窗口的基类 CFrameWnd 对话框类 CDialog 视图类 CView 控件类 CAnimateCtrl 应用对象类 CWinApp CDocument CDocTemplate 文档类 文档模板类 CMenu 菜单类 CArray 数组类 CList 列表类 CMap 映射类 CGdiObject 返回 下一页 上一页 停止放映 第 82/76 页 CDC类 MFC的

65、类中与图形操作有关的类有两种:一种 是 CDC( Class Device Context)类、一种是 GDI( Graphic Device Interface)对象类。 GDI图形设备接口是 Windows提供的一个图形 操作的抽象的接口,通俗地讲是各种关于图形 操作的函数库。 Windows不允许应用程序直接 访问硬件,而是通过 GDI间接地和硬件打交道 (通过“设备环境” DC)。 CDC类主要功能是完成绘图功能和环境的建立。 下一页 上一页 停止放映 第 83/76 页 CDC类中常用的函数及功能 BitBlt() TextOut() LineTo() Ellipse() FillR

66、ect() MoveTo() Ractangle() Pie() Polygon() GetTextColor() SelectStockObject() SetWindowOrg() SetWindowExt() 把位图从一个 DC拷贝到另一个 DC 绘制文本 绘制线条 绘制椭圆或圆 用给定的画笔的颜色填充矩形 设置画笔的位置 绘制矩形 绘制饼图 绘制多边形 获取文本的颜色 选取 GDI绘图对象 设置窗口中坐标系中的原点 设置窗口的范围 下一页 上一页 停止放映 第 84/76 页 CDC类的使用方法 1. 对于显示器类型的 DC 1) 调用 CDC*CWnd:GetDC()函数来获得指向窗口的工 作区的 DC指针 ; 2) 利用得到的 DC指针 ,调用 CDC类的函数完成绘制工作; 3) 使用 ReleaseDC()释放获得的 DC。 2. 对于内存型的 DC 1) 调用 CDC*CWnd:CreateCompatibleDC()函数来创 建兼容设备环境 ; 2) 利用得到的 DC对象,调用 CDC类的函数,来完成绘 制工作; 3) 使用 DeleteDC()删除创建的 DC。 返

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!