⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多个文件的工程---增强poppad.txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 4 页
字号:
多个文件的工程---增强POPPAD 
相关的例子:下载>>>  作者:Zoologist 于2008-8-17上传   

--------------------------------------------------------------------------------

我们之前编写的程序都是非常简单的单文件,下面的程序是稍微复杂的结构:一个主程序和若干个完成不同功能的程序。

首先,还是选择建立Win32 EXE 程序。



然后给工程命名,这几步同普通的程序没有差别。



建立成功之后,写好主程序,再逐步添加其余各个文件,第一种方法是,从新文件中创建,



将会新建出来一个空白文档:



在新建的文档中选择参数设置:



设置为下面这个样子:



之后,新建立的文件就可以先编译为OBJ文件,再同主文件一起编译生成需要的结果了。



如果你已经有了文件,打算加入工程中,请选择“导入文件”



选择你想加入的文件即可,加入新文件之后,按照上面提到的,设置相同的参数即可。

增强POPPAD


当我们向前面一期POPPAD中增加菜单时,还有几个标准菜单项没有做完。现在我们已经准备好在POPPAD中加入打开文件、读入文件以及在磁盘上储存编辑过文件的功能。在处理中,我们还将在POPPAD中加入字体选择和搜索替换功能。

实作POPPAD3程序的文件如程序11-6所示。


程序11-6 POPPAD3 

        
POPPAD.ASM
        
;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
	
	WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
	AboutDlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
;Functions in POPFILE.ASM
PopFileInitialize       PROTO :HWND
PopFileOpenDlg          PROTO :HWND, :PTSTR, :PTSTR
PopFileSaveDlg          PROTO :HWND, :PTSTR, :PTSTR
PopFileRead             PROTO :HWND, :PTSTR
PopFileWrite            PROTO :HWND, :PTSTR

;Functions in POPFIND.ASM
PopFindFindDlg          PROTO :HWND
PopFindReplaceDlg       PROTO :HWND
PopFindFindText         PROTO :HWND,:DWORD, :DWORD
PopFindReplaceText      PROTO :HWND,:DWORD, :DWORD
PopFindNextText         PROTO :HWND,:DWORD
PopFindValidFind        PROTO 

;Functions in POPFONT.ASM
PopFontInitialize	PROTO :HWND
PopFontChooseFont	PROTO :HWND
PopFontSetFont		PROTO :HWND
PopFontDeinitialize 	PROTO

;Functions in POPPRNT.ASM
;BOOL PopPrntPrintFile (HINSTANCE, HWND, HWND, PTSTR) ;

	EDITID   equ	1

IDC_FILENAME     equ     1000
IDM_FILE_NEW     equ     40001
IDM_FILE_OPEN    equ     40002
IDM_FILE_SAVE    equ     40003
IDM_FILE_SAVE_AS equ     40004
IDM_FILE_PRINT   equ     40005
IDM_APP_EXIT     equ     40006
IDM_EDIT_UNDO    equ     40007
IDM_EDIT_CUT     equ     40008
IDM_EDIT_COPY    equ     40009
IDM_EDIT_PASTE   equ     40010
IDM_EDIT_CLEAR   equ     40011
IDM_EDIT_SELECT_ALL equ  40012
IDM_SEARCH_FIND  equ     40013
IDM_SEARCH_NEXT  equ     40014
IDM_SEARCH_REPLACE  equ   40015
IDM_FORMAT_FONT   equ    40016
IDM_HELP         equ     40017
IDM_APP_ABOUT    equ     40018
	

.DATA
	UNTITLED    db "(untitled)",0
	szAppName   db "PopPad",0
        bNeedSave   BOOL	FALSE
        FINDMSGSTRING  db	"commdlg_FindReplace",0
        nullStr	    db	0
.DATA?
        hwndEdit    HWND	?
        hInst       HINSTANCE	?
        iOffset     DWORD	?
        szFileName  db	MAX_PATH	dup(?)
        szTitleName db	MAX_PATH	dup(?)
        messageFindReplace UINT	?        
        hDlgModeless HWND  	?
.CODE
START:

	invoke GetModuleHandle,NULL
	invoke WinMain,eax,NULL,NULL,SW_SHOWDEFAULT
	invoke ExitProcess,0

