📄 多个文件的工程---增强poppad.txt
字号:
多个文件的工程---增强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 + -