匯編語言課程設計win32編寫記事本_第1頁
匯編語言課程設計win32編寫記事本_第2頁
匯編語言課程設計win32編寫記事本_第3頁
匯編語言課程設計win32編寫記事本_第4頁
匯編語言課程設計win32編寫記事本_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、華 北 科 技 學 院課程設計說明書課程名稱: 匯編語言 班級: 計算機B08-1 姓名:_李鵬飛_ _學號:_ 200807014231 _設計題目:_ win32編寫記事本 _設計時間: _ 6月23日 _至_ 7月1日 _指導教師:_ 杜杏菁_ _評 語:_評閱成績: 評閱教師:一、課程設計目的進行程序設計方法和技能的基本訓練,鞏固在課堂上學到的有關程序設計的基本知識和基本方法,通過實際動手能力的培養(yǎng),進一步熟悉匯編語言的結構和使用方法,達到能獨立閱讀、編制和調試一定規(guī)模的匯編語言程序的水平。二、課程設計要求 1要求編寫并調試通過一個小型軟件,實現(xiàn)對軟件或硬件的操作。2遵循模塊化、結構化

2、的程序設計方法。3.要求程序必須正確。4.程序簡明易懂,多運用輸入輸出提示,出錯信息及必要的注釋。5.要求程序結構合理,語句使用得當。6.適當追求編程技巧和程序運行效率。三、課程設計題目:win32編寫記事本四、課題分析WINDOW 記事本的編寫,要求能實現(xiàn)基本菜單框架并打開窗口,有能力的同學可以編寫進行數(shù)據(jù)錄入并保存的代碼開 始加載頭文件加載數(shù)據(jù)段編譯代碼設計窗體編譯生成文件結 束五、流程圖:六、程序源代碼:.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib use

3、r32.libinclude kernel32.incincludelib kernel32.libinclude shell32.incincludelib shell32.libinclude comctl32.incincludelib comctl32.libinclude comdlg32.incincludelib comdlg32.libICO_MAINEQU 1000h;圖標IDM_MAINEQU2000h;菜單IDA_MAINEQU 2000h;加速鍵IDM_NEWEQU 2101h;新建IDM_OPENEQU 2102h;打開IDM_SAVEEQU 2103h;保存IDM_

4、SAVEASEQU 2104h;另存為IDM_EXITEQU 2105h;退出IDM_UNDOEQU 2201h;撤銷IDM_CUTEQU 2203h;剪切IDM_COPYEQU 2204h;復制IDM_PASTEEQU 2205h;粘貼IDM_DELETEEQU 2206h;刪除IDM_FINDEQU 2207h;查找IDM_REPLACEEQU220Ah;替換IDM_SELECTALL EQU 220Bh;全選IDM_FONTEQU 2301h;字體IDM_STATUSBAR EQU 2401h;狀態(tài)欄IDM_HELPEQU 2501h;幫助主題IDM_ABOUTEQU 2502h;關于I

5、DM_MENUHELP EQU2601h;菜單信息.data?hInstancedd?hWinMaindd?hMenudd?hWinStatusdd?hWinEditdd?hFiledd?hFindDialogdd?hRichEditdd?dwFontColordd?idFindMessage dd?stFindFINDREPLACE<?>szFindTextdb100 dup (?)szReplaceText db100 dup(?)szFileNamedbMAX_PATH dup (?)stLogFontLOGFONT<?>dwOptiondd?.dataF_STA

6、TUSBARequ00000001hdllEditdb"RichEd20.dll",0errTitledb"錯誤",0noRichEditdb"無法找到RichEd20.dll"classNamedb"TextEditor",0captionMaindb"文本編輯器",0classEditdb"RichEdit20A",0fontFacedb"Fixedsys",0modifydb"你已經改動過啦,要不要存一下?",0filterdb&