WinMain proc hInstance:DWORD,hPrevInst:DWORD,szCmdLine:DWORD,iCmdShow:DWORD
	LOCAL msg  :MSG
	local hwnd :HWND
	LOCAL wndclass   :WNDCLASSEX
	LOCAL hAccel:HACCEL
	
	mov wndclass.cbSize,sizeof WNDCLASSEX	
	mov wndclass.style,CS_HREDRAW or CS_VREDRAW	
	mov wndclass.lpfnWndProc,offset WndProc

	mov wndclass.cbClsExtra,0
	mov wndclass.cbWndExtra,0
	
	push hInstance
	pop wndclass.hInstance
	
	invoke LoadIcon,NULL,IDI_APPLICATION
	mov wndclass.hIcon,eax	
	
	invoke LoadCursor,NULL,IDC_ARROW
	mov wndclass.hCursor,eax	
	
	invoke GetStockObject,WHITE_BRUSH
	mov wndclass.hbrBackground,EAX
	
	mov wndclass.lpszMenuName,offset szAppName
	mov wndclass.lpszClassName,offset szAppName

	mov wndclass.hIconSm,0
	
	invoke RegisterClassEx, ADDR wndclass
	.if (EAX==0)
		 invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),addr szAppName,MB_ICONERROR 		
		 ret
	.endif
        
	invoke CreateWindowEx,
					NULL,
					ADDR szAppName, 					;window class name
					ADDR szAppName, 
					WS_OVERLAPPEDWINDOW,					;window style
					CW_USEDEFAULT,						;initial x position
					CW_USEDEFAULT,						;initial y position
					CW_USEDEFAULT, 						;initial x size
					CW_USEDEFAULT,						;initial y size
					NULL,							;parent window handle
					NULL,							;window menu handle
					hInstance,							;program instance handle
					szCmdLine										;creation parameters
	mov hwnd,eax
	
	invoke ShowWindow,hwnd,iCmdShow
	invoke UpdateWindow,hwnd
	
	StartLoop:
		invoke GetMessage,ADDR msg,NULL,0,0
			cmp eax, 0
			je ExitLoop
				invoke IsDialogMessage,hDlgModeless,addr msg
				.if	(eax!=TRUE)||hDlgModeless==NULL
					invoke	TranslateAccelerator,hwnd, hAccel,addr msg
					.if	(eax!=TRUE)
						invoke TranslateMessage, ADDR msg
						invoke DispatchMessage,  ADDR msg
					.endif
				.endif	
			jmp StartLoop
	ExitLoop:
	
	mov eax,msg.wParam
	ret

WinMain endp

DoCaption	proc hwnd:HWND,szTName:DWORD
	LOCAL	szCaption[64 + MAX_PATH]:TCHAR
	mov	esi,szTName
	mov	al,[esi]
	.if	al == FALSE
           	mov	ebx,offset UNTITLED 
        .else	
           	mov	ebx,szTName
        .endif
        invoke	wsprintf,addr szCaption, CTXT("%s - %s"),addr szAppName,ebx
        invoke	SetWindowText,hwnd, addr szCaption
        ret
DoCaption	endp

OkMessage	proc	hwnd:HWND,szMessage:DWORD,szTName:DWORD
        LOCAL	szBuffer[64 + MAX_PATH]:TCHAR 
        mov	esi,szTName
        mov	al,[esi]
        .if	al == FALSE
           	mov	ebx,offset UNTITLED 
        .else	
           	mov	ebx,szTName
        .endif           
        invoke	wsprintf,addr szBuffer,szMessage,ebx
	invoke	MessageBox,hwnd,addr szBuffer,addr szAppName, MB_OK or MB_ICONEXCLAMATION
        ret
OkMessage	endp

AskAboutSave	proc hwnd:HWND , szTName:DWORD
	LOCAL	szBuffer[64 + MAX_PATH]:TCHAR
        LOCAL	iReturn:DWORD

        mov	esi,szTName
        mov	al,[esi]
        .if	al ==FALSE
           	mov	ebx,offset UNTITLED 
        .else	
           	mov	ebx,szTName
        .endif
           
        invoke	wsprintf,addr szBuffer, CTXT ("Save current changes in %s?"),ebx
        invoke	MessageBox,hwnd,addr szBuffer,addr szAppName,MB_YESNOCANCEL or MB_ICONQUESTION
        mov	iReturn,eax
        .if (iReturn == IDYES)
          	invoke	SendMessage,hwnd, WM_COMMAND, IDM_FILE_SAVE, 0
               .if	(eax==FALSE)
                    	mov	eax,IDCANCEL
                    	mov	iReturn,eax
		.endif
	.endif
	mov	eax,iReturn 
        ret
