?? 多個文件的工程---增強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 + -