7、quot;文本文件(*.txt)",0,"*.txt",0,"所有文件",0,"*.*",0,0defExtdb"txt",0titleFormatdb"%s - 我的記事本",0errCreateFile db"咦!出現(xiàn)問題了!",0errOpenFiledb"咦!怎么打不開!",0notFounddb"不給力啊,找不到!",0noNamedb"還沒起名字",0timeFormatdb"%02d

8、:%02d:%02d",0charsFormatdb"字節(jié)數(shù):%d",0lineFormatdb"行:%d",0colFormatdb"列:%d",0helpTitledb"幫助",0helpTextdb"Sorry!無法提供任何幫助",0aboutTitledb"關于 記事本",0aboutTextdb"我的記事本",0ah,0dh,"作者:李鵬飛",0ah,0dh,"2010年07月01日",0ah,0

9、dh,0dwStatusWidth dd100,200,300,400,-1dwMenuHelpdd0,IDM_MENUHELP,0,0FINDMSGSTRING db"commdlg_FindReplace",0.code;=_CheckModifyState PROCinvokeSendMessage,hWinEdit,EM_GETMODIFY,0,0;獲取控件內容是否改變的信息.ifeax != 0invokeMessageBox,hWinMain,addr modify,addr captionMain,MB_YESNOCANCEL or MB_ICONQUESTI

10、ON.ifeax = IDYEScall_SaveFile;有待改動.elseifeax = IDCANCELmoveax,FALSEret.endif.endifmoveax,TRUEret_CheckModifyState ENDP;=;Richedit的流出操作_StreamProcOut PROC uses ebx edi esi _dwCookie,lpBuffer,NumBytes,pBytesinvokeWriteFile,hFile,lpBuffer,NumBytes,pBytes,0xor eax,1;如果ReadFile或WriteFile返回1(成功),則最終eax返回0

11、,說明操作成功ret_StreamProcOut ENDP;=;Richedit的流入操作_StreamProcIn PROC uses ebx edi esi _dwCookie,lpBuffer,NumBytes,pBytesinvokeReadFile,hFile,lpBuffer,NumBytes,pBytes,0xor eax,1;如果ReadFile或WriteFile返回1(成功),則最終eax返回0,說明操作成功ret_StreamProcIn ENDP;=;設置字體和字體的顏色_SetFont PROC_lpszFont,_dwFontSize,_dwColorlocalst

12、Cf:CHARFORMATinvokeRtlZeroMemory,addr stCf,sizeofstCf;開始填充stCf結構movstCf.cbSize,sizeof stCfmovstCf.dwMask,CFM_SIZE or CFM_FACE or CFM_BOLD or CFM_COLOR;字段掩碼,用來指定結構中哪些字段是有效的push_dwFontSizepopstCf.yHeightpush_dwColorpopstCf.crTextColormovstCf.dwEffects,0invokelstrcpy,addr stCf.szFaceName,_lpszFontinvok

13、eSendMessage,hWinEdit,EM_SETTEXTMODE,1,0;設置工作模式invokeSendMessage,hWinEdit,EM_SETCHARFORMAT,SCF_ALL,addr stCf;為控件中的全部文本設置指定的格式ret_SetFont ENDP;=;查找文字_FindTextPROClocalstFindText:FINDTEXTEX;設置查找區(qū)域invokeSendMessage,hWinEdit,EM_EXGETSEL,0,addrstFindText.chrg.ifstFind.Flags & FR_DOWN;向下查找pushstFindTe

14、xt.chrg.cpMaxpopstFindText.chrg.cpMin;將這個選擇區(qū)域的結束位置用做下一次查找的起始點.endifmovstFindText.chrg.cpMax,-1;一直查找到全部文本的最后;設置查找選項movstFindText.lpstrText,offset szFindTextmovecx,stFind.Flagsandecx,FR_MATCHCASE or FR_DOWN or FR_WHOLEWORD;查找并把光標設置到找到的文本上invokeSendMessage,hWinEdit,EM_FINDTEXTEX,ecx,addr stFindText;ecx

15、中存儲的是搜索選項.ifeax =-1movecx,hWinMain.ifhFindDialogmovecx,hFindDialog.endifinvokeMessageBox,ecx,addr notFound,NULL,MB_OK or MB_ICONINFORMATIONret.endif;找到文本以后,文本的位置在FINDTEXTEX結構的chrgText字段中返回,chrgText字段是一個CHARRANGE結構,直接在EM_EXSETSEL消息中使用它將選擇區(qū)域設置到找到的文字上invokeSendMessage,hWinEdit,EM_EXSETSEL,0,addr stFind

16、Text.chrgTextinvokeSendMessage,hWinEdit,EM_SCROLLCARET,NULL,NULL;卷動文字,以便找到的文本能夠出現(xiàn)在用戶的視野中ret_FindTextENDP;=;保存文件,如果沒有打開或創(chuàng)建文件則另存為_SaveFilePROClocalstES:EDITSTREAM.if! hFilecall_SaveAs.if! eaxret.endif.endifmovstES.dwCookie,FALSE;在Richedit的流操作中寫文件movstES.dwError,NULLmovstES.pfnCallback,offset _StreamPr

17、ocOut;回調函數(shù)invokeSendMessage,hWinEdit,EM_STREAMOUT,SF_TEXT,addr stES;流出操作,文本格式是簡單的文本格式invokeSendMessage,hWinEdit,EM_SETMODIFY,FALSE,0;設置修改狀態(tài)moveax,TRUEret_SaveFileENDP;=;另存為_SaveAsPROClocalstOF:OPENFILENAMElocalstEs:EDITSTREAMinvokeRtlZeroMemory,addr stOF,sizeof stOF;顯示"保存文件"對話框;填充stOF結構mov

18、stOF.lStructSize,sizeof stOFpushhWinMainpopstOF.hwndOwner;所屬窗口movstOF.lpstrFilter,offset filter;指定文件名篩選字符串movstOF.lpstrFile,offset szFileNamemovstOF.nMaxFile,MAX_PATH;指定lpstrFile參數(shù)指向的緩沖區(qū)的長度,260movstOF.Flags,OFN_PATHMUSTEXIST;路徑必須存在movstOF.lpstrDefExt,offset defExt;默認擴展名movstOF.lpstrTitle,NULL;標題為“另存

19、為”invokeGetSaveFileName,addr stOF.ifeax;創(chuàng)建新文件invokeCreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,;存取方式:為讀寫FILE_SHARE_READ,;共享屬性:允許其他進程同時以讀方式打開文件0,;安全屬性:無法被繼承CREATE_ALWAYS,;創(chuàng)建新文件,如果文件已經存在則清除原文件FILE_ATTRIBUTE_NORMAL,;文件屬性:普通文件0;文件模板句柄.ifeax != INVALID_HANDLE_VALUEpusheax.ifhFile;有打開的文件invok

20、e CloseHandle,hFile.endifpopeax;保存文件movhFile,eax;文件句柄call_SaveFilecall_SetCaptioncall_SetStatusmoveax,TRUEret.elseinvokeMessageBox,hWinMain,addr errCreateFile,NULL,MB_OK or MB_ICONERROR.endif.endifmoveax,FALSEret_SaveAsENDP;=;打開及輸入文件_OpenFilePROClocalstOF:OPENFILENAMElocalstES:EDITSTREAMinvokeRtlZer

21、oMemory,addr stOF,sizeof stOF;顯示“打開文件”對話框movstOF.lStructSize,sizeof stOFpushhWinMainpopstOF.hwndOwnermovstOF.lpstrFilter,offset filtermovstOF.lpstrFile,offset szFileNamemovstOF.nMaxFile,MAX_PATHmovstOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST;文件必須存在invokeGetOpenFileName,addr stOF.ifeax;創(chuàng)建文件invok