AskAboutSave	endp
        
PopPrntPrintFile	proc	hInstPRN:HINSTANCE,hwnd:HWND,hwndEditPRN:HWND, pstrTitleName:PTSTR
	mov	eax,FALSE
	ret
PopPrntPrintFile	endp

WndProc proc hwnd:DWORD,message:DWORD,wParam :DWORD,lParam :DWORD
         LOCAL	iSelBeg, iSelEnd, iEnable:DWORD
         LOCAL	pfr:DWORD	;LPFINDREPLACE
;LPFINDREPLACE 是指向如下结构体的指针    
;FINDREPLACEA STRUCT
;  lStructSize       DWORD      ?
;  hwndOwner         DWORD      ?
;  hInstance         DWORD      ?
;  Flags             DWORD      ?
;  lpstrFindWhat     DWORD      ?
;  lpstrReplaceWith  DWORD      ?
;  wFindWhatLen       WORD      ?
;  wReplaceWithLen    WORD      ?
;  lCustData         DWORD      ?
;  lpfnHook          DWORD      ?
;  lpTemplateName    DWORD      ?
;FINDREPLACEA ENDS

	.if message==WM_CREATE
		mov	esi,lParam
		mov	eax,[esi+4]
		mov	hInst,eax
               ;Create the edit control child window
        
                invoke  CreateWindowEx,NULL,CTXT ("edit"), NULL,
                        WS_CHILD or WS_VISIBLE or WS_HSCROLL or WS_VSCROLL or \
                        WS_BORDER or ES_LEFT or ES_MULTILINE or \
                        ES_NOHIDESEL or ES_AUTOHSCROLL or ES_AUTOVSCROLL,
                        0, 0, 0, 0,
                        hwnd, EDITID, hInst, NULL
		mov	hwndEdit,eax

                invoke	SendMessage,hwndEdit, EM_LIMITTEXT, 32000, 0
        
                ;Initialize common dialog box stuff
        
                invoke PopFileInitialize,hwnd
                invoke PopFontInitialize,hwndEdit
                invoke RegisterWindowMessage,addr	FINDMSGSTRING
                mov	messageFindReplace,eax
                invoke DoCaption,hwnd,addr szTitleName

	        xor	eax,eax
	        ret
	.elseif message ==  WM_SETFOCUS
		invoke	SetFocus,hwndEdit
                xor	eax,eax
	        ret	        
	.elseif message ==  WM_SIZE
		mov	eax,lParam
		and	eax,0FFFFh
		mov	ebx,lParam
		shr	ebx,16
                invoke	MoveWindow,hwndEdit, 0, 0, eax,ebx, TRUE
                xor	eax,eax
	        ret
	.elseif message == WM_INITMENUPOPUP
        	mov	eax,lParam
		.if	eax==1      ; Edit menu
                                    ; Enable Undo if edit control can do it
                        invoke	 SendMessage,hwndEdit, EM_CANUNDO, 0, 0            
                        .if	eax==FALSE
                        	mov	ebx,MF_GRAYED
                        .else
                        	mov	ebx,MF_ENABLED
                        .endif
                        invoke	EnableMenuItem,wParam, IDM_EDIT_UNDO,ebx
                        
        			    ; Enable Paste if text is in the clipboard
        		invoke	 IsClipboardFormatAvailable,CF_TEXT
                        .if	eax==FALSE
                        	mov	ebx,MF_GRAYED
                        .else
                        	mov	ebx,MF_ENABLED
                        .endif        		
                        invoke	EnableMenuItem,wParam, IDM_EDIT_PASTE,ebx
                        	    ; Enable Cut, Copy, and Del if text is selected
                        invoke  SendMessage,hwndEdit, EM_GETSEL, addr iSelBeg,addr iSelEnd

                        .if	iSelEnd==FALSE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -