1、汇编语言课程设计win32编写记事本讲课稿汇编语言课程设计win32编写记事本华 北 科 技 学 院课程设计说明书课程名称: 汇编语言 班级: 计算机B08-1 姓名:_李鹏飞_ _学号:_ 200807014231 _设计题目:_ win32编写记事本 _设计时间: _ 6月23日 _至_ 7月1日 _指导教师:_ 杜杏菁_ _评 语:_评阅成绩: 评阅教师:一、课程设计目的进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。二、课程设计要求
2、1要求编写并调试通过一个小型软件,实现对软件或硬件的操作。2遵循模块化、结构化的程序设计方法。3.要求程序必须正确。4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。5.要求程序结构合理,语句使用得当。6.适当追求编程技巧和程序运行效率。三、课程设计题目:win32编写记事本四、课题分析WINDOW 记事本的编写,要求能实现基本菜单框架并打开窗口,有能力的同学可以编写进行数据录入并保存的代码开 始加载头文件加载数据段编译代码设计窗体编译生成文件结 束五、流程图:六、程序源代码:.386.model flat,stdcalloption casemap:noneinclude wind
3、ows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude shell32.incincludelib shell32.libinclude comctl32.incincludelib comctl32.libinclude comdlg32.incincludelib comdlg32.libICO_MAIN EQU 1000h ;图标IDM_MAIN EQU 2000h ;菜单IDA_MAIN EQU 2000h ;加速键IDM_NEW EQU 2101h
4、 ;新建IDM_OPEN EQU 2102h ;打开IDM_SAVE EQU 2103h ;保存IDM_SAVEAS EQU 2104h ;另存为IDM_EXIT EQU 2105h ;退出IDM_UNDO EQU 2201h ;撤销IDM_CUT EQU 2203h ;剪切IDM_COPY EQU 2204h ;复制IDM_PASTE EQU 2205h ;粘贴IDM_DELETE EQU 2206h ;删除IDM_FIND EQU 2207h ;查找IDM_REPLACE EQU 220Ah ;替换IDM_SELECTALL EQU 220Bh ;全选IDM_FONT EQU 2301h
5、;字体IDM_STATUSBAR EQU 2401h ;状态栏IDM_HELP EQU 2501h ;帮助主题IDM_ABOUT EQU 2502h ;关于IDM_MENUHELP EQU 2601h ;菜单信息.data?hInstance dd ?hWinMain dd ?hMenu dd ?hWinStatus dd ?hWinEdit dd ?hFile dd ?hFindDialog dd ?hRichEdit dd ?dwFontColor dd ?idFindMessage dd ?stFind FINDREPLACE szFindText db 100 dup (?)szRep
6、laceText db 100 dup (?)szFileName db MAX_PATH dup (?)stLogFont LOGFONT dwOption dd ?.dataF_STATUSBAR equ 00000001hdllEdit db RichEd20.dll,0errTitle db 错误,0noRichEdit db 无法找到RichEd20.dllclassName db TextEditor,0captionMain db 文本编辑器,0classEdit db RichEdit20A,0fontFace db Fixedsys,0modify db 你已经改动过啦,要不
7、要存一下?,0filter db 文本文件(*.txt),0,*.txt,0,所有文件,0,*.*,0,0defExt db txt,0titleFormat db %s - 我的记事本,0errCreateFile db 咦!出现问题了!,0errOpenFile db 咦!怎么打不开!,0notFound db 不给力啊,找不到!,0noName db 还没起名字,0timeFormat db %02d:%02d:%02d,0charsFormat db 字节数:%d,0lineFormat db 行:%d,0colFormat db 列:%d,0helpTitle db 帮助,0help
8、Text db Sorry!无法提供任何帮助,0aboutTitle db 关于 记事本,0aboutText db 我的记事本,0ah,0dh,作者:李鹏飞,0ah,0dh,2010年07月01日,0ah,0dh,0dwStatusWidth dd 100,200,300,400,-1dwMenuHelp dd 0,IDM_MENUHELP,0,0FINDMSGSTRING db commdlg_FindReplace,0.code;=_CheckModifyState PROC invoke SendMessage,hWinEdit,EM_GETMODIFY,0,0 ;获取控件内容是否改变
9、的信息 .if eax != 0 invoke MessageBox,hWinMain,addr modify,addr captionMain, MB_YESNOCANCEL or MB_ICONQUESTION .if eax = IDYES call _SaveFile ;有待改动 .elseif eax = IDCANCEL mov eax,FALSE ret .endif .endif mov eax,TRUE ret_CheckModifyState ENDP;=;Richedit的流出操作_StreamProcOut PROC uses ebx edi esi _dwCookie
10、,lpBuffer,NumBytes,pBytes invoke WriteFile,hFile,lpBuffer,NumBytes,pBytes,0 xor eax,1 ;如果ReadFile或WriteFile返回1(成功),则最终eax返回0,说明操作成功 ret_StreamProcOut ENDP;=;Richedit的流入操作_StreamProcIn PROC uses ebx edi esi _dwCookie,lpBuffer,NumBytes,pBytes invoke ReadFile,hFile,lpBuffer,NumBytes,pBytes,0 xor eax,1
11、;如果ReadFile或WriteFile返回1(成功),则最终eax返回0,说明操作成功 ret_StreamProcIn ENDP;=;设置字体和字体的颜色_SetFont PROC _lpszFont,_dwFontSize,_dwColor local stCf:CHARFORMAT invoke RtlZeroMemory,addr stCf,sizeof stCf ;开始填充stCf结构 mov stCf.cbSize,sizeof stCf mov stCf.dwMask,CFM_SIZE or CFM_FACE or CFM_BOLD or CFM_COLOR ;字段掩码,用来
12、指定结构中哪些字段是有效的 push _dwFontSize pop stCf.yHeight push _dwColor pop stCf.crTextColor mov stCf.dwEffects,0 invoke lstrcpy,addr stCf.szFaceName,_lpszFont invoke SendMessage,hWinEdit,EM_SETTEXTMODE,1,0 ;设置工作模式 invoke SendMessage,hWinEdit,EM_SETCHARFORMAT,SCF_ALL,addr stCf ;为控件中的全部文本设置指定的格式 ret_SetFont EN
13、DP;=;查找文字_FindText PROC local stFindText:FINDTEXTEX;设置查找区域 invoke SendMessage,hWinEdit,EM_EXGETSEL,0,addr stFindText.chrg .if stFind.Flags & FR_DOWN ;向下查找 push stFindText.chrg.cpMax pop stFindText.chrg.cpMin ;将这个选择区域的结束位置用做下一次查找的起始点 .endif mov stFindText.chrg.cpMax,-1 ;一直查找到全部文本的最后;设置查找选项 mov stFind
14、Text.lpstrText,offset szFindText mov ecx,stFind.Flags and ecx,FR_MATCHCASE or FR_DOWN or FR_WHOLEWORD ;查找并把光标设置到找到的文本上 invoke SendMessage,hWinEdit,EM_FINDTEXTEX,ecx,addr stFindText ;ecx中存储的是搜索选项 .if eax = -1 mov ecx,hWinMain .if hFindDialog mov ecx,hFindDialog .endif invoke MessageBox,ecx,addr notFo
15、und,NULL,MB_OK or MB_ICONINFORMATION ret .endif ;找到文本以后,文本的位置在FINDTEXTEX结构的chrgText字段中返回,chrgText字段是一个CHARRANGE结构,直接在EM_EXSETSEL消息中使用它将选择区域设置到找到的文字上 invoke SendMessage,hWinEdit,EM_EXSETSEL,0,addr stFindText.chrgText invoke SendMessage,hWinEdit,EM_SCROLLCARET,NULL,NULL ;卷动文字,以便找到的文本能够出现在用户的视野中 ret_Fi
16、ndText ENDP;=;保存文件,如果没有打开或创建文件则另存为_SaveFile PROC local stES:EDITSTREAM .if ! hFile call _SaveAs .if ! eax ret .endif .endif mov stES.dwCookie,FALSE ;在Richedit的流操作中写文件 mov stES.dwError,NULL mov stES.pfnCallback,offset _StreamProcOut ;回调函数 invoke SendMessage,hWinEdit,EM_STREAMOUT,SF_TEXT,addr stES ;流出
17、操作,文本格式是简单的文本格式 invoke SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0 ;设置修改状态 mov eax,TRUE ret _SaveFile ENDP;=;另存为_SaveAs PROC local stOF:OPENFILENAME local stEs:EDITSTREAM invoke RtlZeroMemory,addr stOF,sizeof stOF;显示保存文件对话框 ;填充stOF结构 mov stOF.lStructSize,sizeof stOF push hWinMain pop stOF.hwndOwner ;所
18、属窗口 mov stOF.lpstrFilter,offset filter ;指定文件名筛选字符串 mov stOF.lpstrFile,offset szFileName mov stOF.nMaxFile,MAX_PATH ;指定lpstrFile参数指向的缓冲区的长度,260 mov stOF.Flags,OFN_PATHMUSTEXIST ;路径必须存在 mov stOF.lpstrDefExt,offset defExt ;默认扩展名 mov stOF.lpstrTitle,NULL ;标题为“另存为” invoke GetSaveFileName,addr stOF .if ea
19、x ;创建新文件 invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE, ;存取方式:为读写 FILE_SHARE_READ, ;共享属性:允许其他进程同时以读方式打开文件 0, ;安全属性:无法被继承 CREATE_ALWAYS, ;创建新文件,如果文件已经存在则清除原文件 FILE_ATTRIBUTE_NORMAL, ;文件属性:普通文件 0 ;文件模板句柄 .if eax != INVALID_HANDLE_VALUE push eax .if hFile ;有打开的文件 invoke CloseHandle,hF
20、ile .endif pop eax ;保存文件 mov hFile,eax ;文件句柄 call _SaveFile call _SetCaption call _SetStatus mov eax,TRUE ret .else invoke MessageBox,hWinMain,addr errCreateFile,NULL,MB_OK or MB_ICONERROR .endif .endif mov eax,FALSE ret_SaveAs ENDP;=;打开及输入文件_OpenFile PROC local stOF:OPENFILENAME local stES:EDITSTRE
21、AM invoke RtlZeroMemory,addr stOF,sizeof stOF;显示“打开文件”对话框 mov stOF.lStructSize,sizeof stOF push hWinMain pop stOF.hwndOwner mov stOF.lpstrFilter,offset filter mov stOF.lpstrFile,offset szFileName mov stOF.nMaxFile,MAX_PATH mov stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST ;文件必须存在 invoke GetOpenF
22、ileName,addr stOF .if eax ;创建文件 invoke CreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0 ;打开存在的文件,当文件不存在时函数会返回失败 .if eax = INVALID_HANDLE_VALUE invoke MessageBox,hWinMain,addr errOpenFile,NULL,MB_OK or MB_ICONSTOP ret .endif push eax .i
23、f hFile invoke CloseHandle,hFile .endif pop eax mov hFile,eax ;读入文件 mov stES.dwCookie,TRUE ;在Richedit的流操作中读文件 mov stES.dwError,NULL mov stES.pfnCallback,offset _StreamProcIn invoke SendMessage,hWinEdit,EM_STREAMIN,SF_TEXT,addr stES ;流入操作,文本格式是简单的文本格式 invoke SendMessage,hWinEdit,EM_SETMODIFY,FALSE,0
24、;设置修改状态 call _SetCaption call _SetStatus .endif ret_OpenFile ENDP;=;选择字体_ChooseFont PROC local stCF:CHOOSEFONT invoke RtlZeroMemory,addr stCF,sizeof stCF mov stCF.lStructSize,sizeof stCF push hWinMain pop stCF.hwndOwner mov stCF.lpLogFont,offset stLogFont ;指定字体的名称和属性 push dwFontColor pop stCF.rgbColors mov stCF.Flags,CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_EFFECTS ;字体列表中只显示屏幕字体,对话框中显示“效果”复选框 invoke Cho
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1