22、eCreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0;打開存在的文件,當文件不存在時函數(shù)會返回失敗.ifeax =INVALID_HANDLE_VALUEinvokeMessageBox,hWinMain,addr errOpenFile,NULL,MB_OK or MB_ICONSTOPret.endifpusheax.ifhFileinvokeCloseHandle,hFile.endifpopeaxmovhFile,

23、eax;讀入文件movstES.dwCookie,TRUE;在Richedit的流操作中讀文件movstES.dwError,NULLmovstES.pfnCallback,offset _StreamProcIninvokeSendMessage,hWinEdit,EM_STREAMIN,SF_TEXT,addr stES;流入操作,文本格式是簡單的文本格式invokeSendMessage,hWinEdit,EM_SETMODIFY,FALSE,0;設置修改狀態(tài)call_SetCaptioncall_SetStatus.endifret_OpenFileENDP;=;選擇字體_Choose

24、FontPROClocalstCF:CHOOSEFONTinvokeRtlZeroMemory,addr stCF,sizeof stCFmovstCF.lStructSize,sizeof stCFpushhWinMainpopstCF.hwndOwnermovstCF.lpLogFont,offset stLogFont;指定字體的名稱和屬性pushdwFontColorpopstCF.rgbColorsmovstCF.Flags,CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_EFFECTS;字體列表中只顯示屏幕字體,對話框中顯示“效果”復選

25、框invokeChooseFont,addr stCF.ifeaxpushstCF.rgbColorspopdwFontColormoveax,stCF.iPointSize;用戶選擇的字體大小,單位是1/10磅shleax,1invoke_SetFont,addr stLogFont.lfFaceName,eax,stCF.rgbColors.endifret_ChooseFontENDP;=;設置標題欄的顯示內容_SetCaptionPROClocalszBuffer1024:byte.ifszFileName;如果當前是某一文件,則顯示文件名moveax,offset szFileNam

26、e.elsemoveax,offset noName;否則顯示未命名.endifinvokewsprintf,addr szBuffer,addr titleFormat,eaxinvokeSetWindowText,hWinMain,addr szBufferret_SetCaptionENDP;=;設置菜單項,狀態(tài)欄的狀態(tài)和信息_SetStatusPROClocalstRange:CHARRANGElocaldwLines,dwLine,dwLineStartlocalszBuffer256:bytelocalstST:SYSTEMTIME;在狀態(tài)欄顯示行列信息invokeGetWindo

27、wTextLength,hWinEditinvokewsprintf,addr szBuffer,addr charsFormat,eaxinvokeSendMessage,hWinStatus,SB_SETTEXT,2,addr szBuffer;總字節(jié)數(shù)invokeSendMessage,hWinEdit,EM_EXGETSEL,0,addr stRange;獲取選定區(qū)域invokeSendMessage,hWinEdit,EM_EXLINEFROMCHAR,0,-1;得知指定的字符位于哪一行中movdwLine,eaxinvokeSendMessage,hWinEdit,EM_LINEI

28、NDEX,eax,0;獲取指定行的起始字符的位置movecx,stRange.cpMinsubecx,eaxincecx;顯示給用戶的列號從1開始編號invokewsprintf,addr szBuffer,addr colFormat,ecxinvokeSendMessage,hWinStatus,SB_SETTEXT,1,addr szBuffer;光標所在位置的列incdwLine;顯示給用戶的行號從1開始invokewsprintf,addr szBuffer,addr lineFormat,dwLineinvokeSendMessage,hWinStatus,SB_SETTEXT,0

