win32编写记事本要点.docx
- 文档编号:10461733
- 上传时间:2023-02-13
- 格式:DOCX
- 页数:31
- 大小:256.23KB
win32编写记事本要点.docx
《win32编写记事本要点.docx》由会员分享,可在线阅读,更多相关《win32编写记事本要点.docx(31页珍藏版)》请在冰豆网上搜索。
win32编写记事本要点
华北科技学院
课程设计说明书
专业:
网络工程
课程名称:
汇编课程设计班级:
姓名:
学号:
设计题目:
win32编写记事本
设计时间:
2011-12-05至2011-12-16
评语:
________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:
____评阅教师:
_____
课程设计报告的要求
1、需求分析:
描述问题,简述课题要解决的问题是什么,有什么要求和限制条件。
2、总体设计(程序设计组成框图、流程图)
3、详细设计(模块功能说明(如函数功能、入口及出口参数说明,过程调用关系描述等))
4、调试与测试:
调试方法,测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施
5、测试结果,用几组测试数据进行测试算法设计的正确性。
6、附录。
源程序清单和结果:
源程序要加注释。
结果要包括测试数据和运行结果。
《汇编语言》课程设计案例
一、问题陈述及其需求分析
要求:
在windows系统下利用32位汇编编写一个简单但功能能实现的记事本。
内容:
在利用32位汇编编写记事本的时候,考虑到很多问题:
(1)首先最重要的是汇编软件的选择,刚开始用asm2011软件编写,最终不行,最后参考资料,如坚持用它的话,必须用代码编写资源代码才能使用;因此为了方便,区别于dos系统下的汇编,我采用了Radasm汇编软件。
(2)其次是记事本的编辑,由于记事本我们大家都常见,曾经也用过高级语言编写过,例如java,因此对其格式很了解,但是还有一个问题就是,我们将如何用汇编这种语言来编写记事本呢,例如如何编写记事本基本框架,编写菜单栏,建立菜单项,添加文本编辑区及建立文本编辑区。
(3)最后当然最重要的还是记事本具体的架构和主要功能的实现,例如记事本中的简单功能,复制,剪切,粘贴之类的;同时还要写出检测功能,以达到对其文本区得以正常编辑及功能的正常使用。
(4)最后还有一点,就是自己的体会和感想,首次接触32位汇编语言设计,这让自己对其知识模块有了一定的了解,通过参考资料,以及网上有关知识,让自己的程序编程有了一定了的提高。
Win32编写记事本基本功能如下:
记事本包括很多东西,其中最重要的是菜单,它包括:
文件,编辑,格式,查看,帮助。
文件菜单中提供以下功能:
1、新建(&N)\tCtrl+N
2、打开(&O)\tCtrl+O
3、保存(&S)\tCtrl+S
4、另存为(&A)\tCtrl+Alt+S
5、退出
编辑菜单中提供以下功能:
1、撤销(&U)\tCtrl+Z
2、复制(&C)\tCtrl+C
3、剪切(&T)\tCtrl+X
4、粘贴(&V)\tCtrl+V
5、全选(&A)\tCtrl+A
6、查找(&F)\tCtrl+F
7、替换(&H)\tCtrl+H
格式菜单中提供以下功能:
1、字体
2、背景颜色
查看菜单中提供以下功能:
1、工具栏
2、状态栏
帮助菜单中提供以下功能:
1、关于记事本
2、帮助
二、总体设计
1、思路流程图:
2、窗口建立流程图:
3、记事本的总体结构流程图:
4、其他比较重要的功能流程图:
(1)、新建流程图:
(2)、另存为流程图:
三、详细设计
1、模块简介
1.程序头文件
名称:
记事本.inc
说明:
程序头文件主要包含了文件的定义,ID等值定义,变量定义以及记事本基本功能提示定义。
2.菜单资源文件
名称:
记事本.rc
说明:
菜单资源文件主要定义了记事本的菜单和菜单项、菜单和菜单项的关系、菜单加速键命令及菜单项的地址。
3.窗口模块
名称:
_WinMain
说明:
该模块是搭建整体框架,贯穿整体的主要部分,更是核心部分,它关系着窗口的显示,菜单和文本编辑区的加载,窗口过程的调用等。
4.窗口过程
名称:
_ProcWinMain
说明:
是该程序的核心部分,也是窗口的重要组成部分,其中设定了窗口的一些窗口命令,而且还在窗口命令中建立了菜单和文本编辑区richEdit组件的联系。
5.文件的读写
名称:
_ProcStream
说明:
该模块主要是实现richEdit组件中文本的读写操作。
6.检查文本有无改变
名称:
_CheckModify
说明:
检查richEdit组件中的文本内容是否有变化,从而确定是否进行离开、新建操作。
7.打开文件
名称:
_OpenFile
说明:
通过调用系统打开对话框来选择已存在的要打开的文件。
打开过程使用_ProcStream子程序(已完成文件的读写过程)。
8.保存文件
名称:
_SaveFile
说明:
通过向窗口发送输出流操作的消息,同时调用_ProcStream进行写操作,以达到保存文件的目的。
9.另存为
名称:
_SaveAs
说明:
首先通过调用保存文件对话框来确定要保存文件的名称和位置,然后调用_SaveFile来保存文件。
10.退出
名称:
_Quit
说明:
通过调用_CheckModify来检查richEdit组件中的文本内容是否有变化,从而确定是保存后退出还是直接退出。
11.查找对话框和文本编辑显示区
名称:
_Init
说明:
该模块主要是注册和初始化查找框的结构,建立工具栏、状态栏以及文本编辑显示区。
12.查找模块
名称:
_FindText
说明:
该模块主要是设置查找范围,设置查找选项,显示查找框并高亮显示查找到的内容。
13.替换文本
名称:
_ReplaceText和_ReplaceAll
说明:
调用查找模块找到需要替换的文本,然后决定是否进行替换或全部替换。
14.设置字体
名称:
_SetFont和_ChooseFont
说明:
通过调用系统字体的对话框来设置richEdit组件中的文本字体和颜色等。
15.重新排列窗口位置
名称:
_ResizeWindow
说明:
计算及调整工具栏,状态栏以及Richedit控件位置。
16.设置背景色
名称:
_ChooseColor
说明:
通过调用系统背景色的设置框来设置richEdit组件中的文本背景颜色等
2、算法说明
主要设计算法的说明
1.窗口建立的算法设计(_WinMain)
(1)、获得应用程序的句柄,同时加载菜单、加速键菜单,用LoadLibray函数来装入库,以便用richEdit的类名来创建控件。
(2)、注册窗口类。
在此之前,需要对窗口参数清零,然后对窗口进行初始化,包括加载鼠标类型,加载标题栏图标,设置窗口的尺寸和风格,获得窗口过程的地址等。
(3)、建立窗口,保存窗口句柄。
在此期间,需要指明窗口的具体大小和窗口出现的位置,窗口的类名、标题、风格、附加风格以及窗口所属的具体模块。
(4)、通过使用ShowWindow函数显示窗口。
(5)、通过使用UpdateWindow函数刷新窗口客户区。
(6)、消息循环。
通过不断的接收消息和处理消息来完成窗口中发生的一切操作。
在窗口程序结束之前需要使用FreeLibrary来释放库。
2.窗口过程的算法设计(_ProcWinMain)
窗口过程是窗口中文本实现功能的核心部分,其中WM_COMMAND是实现所有命令的基础,它控制着菜单项与文本编辑区的一一对应联系关系。
当然主要是通过if-elseif-else-endif语句实现多分支的选择,通过对子程序的调用实现相应的操作。
3.菜单的算法设计
菜单的实现主要是编写rc资源文件→程序中声明菜单项→窗口建立中加载菜单项→窗口过程中设置菜单项功能。
菜单项中几个典型例子的算法设计
1.新建的算法设计
新建时需要考虑到的问题有:
原文件是否保存,清空文本编辑区内容,设置标题栏的标题。
首先通过调用子程序_CheckModify来检查文本内容与上次保存或建立时有无变化。
若有,则调用_SaveFile来保存文件;若没有,则用CloseHandle函数来关闭现在的文件以及该文件的线程,设置文件的句柄为0。
然后调用_SetCaption子程序来设置新建文件的标题,调用_SetStatus来设置新建窗口的菜单项的可用状态。
2.另存为的算法设计
另存为的实现要经过初始化另存为对话框,打开另存为对话框,创建新文件,保存文件。
在初始化另存为对话框时,为了防止之前程序遗留下来的垃圾数据的影响,应该先用RtlZeroMemory函数将所有参数置零,然后对所需要的参数进行设置。
设置好另存为对话框后使用GetSaveFileName函数来调出并显示。
之后进行新文件的创建,创建成功则保存文件,创建失败则输出创建失败信息。
四、编码和测试
1、界面显示
1、记事本整体运行结果主界面如图所示:
2、记事本第一部分界面如图所示(标题):
3、记事本第二部分界面如图所示(菜单):
4、记事本第三部分界面如图所示(工具栏):
5、记事本第四部分界面如图所示(文本编辑区):
6、记事本第五部分界面如图所示(状态栏):
2、内容界面显示
1、文件菜单
(1)打开界面
(2)保存界面
(3)退出界面(如果文本有改动则是这样,如果没改动则直接关掉)
2、编辑菜单
(1)查找界面
3、格式菜单
(1)字体界面
(2)背景颜色界面
4、帮助菜单
(1)关于记事本界面
(2)帮助界面
5.总结与体会
本次实验给我感触真是深刻呀,首先自己在没接触过WIN32的前提下来做这次实验,让我感觉到一定的困难和困惑,其次是32位汇编和我们所学知识的16位汇编在本质上有大大的区别,让我原本以为能借助16位汇编的大部分知识来模仿的愿望打破,最后就是汇编软件的差异让我无从适应,以前我们都是用asm汇编软件进行编写,我觉得对那个软件还算是比较熟悉吧,但是这次32位汇编编写记事本,我用到了新的一种汇编软件,radasm,虽然没有什么本质上的软件不同,但是作为我来说,好像换了个环境一样,一下子没法下手了,这样,在汇编开始之前,我就觉得本次实验不简单,对我来说是件很困难的事情。
在以上问题上,我在实验中逐渐解决,方法很多,比如问老师,请教同学,或者上网查看有关资料,在此其中,我知道了win32汇编是在windows系统下的用32位汇编编写程序,和我们所在的dos环境下编写有着不同,就这样,我慢慢进入了对32汇编的了解和操作,我在这次实验中了解到了很多关于以前我不知道的知识,我不断的学习新的汇编知识,同时用着刚知道不久的汇编知识来动手做记事本,就这样不断接收,不断运用,让我感受到了自己的进步,从不了解到了解,从不会编到会编,当然在这其中也遇上了不少的问题,比如很多符号不认识,很多函数不认识,最后通过查资料(win32API大全),我逐个解决了这些问题,win32API大全里面包含了几乎所有32位汇编的函数和有关东西,在这次实验中给我很大的帮助和大多数的知识。
通过这次实验我还明白了一点,对于自己现在学过的编程语言,每一种都有着自己独特的特点,也感受到了计算机行业在生活中和工作中的重要性,因为我们生活中很多东西(比如记事本,word文档等)都是通过开发语言所编写出来的,通过win32汇编编写记事本,我重新对汇编有了一个层次的认识,起初我觉得汇编是面向硬件的,没有其他高级语言方便,但是通过这次我改变了自己的观点,在某种程度上,汇编也有着自己的好的一方面,能为用户和程序员免去不少的步骤和麻烦,因此我也更加深刻的理解了这几门语言的优缺点:
汇编重在运行速率,但是在代码上编写难度大;Java编写难度大,但是可跨平台操作,比起汇编运行速率稍逊;C语言重在编写系统软件。
这次课设,我深刻的体会到了自己真是无知,对除了书本知识以外的知识所知不多,也体现了自己的孤弱寡闻,见识太少,肚子里油水太少,太少,这次程序让我初步掌握了Win32的基础知识,这虽然为以后从事计算机工作打下了一点基础,但我更看要的是这期间解决问题过程的思维方法:
分析问题,收集信息,耐心仔细。
在看到自己不足的同时,我在后面的学习中或者编程中,我会提醒自己,要想编程,在于积累知识更多的知识和动手能力,要想编好一个程序,最重要的是程序完成后的调试。
附录:
程序主要代码
1、头文件主代码
;Include文件定义(lib目录中有全部导入库)(include目录中有各种头文件)
Includewindows.inc
Includegdi32.inc;图形,设备等有关的函数
Includelibgdi32.lib
Includeuser32.inc
Includelibuser32.lib
Includekernel32.inc
Includelibkernel32.lib;里面包括所有控制台函数
IncludeComdlg32.inc
IncludelibComdlg32.lib
Includecomctl32.inc
Includelibcomctl32.lib
;数据段
;Equ等值定义
ICO_MAINequ1000h
IDM_MAINequ2000h
IDA_MAINequ2001h
;---------------------文件菜单项---------------
IDM_NEWequ2101h
IDM_OPENequ2102h
IDM_SAVEequ2103h
IDM_SAVEASequ2104h
IDM_PAGESETUPequ2105h
IDM_EXITequ2106h
;---------------------编辑菜单项---------------
IDM_UNDOequ2201h
IDM_COPYequ2203h
IDM_CUTequ2204h
IDM_PASTEequ2205h
IDM_SELALLequ2206h
IDM_FINDequ2207h
IDM_REPLACEequ2208h
;---------------------格式菜单项---------------
IDM_FONTequ2301h
IDM_BKCOLORequ2302h
;---------------------查看菜单项---------------
IDM_TOOLBARequ2401h
IDM_STATEequ2402h
;---------------------帮助菜单项---------------
IDM_ABOUTequ2501h
IDM_TOHELPequ2502h
;---------------------主菜单项目---------------
IDM_FILEequ3100h
IDM_EDITequ3200h
IDM_FORMATequ3300h
IDM_CHECKequ3400h
IDM_HELPequ3500h
.data?
;变量定义
hInstancedd?
;句柄
hWinMaindd?
;主窗口
hMenudd?
hWinEditdd?
hFiledd?
hWinStatusdd?
hWinToolbardd?
hIcoMaindd?
hFindDialogdd?
hReplaceDialogdd?
dwBooleandd?
dwCustColorsdd16dup(?
)
szFileNamedbMAX_PATHdup(?
)
szBufferdb1024dup(?
)
dwFontColordd?
dwBackColordd?
dwOptiondd?
stLogFontLOGFONT
>
F_TOOLBARequ00000001h
F_STATUSBARequ00000002h
;查找替换对话框变量定义
idFindMessagedd?
stFindFINDREPLACE
>
szFindTextdb100dup(?
)
szReplaceTextdb100dup(?
)
.const;常量定义
FINDMSGSTRINGdb'commdlg_FindReplace',0
szClassNamedb'我的程序',0;窗口类名称
szCaptionMaindb'记事本',0;程序名称
szCaptiondb'提醒',0
szCaption1db'关于',0
szCaption2db'帮助',0
szMenuNamedb'菜单栏',0
szMenuFiledb'文件(&F)',0
szMenuEditdb'编辑(&I)',0
szMenuFormatdb'格式',0
szMenuCheckdb'查看',0
szMenuHelpdb'帮助',0
szFilterdb'(*.txt)',0,'*.txt',0,'AllFiles(*.*)',0,'*.*',0,0
szDefExtdb'txt',0
szSaveCaptiondb'保存为',0
szNewTitledb'新建任务',0
szDllEditdb'RichEd20.dll',0;定义richedit控件
dwStatusWidthdd50,100,200,300,350,-1
szFontdb'宋体',0
szCharsFormatdb'总长度:
%d',0
szLinesFormatdb'总行数:
%d',0
szLineFormatdb'行:
%d',0
szColFormatdb'列:
%d',0
szClassEditdb'RichEdit20A',0
szReplacedb'替换',0
szReplaceAlldb'全部替换',0
szFindNextdb'查找下一个',0
szNotFounddb'字符串未找到!
',0
szNoNamedb'无标题',0
szErrOpenFiledb'无法打开文件!
',0
szTitleFormatdb'记事本',0
szErrCreateFiledb'无法建立文件!
',0
szModifydb'文件已修改,是否保存?
',0
szHasModifydb'已修改',0
szNotModifydb'未修改',0
szToHelpdb'请联系我们',0
szAboutdb'初学,初写,只供商讨',0
stToolbarequthisbyte
;以下为工具栏中的按钮设置和定义
TBBUTTON
TBBUTTON
TBBUTTON
图标代表的保存按钮
TBBUTTON0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>;分隔条
TBBUTTON
TBBUTTON
TBBUTTON
TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON
TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
TBBUTTON
TBBUTTON<0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
NUM_BUTTONSequ13
2、asm主要代码
(1)构建窗口
start:
call_WinMain;调用子程序_WinMain(窗口程序)
invokeExitProcess,NULL;调用程序退出函数,返回为空
;窗口建立的主要步骤,也就是建立记事本显示框架的部分
_WinMainproc
Local@stWndClass:
WNDCLASSEX;创建了一个窗口属性的结构变量,WNDCLASS的扩展类
Local@stMsg:
MSG;消息变量
Local@hAccelerator,@hRichEdit
;第一步,得到应用程序的句柄(GetModelHandle)句柄函数
InvokeGetModuleHandle,NULL;置句柄函数为空
MovhInstance,eax;hInstance现在指向的是窗口的句柄,获得实力句柄并保存invokeLoadMenu,hInstance,IDM_MAIN;加载菜单,hInstance是用GetModuleHandle获取的句柄实例,第二个参数
MovhMenu,eax;指定需要装入的菜单ID,函数返回菜单句柄
InvokeLoadAccelerators,hInstance,IDA_MAIN;加载快捷键
Mov@hAccelerator,eax
InvokeLoadLibrary,offsetszDllEdit;用LoadLibrary函数装入RichEdit控件(链接库)
Mov@hRichEdit,eax
;第二步,注册窗口类
InvokeRtlZeroMemory,addr@stWndClass,sizeof@stWndClass;将窗口参数全部填零
InvokeLoadIcon,hInstance,ICO_MAIN;加载图标
Mov@stWndClass.hIcon,eax
Mov@stWndClass.hIconSm,eax;hIconSm为窗口类关联的小图标
InvokeLoadCursor,0,IDC_ARROW;加载鼠标类型为标准的箭头形状
Mov@stWndC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- win32 编写 记事本 要点
![提示](https://static.bdocx.com/images/bang_tan.gif)