




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
电脑钢琴系统电脑钢琴系统 汇编语言程序设计汇编语言程序设计 一、课题内容和要求课题内容和要求 题目描述:题目描述:利用汇编语言设计一个模拟钢琴演奏程序。在显示器上显示出钢琴 的键盘,以计算机键盘的相应键模拟钢琴键盘进行乐曲的演奏。在 PC 机键盘上 按键,屏幕上对应的钢琴键出现跳动,并发出相应音符的声音,例如: 按数字 “1” , 发 C 大调 do 按数字 “2” , 发 C 大调 re 按数字 “3” , 发 C 大调 me 按空格(其它)鍵,退出。 基本要求基本要求:(1)设计一个基本的只有 7 键的模拟钢琴键盘; (2)按键时,对应的钢琴键有反映,并发出相应频率的音符声; (3)松键时,对应的钢琴键恢复原状; (4)实物演示时要求讲出程序原理和设计思想; (5)程序运行良好、界面清晰。 提高要求提高要求: (1)绘制出三维立体钢琴键,随着按键,对应钢琴键有向下的动 作; (2)钢琴声随着琴键按下时间的长短持续发出不同长短的声音; (3)扩展钢琴的音域。 二、需求和思路分析二、需求和思路分析 (1)钢琴的绘制。这部分主要实现画钢琴键盘键身的功能。它是由一个个 白色的长方块构成的,要在屏幕上画出有立体效果的长方形白色键盘,我们需 要用 BIOS 调用编织线使程序。显示适配器都自带显示服务的 BIOS,利用它所 提供的 BIOS 调用来编写程序,对于我们编程应用者来说是透明的,我们只需要 调用显示驱动程序 INT 10H。钢琴主要是由矩形、直线等规则几何形状构成, 可以采用文本方式,也将屏幕设置成图形显示方式,通过画点、画线等基本程 序完成钢琴的绘制。 对于绘制钢琴键盘,为使其有立体感,还需要先在稿纸上画出一个缩小版 的钢琴键盘,准确计算其各个边界的坐标,包括为使其有立体感而要画出斜线 的方法,都需要事先准确推出运算公式。 钢琴键盘的动态显示则是同步于键盘的按键有按下和弹起的动画。这部分 功能需要也可以用绘制钢琴的方法来实现这个效果。 (2)音符的演奏。在 PC 系列机上,8254 的三个计数器各有其作用,计数 器 0 用于维护系统时钟;计数器 1 用于周期性的向 DMA 发送数据请求信号,供 存储器刷新使用;计数器 2 接到扬声器用来产生声音。各计数器的输入时钟脉 冲频率均为 1.19318MHz。通过设置计数值可以产生各种频率的声音。与此同时, 许多输入输出操作都是由 8255A 可编程外设接口来控制的。利用 CPU 支持的外 围电路 8254 与 8255,通过汇编程序改变 8255 的 PB0,PB1 口,接通扬声器, 使得计算机能够发出一定频率的声音,同时通过 8254 的与 8255 连接的 2 号计 数器控制指定频率,从而达到控制扬声器的音调的效果。 三、概要设计三、概要设计 绘制钢琴键盘的流程图: Flow Direction BL 0 YES - DI+80 CX+20BL+1 BL7 DX-1 DX NO 在绘制键盘的程序中,基本的就是调用 INT 10H,重要的是键盘坐标的设 计,以及各个颜色的设定,以实现立体效果。由于要画斜着的键盘键身,而汇 编程序本身只有画点的功能,所以我们就要设计一个循环来实现键盘的绘制。 对每个坐标点(CX,DX)进行画点,DX 不变,CX 每画完一个就自增,在规定界限 内实现一整行的绘制,而在 DX 自减 1,CX 不变则对上一行的点进行绘制。循环 便能进行整个键盘竖直部分的绘制。 斜线部分则需要一些巧妙的设计,因为设置 DI 为右边界,而每个点的横坐 标 CX 的起始位置始终是 DI 减去键盘键身宽度,如果要画斜线则 DI、CX 在画第 一个键盘的时候就应该比竖直部分少 1,根据这样的特征,可以先设置一个拐 点处的纵坐标值 450,高于这个值时,画竖直部分;低于这个值时画斜线部分。 发声部分的原理设计是利用可编程定时/计数器 8254 在扬声器中的应用而 完成的。扬声器驱动系统的硬件组成如下图所示。利用 8254 驱动扬声器发声是 由系统插件上 8255 的外围电路来发出驱动信号的。如下图中的 spk data 和 tim gatespk 就是接在 8255 的输出端口上。其中 tim gatespk 控制 8254 定时 器来驱动扬声器,spk data 来控制扬声器的门电路。直接由门电路驱动发出的 声音比较难听,通过滤波器滤掉杂波之后会更动听一些,所以最好如下图所示 加一个滤波器。 8255A 由一个控制寄存器,三个输入输出数据寄存器。输入输出寄存器又 称为输入/输出端口。这三个端口的名字分别称为 A 口、B 口和 C 口。一般编址 为 60H,61H 和 62H。在系统初始化的时候已经将 A 口和 C 口设为输入方式,B 口 设为输出方式。 可以通过对 8254 计数器编程使产生某一频率的方波,输出经过驱动器驱动, 推动扬声器发出声音。 发声部分的流程图: 8254 8255A NO ASCII -30 AL AL N 键盘按下有声音且要保持声音随按键的长短而不同,需要监视 8255 状态端 口,在没有丢开键时,扬声器不会关闭而会一直发声。 在键盘 17 按下的同时要屏幕键盘要有显示,则需要调用 DOWN 子程序,来 实现琴键按下的动态效果。因为在扬声器没有关闭时,不会调用 UP 子程序,所 以琴键也会随按键的长短而停留住,使按键的动态效果更加合理。 DOWN、UP 子程序原理和绘制钢琴键盘部分一样,在这里就不再累述。 四、详细设计四、详细设计 详细源代码及注释: DATA SEGMENT DAT DB 0, 45, 75, 100, 125, 157, 190, 222, 252 ;各音阶发声的对应的不同频 率值 LEN DB 0, 6, 14, 22, 30, 38, 46, 54, 62 ;屏幕所画键盘的每个键身的 右边界值 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,0 ; 设置屏幕显示图形方式:每屏幕 字符数8025, 16色 MOV AL,12H INT 10H ; 调用10H的0号功能中断 MOV AH,6 ; 窗口上滚功能调用 MOV AL,0 ; 设置颜色为黑色 MOV CH,0 MOV CL,0 MOV DH,18H MOV DL,4FH ;窗口坐标 INT 10H ;执行中断 MOV SI,360 ;键盘键身的最上面坐标 MOV DX,480 ;键盘键身的最下面坐标 MOV DI,540 ;键盘键身的右边界初始值 MOV CX,540 ;画键盘键身的初始横坐标 REDRAW: SUB DX,1 ;画完一行的键盘后画另一行 CMP DX,445 ;为起到三维效果而产生斜线的 临界坐标 ,比较 JA ZHI ;大于445就处在竖直的键盘处, 跳转到画竖直部分代码处 CMP DX,SI ;与键盘键身的最上边界比较 JB LL ;低于此坐标说明整个键盘绘画完 毕,跳转至发声程序代码处 XIE: ;低于临界坐标时要进行画斜线部 分的坐标处理 SUB DI,479 ;右边界和写点横坐标都减去固定 值再减去1 SUB CX,539 ;右边界和写点横坐标都减去固 定值再减去1 JMP HH ;跳转至写点的代码部分 ZHI: ;高于临界坐标时任然要进行画竖 直部分的坐标处理 SUB DI,480 ;右边界和写点横坐标都减去固定 值 SUB CX,540 ;右边界和写点横坐标都减去固 定值 HH: MOV BL,0 ;对每个键盘键身的一行进行计 数, PAINT: MOV AL,15 ;画白色键身 MOV AH,0CH MOV BH,0 ;在第0号显示页写点 INT 10H ;10号中断的0C号功能实 现写点 INC CX ;写完一个点后纵坐标不 变,横坐标加一继续写点 CMP CX,DI JBE PAINT ;在没有超过右边界 的时候按横坐标加一继续写点 ADD DI,80 ;超过右边界后则对右 边界和横坐标进行处理 ADD CX,20 INC BL ;在这种情况下说明一个键 盘键身的一行画完了,在纵坐标不变的情况下画下一个键盘键身的一行 CMP BL,6 ;设定键盘数目 JBE PAINT JMP REDRAW LL: MOV AL,80H ;对8255进行初始化工 作,A口、B口均为输出状态工作与方式0 OUT 63H,AL ;写入控制端口 MOV AL,0B7H ;对计数器8254进行初始化 工作,选2号计数器,且先读写低8位后高8位,工作与模式3 OUT 43H,AL ;写入控制端口 PP: MOV AH,01H ;调用键盘中断等待 键盘输入,并将键盘输入对应的ASCII码值做出口参数存入AL INT 16H JZ PP ;没有键盘输入循环等待 SUB AL,30H ;将对应的ASCII码值减 去30留下个位数值,以便取表中对应的边界值和发声频率值 CMP AL,08H ;AL中的参数将传递到 SOUND子程序去,此处还有按键范围的作用,按键不是17将溢出跳出 JAE OVER1 CALL SOUND ;调用发声程序子程序 JMP PP ;一个按键的发声结束, 等下一个键盘输入 OVER1:JMP OVER ;溢出 SOUND PROC NEAR ;发声子程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI ;保护变量,以便在此 子程序中用到变量时不至改变原值影响下面操作 MOV AH,0 ;使SI中的值就是键 盘参数的十进制值 MOV SI,AX ; 保护AL于SI中,以 待后用,作为参数传递 MOV BX,OFFSET DAT XLAT ;差频率值表中的值,并 赋给AL MOV DI,AX ;设置发声频率 值的对应键盘所要频率 MOV DX,12H MOV AX,34DCH ; PC机内置计 数器的输入时钟脉冲频率的16进制值1234DC DIV DI ;出后得到8254计 数初值 OUT 42H,AL ;先写低8位 MOV AL,AH OUT 42H,AL ;后写高8位 IN AL,61H ;读PB口当前状态 OR AL,3 ; 使PB0、PB1均 为1 OUT 61H,AL ;接通扬声器,此 时喇叭将在计数器输出的频率工作发声,且CPU得以解放可执行下面的绘图工作 CALL DOWN ;调用使键盘 产生向下按的效果的子程序 WAIT1: IN AL,60H ;查看8255状态端 口 TEST AL,80H ;查询键是否放开 这样键不松开就会一直出声 JZ WAIT1 ;未放开继续查询 CALL UP ;调用使键盘产 生向上跳起效子程序 MOV AL,0 ;关闭扬声器 OUT 61H,AL MOV AL,0H MOV AH,0CH INT 21H POP SI ;还原变量 POP DX POP CX POP BX POP AX RET SOUND ENDP DOWN PROC NEAR ;键 盘按下子程序 PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AX,SI ;将上面做参 数保存起来的SI传递到此运用 MOV BH,AL ;BH中表示 按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值表 得到键盘键身的右边界值,并将结果赋给AL POP BX ;BH中表示按 得是什么键, PUSH BX ;将取出的右 边界值作*10处理 MOV BX,10 MUL BX POP BX MOV SI,AX ;SI中为横坐 标的边界 MOV DX,450 ;键盘竖直部 分要实现按下效果的起始纵坐标 MOV DI,475 ;键盘竖直部 分实现按下效果的临界值 GO: PUSH SI SUB SI,60 ;边界减去键 盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI CA: MOV AL,0 ;对得到的 (CX,DX)点进行写黑色实现擦除效果 MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身 的某行的一个个横坐标点 CMP CX,SI ; 画好一行 没有? JBE CA INC DX ;一行画好后 画另一行 CMP DX,DI JBE GO POP DI POP DX POP CX POP BX POP AX RET DOWN ENDP PUSH BX ;一段延时程序, 以使键盘按下效果不至于太快 PUSH CX MOV BX,1000 DELAY:MOV CX,0FfFH DL10MS:LOOP DL10MS DEC BX JNZ DELAY POP CX POP BX UP PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV AX,SI ;将上面做 参数保存起来的SI传递到此运用 MOV BH,AL ;BH中表示 按得是什么键, MOV BL,0 PUSH BX MOV BX,OFFSET LEN XLAT ;查边界值 表得到键盘键身的右边界值,并将结果赋给AL POP BX ;BH中表示 按得是什么键, PUSH BX MOV BX,10 ;将取出的 右边界值作*10处理 MUL BX POP BX MOV DX,475 ;键盘竖直部 分要实现弹起效果的起始纵坐标 MOV DI,450 ;键盘竖直部 分要实现弹起效果的临界纵坐标 OK: PUSH SI SUB SI,59 ;边界减去键 盘键身的宽度得到写点的起始横坐标CX MOV CX,SI POP SI SB: MOV AL,15 ;对得到的 (CX,DX)点进行写白色实现弹起效果 MOV AH,0CH MOV BH,0 INT 10H INC CX ;某键盘键身 的某行的一个个横坐标点 CMP CX,SI ; 画好一行 没有? JBE SB DEC DX ;一行画好后 画另一行 CMP DX,DI JAE OK POP DI POP DX POP CX POP BX POP AX RET UP ENDP OVER: MOV AH,4CH INT 21H CODE ENDS END START 五、测试数据及其结果分析五、测试数据及其结果分析 测试运行结果如下: 初始键盘竖直部分效果如下: 此结果比较合理的完成了初步设计。 实现简单立体效果后绘制的钢琴键盘如下所示: 当按下一个键时键盘显示一直按下,并一直发声,视觉效果如下所示: 这几步实现设计的所需的功能要求。 六、调试过程中的问题六、调试过程中的问题 调试过程中出现了很多问题,比如琴键的坐标选取的不是很好,出现了不 对齐的情况。经过再次仔细的运算,发现几个坐标在运算过程中会有所偏差, 便对其做了相关的修改。 而监视 8255 状态端口以实现发声时间的长短,则一直不是很顺利。起初的 想法是是查看键盘缓冲区是否有值,但发现键丢开并不会自动使键盘缓冲区的 值去除。经过网上找寻相关功能,终于理解了可以监视 8255 状态端口的方法来 实现监视键盘动作。 值得改进的地方我觉得就是琴键饿设计,可以考虑在两个白色琴键中间再 加上黑色琴键,这样会更加逼真。而且琴键按下的时候可以改进成整个键身都 会按下,而不是只有竖直部分有按下的效果,不过这一想法实现起来应该不是 那么容易。 七、专业课程设计总结七、专业课程设计总结 本程序的关键技术在于 BIOS 程序调用、输入/输出和键盘中断的等方面的 相关知识,包括 BIOS INT10H 程序调用、I/O 接口信息、I/O 端口寻址、输入/ 输出指令、数据传送方式、键盘中断和子程序调用等。通过设计解决了显示器 绘制图形、I/O 寻址及端口地址分配等的问题,不仅回顾了汇编程序设计各个 方面的知识,熟练了代码的编写,也加深了对输入/输出的操作的理解。 正因为汇编语言的特殊性,是要与硬件直接打交道,所以所用的语言也更 难懂,难记。但通过这次课程设计后,我更加熟练地掌握了汇编程序的设计与 代码的编写,也对 PC 机的相关硬件有了更多的认识,如何操作、有何作用都有 了很清楚的概念。 当然在此次课程设计中也遇到了不少问题,比如一开始并不知道如何用汇 编画图,对 8255、8254 的控制设置,端口地址的用处还不是很清楚,这些都通 过半天时间的看书得以解决,所以以后我应该把知识学得更加牢靠一点,到用 到的时候就会水到渠成。 在完成基本要求后便在提高要求的解决上费了一番功夫,主要是斜线画法 的构思和如何实现扬声器一直发声直到键盘的按键丢开。在斜线问题的解决上 是某次灵感突发而想到的,而监视 8255 状态端口的想法则有所参考。所以以后 我定当要把知识学牢,运用起来也就会容易很多。 在程序的调试过程中,出现的问题有些是由于不够仔细,而有些则是由于 对概念和原理对的不清晰造成的。虽然都成功的调试通过,但有些错误还是值 得我在以后的学习中深思和反省的。以使以后不会在出现类似的问题。 对这门课程,我觉得老师的题目选的很好,对我从多方面进行了考察:实 际的动手能力和理论知识的掌握情况等。这将使我们牢固掌握所学知识,不会 遗忘。考核方式也很合理,在适当监督的基础上给我们自己发挥的空间。 文件系统管理文件系统管理 操作系统操作系统 二、课题内容和要求课题内容和要求 实验针对操作系统的文件系统进行题目设计,要求编程实现操作系统文件 系统管理的部分功能,具体包括: (1) 实现一个文本文件(即流式文件)中某信息的插入和删除; (2) 实现一个记录文件的某个记录的插入和删除。 基本要求: (1) 任选 C、C+和 Java 语言实现以上两个功能; (2) 文本文件包含中文和英文; (3) 程序运行良好,界面清晰。 提高要求: (1) 实现文本文件的多个信息或者记录式文件多个记录的插入和删除; (2) 能够用 MFC 或 Java 实现可交互的图形用户界面。 二、需求和思路分析二、需求和思路分析 对于第一个要求,要对文本文件进行操作,首先要对文本文件有足够的了 解。Windows 操作系统中的文本文件其实就是操作系统中文件系统的流式文件, 知道了这一点将对程序设计有很大的帮助。流式文件内的数据只是一串顺序的 信息集合。流式文件中的每个字节都有一个索引,第一个字节的索引是 0,第 二个字节的索引是 1,以此类推,打开文件的进程使用文件读写位置来访 问文件中的特定字节。当文件打开时,文件读写位置(指针)指向首字节,每 k 个字节的读或写操作的完成,则将文件的读写位置(指针)加 k。提供使用流式 文件的系统调用有:read()、write()、seek()。C 函数库再调用这些函数构成 自己的文件操作函数。 在文本文件的题目设计中首先是要实现文件打开,在此之后才能对其某个 信息进行读写、修改、删除。可以利用系统函数 fopen()函数打开想要进行操 作的文件。因为在 windows 操作系统中的文本文件是流式文件,所以对其的读 取可以直接调用 fseek()函数进行定位要操作的位置。但在 MFC 中却没有必要 这么复杂,可以直接运用 Microsoft Windows 的现成资源图标、位图和游标在 Microsoft Visual C+中直接编辑。这样便可以省去自己调用文件系统的系统 函数。 记录式文件是一种有结构的文件,它包含若干逻辑记录,逻辑记录是文件 中按信息在逻辑上的独立含义所划分的信息单位,记录在文件中的排列按其出 现次序编号,记录 0,记录 1,等等。逻辑记录的概念被应用于许多场合, 如某学校的学生住宿文件中,每个学生的住宿信息是一条逻辑记录,整个学校 学生的住宿信息,即全部逻辑记录,便组成了学校的住宿文件。 从操作系统管理的角度来看,逻辑记录是文件内独立的最小信息单位,每 次总是为使用者存储、检索或更新一条逻辑记录,同流式文件一样,通过文件 读写位置(指针)来指定对文件信息的访问,但是在记录式文件中,文件的记录 位置取代字节位置。为了方便记录是文件的组织和管理,提高文件记录的查找 效率,通常对逻辑文件的每条逻辑记录至少指定一个与其对应的基本数据项, 利用它可与同一文件中的其他逻辑记录区别开来。这个用于标识某条逻辑记录 的数据项称为记录键,也叫做关键字,简称键(下面将知道在程序设计中使用结 构型数组的下标来作为记录键的)。 而在记录是文件的设计中要对某条记录进行插入或者删除则没有文本文件 那么容易,首先是记录的构建,由于 Microsoft Visual C+并不能像 Java 一 样创建由 Excle 文件构成的记录式文件,所以只能用以文本文件作为存储,并 在程序运行时以记录的格式读出并操作。在定下这个以文本文件作存储的思路 后就要解决如何实现构建每条记录。如果这一块解决那么记录是文件的操作便 也可以顺利的解决。最后我是这样解决这个问题的,构建一个结构型数组作为 记录存入文本文件。这样便能在操作实现整个记录的读出、插入和删除。首先 要定义好这个结构型数组,其次就是文本文件的打开并将输入已记录的形式存 入文本文件,最终在主函数中实现读入,并实现插入某个记录或者删除某条记 录。 三、概要设计三、概要设计 对文本文件某信息插入和删除的算法流程图如下: No Yes No Yes Flowchart Legend Start/End Action Decision Flow Direction 用 MFC 实现文本文件的插入、删除操作相对比较简单,首先要用到的就是 文本编辑框,将此控件拖入窗口中,利用 Microsoft Windows 的现成资源图标、 位图和游标在 Microsoft Visual C+中的文本编辑框中直接编辑,以实现键盘 输入信息的缓存功能。 “读入”按钮触发事件读取指定路径的文本文件的内容, CTxtFileDlg:OnBUTTONOpen()函数实现此功能,将文本文件的内容读入到文本 编辑框中以供编辑。 “插入”按钮触发事件将在文本编辑框中的光标闪烁位置插入的信息插入 到指定路径的文本文件中,CTxtFileDlg:OnBUTTONSave()函数实现此功能。 “删除”按钮触发事件将在文本编辑框中选中的信息删除,并将删除后的 文件存入文本文件,CTxtFileDlg:OnBUTTONClear()函数来实现此功能。 对记录式文件某记录的插入和删除的算法流程图如下: first No Yes No Yes Flowchart Legend Start/End Action Decision Flow Direction 这部分的记录用一个结构型数组 record 来表示并存储在文本文件中,当打 开这个文件时以这个结构型数组的固定长度为每次读取文件的的长度,便能实 现以记录的形式读出记录。 这部分开始打开一个文本文件需要先用到 fopen()函数打开一个指定路径 的记录文并返回文件的头指针给 first 文件指针,读取记录时每次 first 指针 移动结构型数组的长度。程序提示可以进行的操作:插入记录或者删除记录。 选择插入时,程序首先提示要插入记录的记录键(这里用结构型数组的下标 来作为记录键),等待输入后便提示输入记录的值,用户输入完成后程序会把更 新完成的记录在输出显示一遍。 选择删除时,程序首先提示要删除的记录记录键。等待输入后便删除指定 记录键的记录。 四、详细设计四、详细设计 文本文件信息的插入和删除代码分析: TxtFile.dsp 该文件(项目文件)包含的信息,在项目的水平是用来建立一个单一的项 目或子项目。其他用户可以共享项目(.DSP)的文件,但他们应该用当地的 Makefiles 文件。 TxtFile.h 这是主要的头文件的应用程序。它包括其他项目的具体标题(包括 Resource.h )和声明 CTxtFileApp 应用类。省去了一些 VC 注释代码如下: #if !defined(AFX_TXTFILE_H_E0B47DD9_9DDB_43B1_9609_D821319FBAE2_INCLUDED_) #define AFX_TXTFILE_H_E0B47DD9_9DDB_43B1_9609_D821319FBAE2_INCLUDED_ #if _MSC_VER 1000 #pragma once #endif / _MSC_VER 1000 #ifndef _AFXWIN_H_ #error include stdafx.h before including this file for PCH #endif #include “resource.h“ class CTxtFileApp : public CWinApp public: CTxtFileApp(); public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() ; #endif #include “stdafx.h“ #include “TxtFile.h“ #include “TxtFileDlg.h“ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif TxtFile.cpp 这是主要的应用,其中包含源文件的应用类的 CTxtFileApp。省去 VC 的提 示代码如下: BEGIN_MESSAGE_MAP(CTxtFileApp, CWinApp) ON_COMMAND(ID_HELP, CWinApp:OnHelp) END_MESSAGE_MAP() CTxtFileApp:CTxtFileApp() / TODO: add construction code here, / Place all significant initialization in InitInstance CTxtFileApp theApp; BOOL CTxtFileApp:InitInstance() AfxEnableControlContainer(); #ifdef _AFXDLL Enable3dControls(); #else Enable3dControlsStatic(); #endif CTxtFileDlg dlg; m_pMainWnd = int nResponse = dlg.DoModal(); if (nResponse = IDOK) / TODO: Place code here to handle when the dialog is / dismissed with OK else if (nResponse = IDCANCEL) / TODO: Place code here to handle when the dialog is / dismissed with Cancel return FALSE; TxtFile.rc 这是一个所有程序使用的 Microsoft Windows 资源的清单,它包括图标, 位图,和游标是储存在复位子目录。此文件可以直接在 Microsoft Visual C+ 编辑。 TxtFileDlg.h , TxtFileDlg.cpp -对话 这些文件包含有您的 CTxtFileDlg 级。这个类的定义了你的应用程序的主 对话框的行为。对话的模板是在 TxtFile.rc ,可在 Microsoft Visual C+编 辑。 StdAfx.h , StdAfx.cpp 这些文件是用来建立一个预编译头(PCH)文件名为 TxtFile.pch 和名为 StdAfx.obj 的预编译类型文件。 Resource.h 这是标准的头文件,它确定新资源的 ID。Microsoft Visual C+中读取和 更新该文件。 主程序代码: / TxtFileDlg.cpp : implementation file / #include “stdafx.h“ #include “TxtFile.h“ #include “TxtFileDlg.h“ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE = _FILE_; #endif class CAboutDlg : public CDialog public: CAboutDlg(); protected: DECLARE_MESSAGE_MAP() ; CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD) /AFX_DATA_INIT(CAboutDlg) /AFX_DATA_INIT void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CAboutDlg) /AFX_DATA_MAP BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) /AFX_MSG_MAP(CAboutDlg) / No message handlers /AFX_MSG_MAP END_MESSAGE_MAP() CTxtFileDlg:CTxtFileDlg(CWnd* pParent /*=NULL*/) : CDialog(CTxtFileDlg:IDD, pParent) /AFX_DATA_INIT(CTxtFileDlg) / NOTE: the ClassWizard will add member initialization here /AFX_DATA_INIT / Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME); void CTxtFileDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX); /AFX_DATA_MAP(CTxtFileDlg) / NOTE: the ClassWizard will add DDX and DDV calls here /AFX_DATA_MAP BEGIN_MESSAGE_MAP(CTxtFileDlg, CDialog) /AFX_MSG_MAP(CTxtFileDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BUTTON_Open, OnBUTTONOpen) ON_BN_CLICKED(IDC_BUTTON_Save, OnBUTTONSave) ON_BN_CLICKED(IDC_BUTTON_Clear, OnBUTTONClear) /AFX_MSG_MAP END_MESSAGE_MAP() / / CTxtFileDlg message handlers BOOL CTxtFileDlg:OnInitDialog() CDialog:OnInitDialog(); ASSERT(IDM_ABOUTBOX ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); SetIcon(m_hIcon, TRUE);/ Set big icon SetIcon(m_hIcon, FALSE);/ Set small icon return TRUE; / return TRUE unless you set the focus to a control void CTxtFileDlg:OnSysCommand(UINT nID, LPARAM lParam) if (nID dlgAbout.DoModal(); else CDialog:OnSysCommand(nID, lParam); void CTxtFileDlg:OnPaint() if (IsIconic() CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / Draw the icon dc.DrawIcon(x, y, m_hIcon); else CDialog:OnPaint(); HCURSOR CTxtFileDlg:OnQueryDragIcon() return (HCURSOR) m_hIcon; void CTxtFileDlg:OnBUTTONOpen() /实现文本文件的读入, / TODO: Add your control notification handler code here CString csFileName; char *zStr = “hh.txt“; /指定的文件路径 csFileName=zStr; CStdioFile out; out.Open(csFileName, CFile:modeRead); CStringcsSQL=“,cs; do out.ReadString(cs); /只能读取一行 csSQL+=cs; csSQL+=“rn“; while ( out.GetPosition()SetDlgItemText(IDC_EDIT,csSQL); out.Close(); void CTxtFileDlg:OnBUTTONSave() /在文本边框内插入信息后用此按 键触发的事件实现存入到文本文件 / TODO: Add your control notification handler code here CString csFileName; char *zStr = “hh.txt“; csFileName=zStr; CStdioFile out; out.Open(csFileName, CFile:modeCreate | CFile:modeWrite); CStringcsSQL; this-GetDlgItemText(IDC_EDIT,csSQL); out.WriteSt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- IKFQFHFD-生命科学试剂-MCE
- 绝缘胶销售合同6篇
- 2025年台州市黄岩区卫健系统公开招聘卫技人员26人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025年马鞍山市消防救援局招聘政府专职消防员38人考前自测高频考点模拟试题及答案详解(新)
- Glycine-CoA-Glycine-coenzyme-A-生命科学试剂-MCE
- 2025年合同研究组织项目建议书
- 2025年浙江台州温岭市中医院公开招聘编外员工9人(第四批)考前自测高频考点模拟试题及1套参考答案详解
- 保护环境从我做起议论文周记(15篇)
- 时尚化妆品推广方案
- 安全培训效果反馈调查课件
- 2025下半年新疆兵团招聘事业单位工作人员2398人考试模拟试题及答案解析
- 2025年广西林业局考试真题附答案
- 钢筋工程拆除专项方案(3篇)
- 中小学教师中高级职称答辩备考试题及答案
- 复退军人就业创业课件
- 四级手术术前多学科讨论优化
- 解读:与自己握手言欢(南充)-2025中考作文题+写作指导+例文展示+点评
- 关于2024学宪法讲宪法知识竞赛题目及答案
- 景区导览者2025年AI赋能报告智能导览新趋势
- 建筑业有效标准规范清单(2025年9月)
- 酒店改造全套方案(3篇)
评论
0/150
提交评论