29、,addr szBuffer;光標所在位置的行;根據(jù)情況改變菜單項的狀態(tài)moveax,stRange.cpMin.ifeax = stRange.cpMax;選中區(qū)域為空則復制粘貼刪除不可用invokeEnableMenuItem,hMenu,IDM_COPY,MF_GRAYEDinvokeEnableMenuItem,hMenu,IDM_CUT,MF_GRAYED.elseinvokeEnableMenuItem,hMenu,IDM_COPY,MF_ENABLEDinvokeEnableMenuItem,hMenu,IDM_CUT,MF_ENABLED.endifinvokeIsClipbo

30、ardFormatAvailable,CF_TEXT;判斷剪貼板的格式是否是文本格式.ifeax;如果剪貼板有內容則可以粘貼invokeEnableMenuItem,hMenu,IDM_PASTE,MF_ENABLED.elseinvokeEnableMenuItem,hMenu,IDM_PASTE,MF_GRAYED.endifinvokeGetWindowTextLength,hWinEdit.ifeax;如果可以全選invokeEnableMenuItem,hMenu,IDM_SELECTALL,MF_ENABLED.elseinvokeEnableMenuItem,hMenu,IDM_

31、SELECTALL,MF_GRAYED.endifinvokeSendMessage,hWinEdit,EM_GETMODIFY,0,0.ifeax;如果可以保存invokeEnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED.elseinvokeEnableMenuItem,hMenu,IDM_SAVE,MF_GRAYED.endif.ifdwOption & F_STATUSBAR;如果選中了狀態(tài)欄invokeCheckMenuItem,hMenu,IDM_STATUSBAR,MF_CHECKED.elseinvokeCheckMenuItem,hMen

32、u,IDM_STATUSBAR,MF_UNCHECKED.endifret_SetStatusENDP;=_ResizePROClocalstRect:RECTlocalstRectTemp:RECTlocaldwWidth,dwHeight;取得窗口客戶區(qū)的大小invokeGetClientRect,hWinMain,addr stRectmoveax,stRect.rightsubeax,stRect.leftmovdwWidth,eaxmoveax,stRect.bottomsubeax,stRect.topmovdwHeight,eax;計算及調整狀態(tài)欄.ifdwOption &

33、; F_STATUSBARinvokeShowWindow,hWinStatus,SW_SHOWinvokeMoveWindow,hWinStatus,0,0,0,0,TRUEinvokeGetWindowRect,hWinStatus,addr stRectTempmoveax,stRectTemp.bottomsubeax,stRectTemp.topsubdwHeight,eax.elseinvokeShowWindow,hWinStatus,SW_HIDE.endif;調整Richedit控件位置invokeMoveWindow,hWinEdit,stRect.left,stRect.

34、top,dwWidth,dwHeight,TRUEret_ResizeENDP;=_QuitPROCinvoke_CheckModifyState.ifeaxinvokeDestroyWindow,hWinMaininvokePostQuitMessage,NULL;產生一條 WM_QUIT 消息.ifhFile;如果有打開的文件則關閉invokeCloseHandle,hFile.endif.endifinvokeKillTimer,hWinMain,1;取消定時器ret_QuitENDP;=_CreateWindow PROC; 注冊“查找”對話框消息,初始化“查找”對話框的結構movst

35、Find.lStructSize,sizeof stFind;結構的長度pushhWinMainpopstFind.hwndOwner;指定所屬窗口movstFind.Flags,FR_DOWN;把“方向”單選鈕設置為“向下”movstFind.lpstrFindWhat,offset szFindText;lpstrFindWhat指向包含查找字符串的指針movstFind.wFindWhatLen,sizeof szFindText;wFindWhatLen指示lpstrFindWhat緩存區(qū)的長度movstFind.lpstrReplaceWith,offset szReplaceTex

36、t;指向包含替換為字符串的指針movstFind.wReplaceWithLen,sizeof szReplaceText;lpstrReplaceWith緩存區(qū)的長度invokeRegisterWindowMessage,addr FINDMSGSTRING;注冊自定義的消息movidFindMessage,eax;eax中返回消息ID;建立狀態(tài)欄invokeCreateStatusWindow,SBARS_SIZEGRIP or WS_CHILD or WS_VISIBLE,;顯示狀態(tài)欄右下角的斜條NULL,hWinMain,2;父窗口為hWinMain,狀態(tài)欄控件的ID為2,初始化字符串

37、為NULLmovhWinStatus,eaxinvokeSendMessage,hWinStatus,SB_SETPARTS,5,offset dwStatusWidth;分成四欄;建立輸出文本窗口invokeCreateWindowEx,WS_EX_CLIENTEDGE,offset classEdit,NULL,;客戶區(qū)立體邊框WS_CHILD OR WS_VISIBLE OR WS_VSCROLL ORWS_HSCROLL OR ES_MULTILINE or ES_NOHIDESEL,;可以編輯多行文字,失去鍵盤輸入焦點的時候仍然顯示選擇區(qū)域0,0,0,0,hWinMain,0,hIn

38、stance,NULL;0指定的是子窗口的ID號movhWinEdit,eaxordwOption,F_STATUSBAR;注釋invoke_SetCaption;設置標題invoke_SetStatus;設置狀態(tài)欄invoke_SetFont,addr fontFace,9 * 20,0;注釋;在使用多行Edit控件時,父窗口發(fā)送 EM_SETEVENTMASK 消息給 RichEdit 控件,指定它對哪些消息感興趣;wParam必須為0,ENM_CHANGE 發(fā)送 EN_CHANGE 通知NM_SELCHANGE 發(fā)送 EN_SELCHANGE 通知invokeSendMessage,hW

39、inEdit,EM_SETEVENTMASK,0,ENM_CHANGE or ENM_SELCHANGE or ENM_MOUSEEVENTSinvokeSendMessage,hWinEdit,EM_EXLIMITTEXT,0,-1;設置控件中能夠容納字符的總數(shù),0FFFFFFFFh(-1) 字節(jié)invokeSendMessage,hWinMain,EM_EMPTYUNDOBUFFER,0,0;清空undo,redo隊列ret_CreateWindow ENDP;=;窗口過程_ProcWinMainPROCuses ebx edi esi hWnd,uMsg,wParam,lParamloc

40、alstRange:CHARRANGElocalstST:SYSTEMTIMElocalszBuffer128:bytelocalpt:POINTlocalhPopup:DWORDlocalstES:EDITSTREAMmoveax,uMsg.if eax = WM_CREATEpushhWndpophWinMaininvoke_CreateWindowinvokeSetTimer,hWinMain,1,300,NULL;設置定時器.elseifeax = WM_DROPFILES;拖放文件call_CheckModifyState.if eax = FALSEcall_SaveFile.en

41、difinvokeDragQueryFile,wParam,0,addr szFileName,128;獲取文件的路徑invokeCreateFile,addr szFileName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0;打開文件movhFile,eaxmovstES.dwCookie,TRUE;在Richedit的流操作中讀文件movstES.dwError,NULLmovstES.pfnCallback,offset _StreamProcIninvokeS

42、endMessage,hWinEdit,EM_STREAMIN,SF_TEXT,addr stES;流入操作,文本格式是簡單的文本格式invokeSendMessage,hWinEdit,EM_SETMODIFY,FALSE,0;設置修改狀態(tài)call_SetCaptioncall_SetStatus.elseif eax = WM_TIMERinvokeGetLocalTime,addr stSTmovzxeax,stST.wHourmovzxebx,stST.wMinutemovzxecx,stST.wSecondinvokewsprintf,addr szBuffer,addr timeFormat,eax,ebx,ecxinvokeSendMessage,hWinStatus,SB_SETTEXT,3,addr szBuffer.elseif eax = WM_SIZEinvoke_Resize.elseif eax = WM_NOTIFYmoveax,lParammoveax,eax + NMHDR.hwndFrom.ifeax = hWinEditinvoke_SetStatus.endifpushesimovesi,lParamassum

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論