1
;********************************************************************
2
; 用下列命令进行编译和链接:
3
; ml /c /coff win322-1.asm
4
; rc win322-1.rc
5
; link /subsystem:windows win322-1.obj win322-1.res
6
;********************************************************************
7
; 使用各种资源----记事本程序的编写
8
;==================================================
9
.486
10
.model flat,stdcall
11
option casemap : none
12
;********************************************************************
13
;include=============================================
14
include windows.inc
15
include kernel32.inc
16
includelib kernel32.lib
17
include user32.inc
18
includelib user32.lib
19
include comdlg32.inc
20
includelib comdlg32.lib
21
include comctl32.inc
22
includelib comctl32.lib
23
include gdi32.inc
24
includelib gdi32.lib
25
include shell32.inc
26
includelib shell32.lib
27
;********************************************************************
28
CDN_FILEOK equ CDN_FIRST-0005h
29
CDN_INITDONE equ CDN_FIRST - 0
30
CDN_SELCHANGE equ CDN_FIRST - 1
31
OFN_ENABLESIZING equ 00800000h
32
IDM_MENUHELP1 equ 700
33
IDM_MENUHELP2 equ 701
34
IDM_MENUHELP3 equ 702
35
IDM_MENUHELP4 equ 703
36
IDM_MENUHELP5 equ 704
37
IDM_MENUHELP6 equ 705
38
39
IDC_MAIN equ 100
40
IDM_MAIN equ 200
41
IDA_MAIN equ 300
42
DLG_MAIN equ 400
43
DLG_GOTO equ 1000
44
IDC_RICHEDIT equ 1010
45
IDM_NEW equ 101
46
IDM_OPEN equ 102
47
IDM_SAVE equ 103
48
IDM_SAVE_AS equ 104
49
IDM_PAGE_SETUP equ 105
50
IDM_PRINT equ 106
51
IDM_EXIT equ 107
52
IDM_UNDO equ 108
53
IDM_CUT equ 109
54
IDM_COPY equ 110
55
IDM_PASTE equ 111
56
IDM_DEL equ 112
57
IDM_FIND equ 113
58
IDM_FIND_NEXT equ 114
59
IDM_REPLACE equ 115
60
IDM_GOTO equ 116
61
IDM_CHECK_ALL equ 117
62
IDM_TIME_DATE equ 118
63
IDM_LINE_WRAP equ 119
64
IDM_FONT equ 120
65
IDM_STATUS_BAR equ 121
66
IDM_HELP equ 122
67
IDM_ABOUT_NOTEPAD equ 123
68
IDM_TOOL_BAR equ 124
69
ID_EDIT equ 500
70
IDC_PREVIEW equ 600
71
ID_STATUSBAR equ 800
72
ID_TOOLBAR equ 900
73
ID_OK equ 201
74
ID_CANCEL equ 202
75
;******************************************************************
76
OFNOTIFYEX struct
77
hdr NMHDR <>
78
lpOpenFileName OPENFILENAME <>
79
lpsf dword ?
80
lpIdItem dword ?
81
OFNOTIFYEX ends
82
;********************************************************************
83
.data?
84
hInstance dd ?
85
hWinMain dd ?
86
hMenu dd ?
87
hEdit dd ?
88
hEdit2 dd ?
89
hIcon dd ?
90
SetPaste dd ?
91
@hDlg dd ?
92
@hEdit dd ?
93
hClipboard dd ?
94
lpOldProc dd ?
95
_lpMem dd ?
96
_flag db ?
97
_JFlag dd ?
98
hFile dd ?
99
hHeap dd ?
100
hHeap2 dd ?
101
lpHeap dd ?
102
lpPrintBuffer dd ?
103
lpNumByte dd ?
104
lpVirtualMem dd ?
105
FrId dd ?
106
hFind dd ?
107
lpFindMem dd ?
108
dwFindNext dd ?
109
hReplace dd ?
110
hStatusBar dd ?
111
hToolbar dd ?
112
oldEditProc dd ?
113
hDlg dd ?
114
hDc dd ?
115
hFont dd ?
116
@dwHighSize dd ?
117
@dwLowSize dd ?
118
szPrinter dd MAX_PATH dup (?)
119
szFileName dd MAX_PATH dup (?)
120
lpBuff0 dd 1024 dup (?)
121
lpBuff1 dd 1024 dup (?)
122
szFindText dd MAX_PATH dup (?)
123
szReplaceText dd MAX_PATH dup (?)
124
logfont LOGFONT <?>
125
.data
126
stFr FINDREPLACE <sizeof FINDREPLACE,0,0,FR_DOWN or FR_HIDEWHOLEWORD,szFindText,szReplaceText,sizeof szFindText,sizeof szReplaceText,0,0,0>
127
stButton equ this byte
128
TBBUTTON <STD_FILENEW,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
129
TBBUTTON <STD_FILEOPEN,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
130
TBBUTTON <STD_FILESAVE,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
131
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
132
TBBUTTON <STD_PRINT,IDM_PRINT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
133
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
134
TBBUTTON <STD_COPY,IDM_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
135
TBBUTTON <STD_CUT,IDM_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
136
TBBUTTON <STD_PASTE,IDM_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
137
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
138
TBBUTTON <STD_FIND,IDM_FIND,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
139
TBBUTTON <STD_REPLACE,IDM_REPLACE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
140
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
141
TBBUTTON <STD_HELP,IDM_HELP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>
142
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>
143
.const
144
145
szClassName db "MYNotepad",0
146
szDefCaption db "无标题",0
147
szCaption db "记事本",0
148
szNotCaption db "无标题",0
149
szFilter db "文本文档案(*.txt)",0,"*.txt",0,"ASM文档(*.asm)",0,"*.asm",0,"ALL FILE(*.*)",0,"*.*",0,0
150
szSaveYesOrNo db "你的文件%s已经修改过,是否保存文档?",0
151
szDefExt db "txt",0
152
szSaveDialog db "保存",0
153
szSaveAs db "另存为",0
154
szClass db "EDIT",0
155
szErrPerson db "错误",0
156
StatusBarCount dd 400,-1
157
szSetText db "请选择文件进行预览",0
158
szExisting db "文件 %s 已经存在,确定要覆盖它吗?",0
159
szLnCol db "Ln %d,Col%d",0
160
FINDMSGSTR db "commdlg_FindReplace",0
161
szMenuHelp dd 0,IDM_MENUHELP1,0,0
162
ceshistr db "%s",0
163
ceshi db "%d",0
164
chengong db "记事本完成了,谢谢使用",0
165
szTextOut db "指定行超出控件文本行数",0
166
szNotFound db "找不到%s",0
167
szTime db "%d:%02d %04d-%02d-%02d",0
168
szAbout1 db "模拟记事本程序",0
169
szAbout2 db "kiki-------梁越洋",0
170
szFont db "宋体",0
171
szApi db "该功能还在修改中,暂不提供",0
172
szHelp db "怎么不会用要看帮助文件?不会吧!!都说模拟记事本拉,肯定是象记事本那样子使用拉:-)",0
173
;********************************************************************
174
.code
175
;********************************************************************
176
_SetFont proc uses ebx esi edi
177
178
invoke CreateFont,logfont.lfHeight,logfont.lfWidth,logfont.lfEscapement,\
179
logfont.lfOrientation,logfont.lfWeight,dword ptr logfont.lfItalic,\
180
dword ptr logfont.lfUnderline,dword ptr logfont.lfStrikeOut,\
181
dword ptr logfont.lfCharSet,dword ptr logfont.lfOutPrecision,\
182
dword ptr logfont.lfClipPrecision,dword ptr logfont.lfQuality,\
183
dword ptr logfont.lfPitchAndFamily,offset logfont.lfFaceName
184
.if eax
185
mov hFont,eax
186
invoke SendMessage,hEdit,WM_SETFONT,hFont,TRUE
187
.endif
188
ret
189
_SetFont endp
190
;********************************************************************
191
_ChooseFont proc uses ebx esi edi
192
local @stCF:CHOOSEFONT
193
194
invoke RtlZeroMemory,addr @stCF,sizeof CHOOSEFONT
195
mov @stCF.lStructSize,sizeof CHOOSEFONT
196
push hInstance
197
pop @stCF.hInstance
198
push hWinMain
199
pop @stCF.hWndOwner
200
mov @stCF.lpLogFont,offset logfont
201
mov @stCF.Flags,CF_NOOEMFONTS or CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_TTONLY
202
invoke ChooseFont,addr @stCF
203
.if eax
204
mov eax,@stCF.iPointSize
205
shl eax,1
206
invoke _SetFont
207
.endif
208
ret
209
_ChooseFont endp
210
;********************************************************************
211
Dlg_Proc proc uses ebx esi edi _hDlg,_uMsg,_wParam,_lParam
212
local @hDlgEdit
213
local @szDlgCount
214
215
mov eax,_uMsg
216
.if eax == WM_CLOSE
217
invoke DestroyWindow,_hDlg
218
.elseif eax == WM_COMMAND
219
mov eax,_wParam
220
.if ax == ID_OK
221
invoke GetDlgItemInt,_hDlg,IDC_RICHEDIT,0,0
222
push eax
223
invoke GetDlgItem,_hDlg,IDC_RICHEDIT
224
invoke SendMessage,hEdit,EM_GETLINECOUNT,0,0
225
pop ecx
226
.if ecx > eax
227
invoke MessageBox,0,offset szTextOut,0,MB_OK
228
.else
229
mov eax,ecx
230
dec eax
231
invoke SendMessage,hEdit,EM_LINEINDEX,eax,0
232
invoke SendMessage,hEdit,EM_SETSEL,eax,eax
233
invoke SendMessage,hEdit,EM_SCROLLCARET,0,0
234
invoke SendMessage,_hDlg,WM_CLOSE,0,0
235
.endif
236
.elseif ax == ID_CANCEL
237
invoke SendMessage,_hDlg,WM_CLOSE,0,0
238
.endif
239
.else
240
mov eax,FALSE
241
ret
242
.endif
243
mov eax,TRUE
244
ret
245
Dlg_Proc endp
246
;********************************************************************
247
EditWndProc proc _hWnd,_uMsg,_wParam,_lParam
248
249
mov eax,_uMsg
250
.if (eax == WM_KEYDOWN) || (eax == WM_KEYUP)
251
call _SetState
252
.elseif eax == WM_LBUTTONDOWN || eax == WM_LBUTTONUP
253
call _SetState
254
.endif
255
invoke CallWindowProc,oldEditProc,_hWnd,_uMsg,_wParam,_lParam
256
ret
257
EditWndProc endp
258
;********************************************************************
259
_TestSf proc uses ebx esi edi _address,_count,_address2
260
261
mov ecx,_count
262
mov esi,_address
263
mov edi,_address2
264
.repeat
265
mov al,byte ptr [esi]
266
.if al >="A" && al <= "Z"
267
add al,20h
268
.endif
269
mov bl,byte ptr [edi]
270
.if bl >="A" && bl <= "Z"
271
add bl,20h
272
.endif
273
dec ecx
274
inc esi
275
inc edi
276
sub al,bl
277
.break .if al != 0
278
.until ecx == 0
279
.if !ecx && ZERO?
280
mov eax,TRUE
281
jmp @f
282
.endif
283
mov eax,FALSE
284
@@:
285
and stFr.Flags,not FR_MATCHCASE
286
ret
287
_TestSf endp
288
;********************************************************************
289
_FindReplace proc uses ebx esi edi
290
local @stRange:CHARRANGE
291
local @LowSize,@HighSize,@Flags,@dwReturn
292
293
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax
294
mov eax,@stRange.cpMax
295
mov @stRange.cpMin,eax
296
invoke GetWindowTextLength,hEdit
297
inc eax
298
mov @HighSize,eax
299
invoke VirtualAlloc,NULL,eax,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE
300
mov lpFindMem,eax
301
invoke GetWindowText,hEdit,lpFindMem,@HighSize
302
invoke lstrlen,offset szFindText
303
inc eax
304
mov @LowSize,eax
305
mov ebx,@stRange.cpMin
306
mov @Flags,ebx
307
@@:
308
push ebx
309
invoke GetWindowTextLength,hEdit
310
cmp eax,0
311
jz _NotF
312
pop ebx
313
add ebx,lpFindMem
314
mov esi,ebx
315
mov edi,offset szFindText
316
.if !(stFr.Flags & FR_MATCHCASE)
317
invoke _TestSf,esi,@LowSize,edi
318
.if eax
319
jmp @f
320
.endif
321
.endif
322
cld
323
mov ecx,@LowSize
324
repe cmpsb
325
.if ecx == 0 && ZERO?
326
jmp @f
327
.else
328
inc @Flags
329
mov ebx,@Flags
330
mov edx,@HighSize
331
sub edx,@LowSize
332
.if ebx <= edx
333
jmp @b
334
.else
335
jmp _NotF
336
.endif
337
.endif
338
@@: mov edx,@Flags
339
add edx,@LowSize
340
dec edx
341
invoke SendMessage,hEdit,EM_SETSEL,@Flags,edx
342
mov @dwReturn,1
343
jmp _End
344
_NotF: invoke wsprintf,offset lpBuff1,offset szNotFound,offset szFindText
345
invoke MessageBox,hWinMain,offset lpBuff1,offset szCaption,MB_OK
346
mov @dwReturn,0
347
_End: invoke VirtualFree,lpFindMem,0,MEM_DECOMMIT or MEM_RELEASE
348
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1
349
mov lpFindMem,0
350
mov dwFindNext,-1
351
mov eax,@dwReturn
352
ret
353
_FindReplace endp
354
;********************************************************************
355
_FindReplace2 proc uses ebx esi edi
356
local @LowSize,@HighSize,@Flags,@dwReturn
357
local @stRange:CHARRANGE
358
359
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax
360
mov eax,@stRange.cpMin
361
mov @stRange.cpMax,eax
362
invoke GetWindowTextLength,hEdit
363
inc eax
364
mov @HighSize,eax
365
invoke VirtualAlloc,NULL,eax,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE
366
mov lpFindMem,eax
367
invoke GetWindowText,hEdit,lpFindMem,@HighSize
368
invoke lstrlen,offset szFindText
369
inc eax
370
mov @LowSize,eax
371
mov ebx,@stRange.cpMax
372
sub ebx,@LowSize
373
inc ebx
374
mov @Flags,ebx
375
@@:
376
cmp ebx,-1
377
jle _Err
378
add ebx,lpFindMem
379
mov esi,ebx
380
mov edi,offset szFindText
381
.if !(stFr.Flags & FR_MATCHCASE)
382
invoke _TestSf,esi,@LowSize,edi
383
.if eax
384
jmp @f
385
.endif
386
.endif
387
cld
388
mov ecx,@LowSize
389
repe cmpsb
390
.if (ecx == 0) && ZERO?
391
jmp @f
392
.else
393
dec @Flags
394
mov ebx,@Flags
395
.if ebx >= 0
396
jmp @b
397
.endif
398
jmp _Err
399
.endif
400
@@:
401
mov edx,@Flags
402
add edx,@LowSize
403
dec edx
404
invoke SendMessage,hEdit,EM_SETSEL,@Flags,edx
405
mov @dwReturn,1
406
jmp _Ex
407
_Err: invoke wsprintf,offset lpBuff1,offset szNotFound,offset szFindText
408
invoke MessageBox,hWinMain,offset lpBuff1,offset szCaption,MB_OK
409
mov @dwReturn,0
410
_Ex:
411
invoke VirtualFree,lpFindMem,0,MEM_DECOMMIT or MEM_RELEASE
412
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1
413
mov lpFindMem,0
414
mov dwFindNext,-1
415
mov eax,@dwReturn
416
ret
417
_FindReplace2 endp
418
;********************************************************************
419
_pfnCall proc uses ebx esi edi _dwCookie,_HeapMem,_dwNumByte,_lpNumByte
420
421
.if _dwCookie
422
invoke WriteFile,hFile,_HeapMem,_dwNumByte,_lpNumByte,0
423
.else
424
invoke ReadFile,hFile,_HeapMem,_dwNumByte,_lpNumByte,0
425
.endif
426
ret
427
_pfnCall endp
428
;********************************************************************
429
_CheckModify proc uses ebx esi edi
430
431
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
432
.if eax
433
invoke wsprintf,offset lpBuff0,offset szSaveYesOrNo,offset szFileName
434
invoke MessageBox,hWinMain,offset lpBuff0,offset szCaption,MB_YESNOCANCEL
435
.if eax == IDYES
436
call _SaveFile
437
mov eax,1
438
.elseif eax == IDNO
439
mov eax,-1
440
.endif
441
.else
442
mov eax,0
443
.endif
444
ret
445
_CheckModify endp
446
;********************************************************************
447
_PageSetup proc uses ebx esi edi
448
local @stPage : PAGESETUPDLG
449
450
invoke RtlZeroMemory,addr @stPage,sizeof @stPage
451
mov @stPage.lStructSize,sizeof PAGESETUPDLG
452
push hWinMain
453
pop @stPage.hwndOwner
454
invoke PageSetupDlg,addr @stPage
455
.if eax && @stPage.hDevMode
456
mov eax,@stPage.hDevMode
457
mov eax,[eax]
458
invoke wsprintf,offset szPrinter,offset ceshistr,eax
459
.endif
460
ret
461
_PageSetup endp
462
;********************************************************************
463
_PrintDc proc uses ebx esi edi
464
local @PrintSize
465
local @Doc : DOCINFO
466
467
invoke CreateDC,NULL,offset szPrinter,NULL,NULL
468
mov hDc,eax
469
.if hDc
470
.if szPrinter
471
invoke GetWindowTextLength,hEdit
472
inc eax
473
mov @PrintSize,eax
474
invoke GetProcessHeap
475
.if eax && (eax < 0C0000000H)
476
mov hHeap2,eax
477
.endif
478
invoke HeapAlloc,hHeap2,HEAP_GENERATE_EXCEPTIONS or HEAP_NO_SERIALIZE or\
479
HEAP_ZERO_MEMORY,@PrintSize
480
.if eax && (eax < 0c0000000h)
481
mov lpPrintBuffer,eax
482
.endif
483
invoke GetWindowText,hEdit,lpPrintBuffer,@PrintSize
484
invoke StartDoc,hDc,NULL
485
invoke StartPage,hDc
486
invoke TextOut,hDc,10,10,lpPrintBuffer,@PrintSize
487
invoke EndPage,hDc
488
invoke EndDoc,hDc
489
invoke HeapFree,hHeap2,NULL,lpPrintBuffer
490
invoke RtlZeroMemory,offset szPrinter,sizeof szPrinter
491
.endif
492
.endif
493
ret
494
_PrintDc endp
495
;********************************************************************
496
_MadeApplication proc uses ebx esi edi
497
498
invoke CreateWindowEx,0,offset szClass,NULL,\
499
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN or WS_DLGFRAME\
500
OR WS_VSCROLL or ES_NOHIDESEL or ES_AUTOHSCROLL or WS_HSCROLL,\
501
0,0,0,0,hWinMain,ID_EDIT,hInstance,NULL
502
mov hEdit,eax
503
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0
504
invoke CreateFont,-16,0,0,\
505
0,FW_THIN,FALSE,\
506
FALSE,FALSE,\
507
GB2312_CHARSET,OUT_CHARACTER_PRECIS,\
508
CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,\
509
FF_MODERN,offset szFont
510
.if eax
511
mov hFont,eax
512
invoke SendMessage,hEdit,WM_SETFONT,hFont,TRUE
513
.endif
514
invoke SetClipboardViewer,hWinMain
515
mov hClipboard,eax
516
invoke CreateStatusWindow,SBARS_SIZEGRIP or WS_CHILD or WS_VISIBLE,0,hWinMain,ID_STATUSBAR
517
mov hStatusBar,eax
518
invoke SendMessage,hStatusBar,SB_SETPARTS,2,offset StatusBarCount
519
invoke CreateToolbarEx,hWinMain,TBSTYLE_FLAT or WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS or CCS_ADJUSTABLE,\
520
ID_TOOLBAR,0,HINST_COMMCTRL,IDB_STD_SMALL_COLOR,offset stButton,15,0,0,0,0,sizeof TBBUTTON
521
mov hToolbar,eax
522
523
invoke GetCommandLine
524
mov esi,eax
525
mov edi,offset szFileName
526
_1: lodsb
527
_2:
528
cmp al,22H
529
jz _5
530
_3: or al,al
531
jz _4
532
cmp al,20h
533
jz _1
534
mov [edi],al
535
inc edi
536
lodsb
537
cmp al,20h
538
jz _4
539
jmp _3
540
_5: lodsb
541
cmp al,22H
542
jz _1
543
jmp _5
544
_4:
545
546
.if szFileName
547
mov _JFlag,1
548
jmp near ptr _IsJpAddress
549
.endif
550
_6 equ THIS BYTE
551
ret
552
_MadeApplication endp
553
;********************************************************************
554
_SetState proc uses ebx esi edi
555
local @wParam,@lParam
556
local @stRg:CHARRANGE
557
local @LineIn,@Length
558
local @Buffer
559
560
invoke SendMessage,hEdit,EM_GETSEL,addr @stRg.cpMin,addr @stRg.cpMax
561
invoke SendMessage,hEdit,EM_LINEFROMCHAR,-1,0
562
mov @LineIn,eax
563
invoke SendMessage,hEdit,EM_LINEINDEX,eax,0
564
mov edx,@stRg.cpMin
565
sub edx,eax
566
inc edx
567
inc @LineIn
568
invoke wsprintf,offset lpBuff1,offset szLnCol,edx,@LineIn
569
invoke SendMessage,hStatusBar,SB_SETTEXT,1,offset lpBuff1
570
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1
571
572
mov eax,@stRg.cpMin
573
.if eax == @stRg.cpMax
574
invoke EnableMenuItem,hMenu,IDM_CUT,MF_GRAYED
575
invoke EnableMenuItem,hMenu,IDM_COPY,MF_GRAYED
576
invoke EnableMenuItem,hMenu,IDM_DEL,MF_GRAYED
577
.if hToolbar
578
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_CUT,FALSE
579
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_COPY,FALSE
580
.endif
581
.else
582
invoke EnableMenuItem,hMenu,IDM_CUT,MF_ENABLED
583
invoke EnableMenuItem,hMenu,IDM_COPY,MF_ENABLED
584
invoke EnableMenuItem,hMenu,IDM_DEL,MF_ENABLED
585
.if hToolbar
586
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_CUT,TRUE
587
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_COPY,TRUE
588
.endif
589
.endif
590
invoke SendMessage,hEdit,EM_CANUNDO,0,0
591
.if eax
592
invoke EnableMenuItem,hMenu,IDM_UNDO,MF_ENABLED
593
.else
594
invoke EnableMenuItem,hMenu,IDM_UNDO,MF_GRAYED
595
.endif
596
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
597
.if eax
598
invoke EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED
599
invoke EnableMenuItem,hMenu,IDM_SAVE_AS,MF_ENABLED
600
.if hToolbar
601
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_SAVE,TRUE
602
.endif
603
.else
604
invoke EnableMenuItem,hMenu,IDM_SAVE,MF_GRAYED
605
invoke EnableMenuItem,hMenu,IDM_SAVE_AS,MF_GRAYED
606
.if hToolbar
607
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_SAVE,FALSE
608
.endif
609
.endif
610
ret
611
_SetState endp
612
;********************************************************************
613
_ReSize proc uses ebx esi edi
614
local stRect : RECT
615
local @stRect : RECT
616
local @Width,@Height,@Temp
617
618
invoke GetClientRect,hWinMain,addr stRect
619
mov eax,stRect.right
620
sub eax,stRect.left
621
mov @Width,eax
622
mov eax,stRect.bottom
623
sub eax,stRect.top
624
mov @Height,eax
625
626
invoke IsWindowVisible,hStatusBar
627
.if eax
628
invoke MoveWindow,hStatusBar,0,0,0,0,TRUE
629
invoke GetWindowRect,hStatusBar,addr @stRect
630
mov eax,@stRect.bottom
631
sub eax,@stRect.top
632
sub @Height,eax
633
.endif
634
635
invoke IsWindowVisible,hToolbar
636
.if eax
637
invoke SendMessage,hToolbar,TB_AUTOSIZE,0,0
638
invoke GetWindowRect,hToolbar,addr @stRect
639
mov eax,@stRect.bottom
640
sub eax,@stRect.top
641
mov stRect.top,eax
642
sub @Height,eax
643
.endif
644
invoke MoveWindow,hEdit,stRect.left,stRect.top,@Width,@Height,TRUE
645
ret
646
_ReSize endp
647
;********************************************************************
648
_OpenHook proc uses ebx esi edi _hDlg,_uMsg,_wParam,_lParam
649
local @FilePath[MAX_PATH]:BYTE
650
local @hFile,@ReadFileNum
651
local @ReadMem [2046]:BYTE
652
653
mov eax,_uMsg
654
.if eax == WM_NOTIFY
655
mov esi,_lParam
656
assume esi : ptr NMHDR
657
.if [esi].code == CDN_FILEOK
658
.elseif [esi].code == CDN_INITDONE
659
invoke GetParent,_hDlg
660
mov @hDlg,eax
661
invoke GetDlgItem,_hDlg,IDC_PREVIEW
662
mov @hEdit,eax
663
invoke SendMessage,@hEdit,WM_SETTEXT,0,offset szSetText
664
.elseif [esi].code == CDN_SELCHANGE
665
invoke SendMessage,@hDlg,CDM_GETFILEPATH,MAX_PATH,addr @FilePath
666
invoke CreateFile,addr @FilePath,GENERIC_READ,FILE_SHARE_READ,\
667
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
668
mov @hFile,eax
669
.if eax == INVALID_HANDLE_VALUE
670
xor eax,eax
671
ret
672
.endif
673
invoke ReadFile,@hFile,addr @ReadMem,2046,addr @ReadFileNum,NULL
674
invoke SendMessage,@hEdit,WM_SETTEXT,0,addr @ReadMem
675
.endif
676
invoke CloseHandle,@hFile
677
.endif
678
assume esi : nothing,edi : nothing
679
xor eax,eax
680
ret
681
_OpenHook endp
682
;********************************************************************
683
_OpenFile proc uses ebx esi edi
684
local stOpenFile:OPENFILENAME
685
686
.if hFile
687
invoke CloseHandle,hFile
688
.endif
689
invoke RtlZeroMemory,addr stOpenFile,sizeof OPENFILENAME
690
mov stOpenFile.lStructSize,sizeof OPENFILENAME
691
push hWinMain
692
pop stOpenFile.hwndOwner
693
mov stOpenFile.Flags,OFN_ENABLESIZING or OFN_FILEMUSTEXIST or \
694
OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or \
695
OFN_EXPLORER or OFN_ENABLETEMPLATE or OFN_ENABLEHOOK
696
push hInstance
697
pop stOpenFile.hInstance
698
mov stOpenFile.lpTemplateName,DLG_MAIN
699
mov stOpenFile.lpfnHook,offset _OpenHook
700
mov stOpenFile.lpstrFilter,offset szFilter
701
mov stOpenFile.nMaxFile,MAX_PATH
702
mov stOpenFile.lpstrFile,offset szFileName
703
invoke GetOpenFileName,addr stOpenFile
704
.if eax
705
_IsJpAddress equ THIS byte
706
invoke CreateFile,offset szFileName,GENERIC_READ or GENERIC_WRITE,\
707
FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
708
.if eax == INVALID_HANDLE_VALUE
709
invoke GetLastError
710
.if eax
711
invoke wsprintf,offset lpBuff1,offset ceshi,eax
712
invoke MessageBox,NULL,offset lpBuff1,offset lpBuff1,MB_OK
713
.endif
714
jmp @f
715
.endif
716
mov hFile,eax
717
.if hFile
718
invoke SetWindowText,hWinMain,offset szFileName
719
.endif
720
invoke GetFileSize,hFile,addr @dwHighSize
721
add eax,4
722
mov @dwLowSize,eax
723
invoke VirtualAlloc,NULL,@dwLowSize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE
724
.if eax
725
mov lpVirtualMem,eax
726
.endif
727
invoke _pfnCall,0,lpVirtualMem,@dwLowSize,offset lpNumByte
728
invoke SetWindowText,hEdit,lpVirtualMem
729
invoke VirtualFree,lpVirtualMem,0,MEM_DECOMMIT or MEM_RESERVE
730
invoke CloseHandle,hFile
731
.endif
732
@@: .if _JFlag
733
mov _JFlag,0
734
jmp near ptr _6
735
.else
736
ret
737
.endif
738
739
_OpenFile endp
740
;********************************************************************
741
_SaveFile proc uses ebx esi edi
742
local stOF : OPENFILENAME
743
local dwSize
744
745
.if szFileName
746
jmp _CreateFile
747
.endif
748
invoke RtlZeroMemory,addr stOF,sizeof OPENFILENAME
749
push hWinMain
750
pop stOF.hwndOwner
751
mov stOF.lStructSize,sizeof OPENFILENAME
752
mov stOF.lpstrFilter,offset szFilter
753
mov stOF.lpstrFile,offset szFileName
754
mov stOF.nMaxFile,MAX_PATH
755
mov stOF.lpstrTitle,offset szSaveDialog
756
mov stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
757
invoke GetSaveFileName,addr stOF
758
.if eax
759
_CreateFile: invoke CreateFile,offset szFileName,GENERIC_READ or GENERIC_WRITE,NULL,\
760
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
761
.if eax == INVALID_HANDLE_VALUE
762
jmp @f
763
.endif
764
mov hFile,eax
765
invoke GetWindowTextLength,hEdit
766
inc eax
767
mov dwSize,eax
768
invoke GetProcessHeap
769
.if eax && (eax < 0C0000000H)
770
mov hHeap,eax
771
.endif
772
invoke HeapAlloc,hHeap,HEAP_GENERATE_EXCEPTIONS or HEAP_NO_SERIALIZE or\
773
HEAP_ZERO_MEMORY,dwSize
774
.if eax && (eax < 0c0000000h)
775
mov lpHeap,eax
776
.endif
777
pop ecx
778
invoke GetWindowText,hEdit,lpHeap,dwSize
779
invoke _pfnCall,1,lpHeap,dwSize,offset lpNumByte
780
invoke CloseHandle,hFile
781
invoke HeapFree,hHeap,NULL,lpHeap
782
invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0
783
.endif
784
@@: ret
785
_SaveFile endp
786
;********************************************************************
787
_WndProc proc uses ebx esi edi hWnd,uMsg,wParam,lParam
788
local @lpCL
789
local @stPt:PAINTSTRUCT
790
local stRt:RECT
791
local @stRange:CHARRANGE
792
local @stTime:SYSTEMTIME
793
local @wHour,@wMinute,@wYear,@wMonth,@wDay
794
795
mov eax,uMsg
796
.if eax == WM_CLOSE
797
call _CheckModify
798
.if (eax == 1) || (eax == 0) || (eax == -1)
799
invoke DestroyWindow,hWinMain
800
invoke PostQuitMessage,NULL
801
invoke ChangeClipboardChain,hWinMain,hClipboard
802
.endif
803
.elseif eax == WM_CREATE
804
mov eax,hWnd
805
mov hWinMain,eax
806
mov stFr.hwndOwner,eax
807
push hInstance
808
pop stFr.hInstance
809
invoke RegisterWindowMessage,addr FINDMSGSTR
810
mov FrId,eax
811
invoke _MadeApplication
812
call _ReSize
813
invoke SetWindowLong,hEdit,GWL_WNDPROC,offset EditWndProc
814
mov oldEditProc,eax
815
.elseif eax == WM_PAINT
816
invoke BeginPaint,hWnd,addr @stPt
817
invoke EndPaint,hWnd,addr @stPt
818
.elseif eax == WM_COMMAND
819
mov eax,wParam
820
.if ax == IDM_OPEN
821
call _CheckModify
822
cmp eax,-1
823
jz @f
824
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
825
.if !eax
826
@@: call _OpenFile
827
.endif
828
.elseif ax == IDM_NEW
829
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
830
.if eax
831
invoke wsprintf,offset lpBuff0,offset szSaveYesOrNo,offset szFileName
832
invoke MessageBox,hWinMain,offset lpBuff0,offset szCaption,MB_YESNOCANCEL
833
.if eax == IDYES
834
call _SaveFile
835
.elseif eax == IDCANCEL
836
jmp @f
837
.endif
838
.endif
839
invoke SetWindowText,hWinMain,offset szNotCaption
840
invoke SendMessage,hEdit,EM_SETSEL,0,-1
841
invoke SendMessage,hEdit,WM_CLEAR,0,0
842
.if hFile
843
invoke CloseHandle,hFile
844
invoke RtlZeroMemory,offset szFileName,sizeof szFileName
845
.endif
846
invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0
847
invoke _SetState
848
@@:
849
.elseif ax == IDM_SAVE
850
call _SaveFile
851
call _SetState
852
.elseif ax == IDM_SAVE_AS
853
mov szFileName,0
854
call _SaveFile
855
call _SetState
856
.elseif ax == IDM_EXIT
857
invoke SendMessage,hWnd,WM_CLOSE,0,0
858
.elseif ax == IDM_TIME_DATE
859
invoke GetLocalTime,addr @stTime
860
movzx eax,@stTime.wHour
861
mov @wHour,eax
862
movzx eax,@stTime.wMinute
863
mov @wMinute,eax
864
movzx eax,@stTime.wYear
865
mov @wYear,eax
866
movzx eax,@stTime.wMonth
867
mov @wMonth,eax
868
movzx eax,@stTime.wDay
869
mov @wDay,eax
870
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1
871
invoke wsprintf,offset lpBuff1,offset szTime,@wHour,@wMinute,@wYear,@wMonth,@wDay
872
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset lpBuff1
873
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1
874
.elseif ax == IDM_STATUS_BAR
875
invoke GetMenuState,hMenu,IDM_STATUS_BAR,MF_BYCOMMAND
876
.if eax & MF_CHECKED
877
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_UNCHECKED
878
invoke ShowWindow,hStatusBar,SW_HIDE
879
.else
880
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_CHECKED
881
invoke ShowWindow,hStatusBar,SW_SHOWNORMAL
882
.endif
883
call _ReSize
884
.elseif ax == IDM_CHECK_ALL
885
invoke SendMessage,hEdit,EM_SETSEL,0,-1
886
.elseif ax == IDM_COPY
887
invoke SendMessage,hEdit,WM_COPY,0,0
888
.elseif ax == IDM_CUT
889
invoke SendMessage,hEdit,WM_CUT,0,0
890
.elseif ax == IDM_PASTE
891
invoke SendMessage,hEdit,WM_PASTE,0,0
892
.elseif ax == IDM_UNDO
893
invoke SendMessage,hEdit,EM_UNDO,0,0
894
.elseif ax == IDM_DEL
895
invoke SendMessage,hEdit,WM_CLEAR,0,0
896
.elseif ax == IDM_FIND
897
and stFr.Flags,not FR_DIALOGTERM
898
invoke FindText,addr stFr
899
.if eax
900
mov hFind,eax
901
.endif
902
.elseif ax == IDM_FIND_NEXT
903
.if stFr.Flags & FR_DOWN
904
or stFr.Flags,FR_DOWN
905
invoke _FindReplace
906
.else
907
and stFr.Flags,not FR_DOWN
908
invoke _FindReplace2
909
.endif
910
.elseif ax == IDM_REPLACE
911
and stFr.Flags,not FR_DIALOGTERM
912
invoke ReplaceText,offset stFr
913
.if eax
914
mov hReplace,eax
915
.endif
916
.elseif ax == IDM_TOOL_BAR
917
invoke GetMenuState,hMenu,IDM_TOOL_BAR,MF_BYCOMMAND
918
.if eax & MF_CHECKED
919
invoke CheckMenuItem,hMenu,IDM_TOOL_BAR,MF_UNCHECKED
920
invoke ShowWindow,hToolbar,SW_HIDE
921
.else
922
invoke CheckMenuItem,hMenu,IDM_TOOL_BAR,MF_CHECKED
923
invoke ShowWindow,hToolbar,SW_SHOWNORMAL
924
.endif
925
call _ReSize
926
.elseif ax == IDM_GOTO
927
invoke CreateDialogParam,hInstance,DLG_GOTO,hWinMain,offset Dlg_Proc,NULL
928
mov hDlg,eax
929
invoke SendDlgItemMessage,hDlg,IDC_RICHEDIT,EM_LIMITTEXT,12,0
930
.elseif ax == IDM_PAGE_SETUP
931
call _PageSetup
932
.elseif ax == IDM_PRINT
933
call _PrintDc
934
.elseif ax == IDM_FONT
935
invoke _ChooseFont
936
.elseif ax == IDM_ABOUT_NOTEPAD
937
invoke ShellAbout,hWinMain,offset szAbout1,offset szAbout2,hIcon
938
.elseif ax == IDM_HELP
939
invoke MessageBox,hWinMain,offset szHelp,offset chengong,MB_OK
940
.elseif ax == IDM_LINE_WRAP
941
invoke GetMenuState,hMenu,IDM_LINE_WRAP,MF_BYCOMMAND
942
.if eax & MF_CHECKED
943
invoke EnableMenuItem,hMenu,IDM_STATUS_BAR,MF_ENABLED
944
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_CHECKED
945
invoke ShowWindow,hStatusBar,SW_SHOWNORMAL
946
invoke CheckMenuItem,hMenu,IDM_LINE_WRAP,MF_UNCHECKED
947
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
948
.if eax
949
mov _flag,1
950
.endif
951
invoke GetWindowTextLength,hEdit
952
inc eax
953
push eax
954
invoke GlobalAlloc,GPTR,eax
955
mov _lpMem,eax
956
pop ecx
957
invoke GetWindowText,hEdit,_lpMem,ecx
958
invoke GetClientRect,hWinMain,addr stRt
959
invoke DestroyWindow,hEdit
960
invoke CreateWindowEx,0,offset szClass,NULL,\
961
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN\
962
OR WS_VSCROLL or ES_NOHIDESEL or ES_AUTOHSCROLL or WS_HSCROLL,\
963
stRt.left,stRt.top,stRt.right,stRt.bottom,hWinMain,ID_EDIT,hInstance,NULL
964
mov hEdit,eax
965
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0
966
invoke SetWindowText,hEdit,_lpMem
967
invoke GlobalFree,_lpMem
968
.if _flag
969
invoke SendMessage,hEdit,EM_SETMODIFY,TRUE,0
970
mov _flag,0
971
.endif
972
invoke SetFocus,hEdit
973
invoke _SetFont
974
.else
975
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_UNCHECKED
976
invoke EnableMenuItem,hMenu,IDM_STATUS_BAR,MF_GRAYED
977
invoke ShowWindow,hStatusBar,SW_HIDE
978
invoke CheckMenuItem,hMenu,IDM_LINE_WRAP,MF_CHECKED
979
invoke SendMessage,hEdit,EM_GETMODIFY,0,0
980
.if eax
981
mov _flag,1
982
.endif
983
invoke GetWindowTextLength,hEdit
984
inc eax
985
push eax
986
invoke GlobalAlloc,GPTR,eax
987
mov _lpMem,eax
988
pop ecx
989
invoke GetWindowText,hEdit,_lpMem,ecx
990
invoke GetClientRect,hWinMain,addr stRt
991
invoke DestroyWindow,hEdit
992
invoke CreateWindowEx,0,offset szClass,NULL,\
993
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN\
994
OR WS_VSCROLL or ES_NOHIDESEL,\
995
stRt.left,stRt.top,stRt.right,stRt.bottom,hWinMain,ID_EDIT,hInstance,NULL
996
mov hEdit,eax
997
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0
998
invoke SetWindowText,hEdit,_lpMem
999
invoke GlobalFree,_lpMem
1000
.if _flag
1001
invoke SendMessage,hEdit,EM_SETMODIFY,TRUE,0
1002
mov _flag,0
1003
.endif
1004
invoke SetFocus,hEdit
1005
invoke _SetFont
1006
.endif
1007
call _ReSize
1008
.elseif ax == ID_EDIT
1009
call _SetState
1010
.endif
1011
.elseif eax == WM_SIZE
1012
call _ReSize
1013
.elseif eax == WM_MENUSELECT
1014
invoke MenuHelp,WM_MENUSELECT,wParam,lParam,lParam,hInstance,hStatusBar,offset szMenuHelp
1015
.elseif eax == FrId
1016
.if stFr.Flags & FR_DIALOGTERM
1017
mov hFind,0
1018
.elseif stFr.Flags & FR_REPLACE
1019
.if stFr.Flags & FR_DOWN
1020
invoke _FindReplace
1021
.else
1022
invoke _FindReplace2
1023
.endif
1024
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax
1025
mov eax,@stRange.cpMin
1026
.if eax != @stRange.cpMax
1027
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset szReplaceText
1028
.endif
1029
.elseif stFr.Flags & FR_REPLACEALL
1030
.while TRUE
1031
1032
.if stFr.Flags & FR_DOWN
1033
or stFr.Flags,FR_DOWN
1034
invoke _FindReplace
1035
.else
1036
and stFr.Flags,not FR_DOWN
1037
invoke _FindReplace2
1038
.endif
1039
.break .if eax == 0
1040
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax
1041
mov eax,@stRange.cpMin
1042
.if eax != @stRange.cpMax
1043
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset szReplaceText
1044
.endif
1045
.endw
1046
1047
.elseif stFr.Flags & FR_DOWN
1048
or stFr.Flags,FR_DOWN
1049
invoke _FindReplace
1050
invoke SendMessage,hEdit,EM_SCROLLCARET,0,0
1051
.else
1052
and stFr.Flags,not FR_DOWN
1053
invoke _FindReplace2
1054
invoke SendMessage,hEdit,EM_SCROLLCARET,0,0
1055
.endif
1056
.elseif eax == WM_INITMENU
1057
call _SetState
1058
.elseif eax == WM_ACTIVATE
1059
mov eax,wParam
1060
.if (ax == WA_ACTIVE) || (ax == WA_CLICKACTIVE)
1061
invoke SetFocus,hEdit
1062
invoke SendMessage,hEdit,EM_SCROLLCARET,0,0
1063
.endif
1064
.elseif eax == WM_NOTIFY
1065
mov ebx,lParam
1066
.if [ebx+NMHDR.code] == TTN_NEEDTEXT
1067
assume ebx : ptr TOOLTIPTEXT
1068
mov eax,[ebx].hdr.idFrom
1069
mov [ebx].lpszText,eax
1070
push hInstance
1071
pop [ebx].hInst
1072
assume ebx : nothing
1073
.endif
1074
.elseif eax == WM_DRAWCLIPBOARD
1075
invoke IsClipboardFormatAvailable,CF_TEXT
1076
.if eax
1077
invoke EnableMenuItem,hMenu,IDM_PASTE,MF_ENABLED
1078
.else
1079
invoke EnableMenuItem,hMenu,IDM_PASTE,MF_GRAYED
1080
.endif
1081
.else
1082
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
1083
ret
1084
.endif
1085
xor eax,eax
1086
_OEN: ret
1087
_WndProc endp
1088
;********************************************************************
1089
_WinMain proc
1090
local stWndClass:WNDCLASSEX
1091
local stMsg:MSG
1092
local @hAccelerators
1093
1094
invoke InitCommonControls
1095
invoke GetModuleHandle,NULL
1096
mov hInstance,eax
1097
invoke LoadMenu,hInstance,IDM_MAIN
1098
mov hMenu,eax
1099
invoke LoadAccelerators,hInstance,IDA_MAIN
1100
mov @hAccelerators,eax
1101
invoke RtlZeroMemory,addr stWndClass,sizeof WNDCLASSEX
1102
push hInstance
1103
pop stWndClass.hInstance
1104
invoke LoadIcon,hInstance,IDC_MAIN
1105
mov hIcon,eax
1106
mov stWndClass.hIcon,eax
1107
mov stWndClass.hIconSm,eax
1108
invoke LoadCursor,0,IDC_ARROW
1109
mov stWndClass.hCursor,eax
1110
mov stWndClass.cbSize,sizeof WNDCLASSEX
1111
mov stWndClass.lpfnWndProc,offset _WndProc
1112
mov stWndClass.lpszClassName,offset szClassName
1113
mov stWndClass.style,CS_HREDRAW or CS_VREDRAW
1114
mov stWndClass.hbrBackground,COLOR_BTNFACE+1
1115
invoke RegisterClassEx,addr stWndClass
1116
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaption,\
1117
WS_OVERLAPPEDWINDOW,100,80,600,\
1118
400,NULL,hMenu,hInstance,NULL
1119
.if eax
1120
mov hWinMain,eax
1121
.else
1122
ret
1123
.endif
1124
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
1125
invoke UpdateWindow,hWinMain
1126
.while TRUE
1127
invoke GetMessage,addr stMsg,NULL,0,0
1128
.break .if eax == 0
1129
invoke TranslateAccelerator,hWinMain,@hAccelerators,addr stMsg
1130
.if eax == 0
1131
invoke TranslateMessage,addr stMsg
1132
invoke DispatchMessage,addr stMsg
1133
.endif
1134
.endw
1135
ret
1136
_WinMain endp
1137
;********************************************************************
1138
start: call _WinMain
1139
invoke ExitProcess,NULL
1140
end start
1141
;********************************************************************2
; 用下列命令进行编译和链接:3
; ml /c /coff win322-1.asm4
; rc win322-1.rc5
; link /subsystem:windows win322-1.obj win322-1.res6
;********************************************************************7
; 使用各种资源----记事本程序的编写8
;==================================================9
.48610
.model flat,stdcall11
option casemap : none12
;********************************************************************13
;include=============================================14
include windows.inc15
include kernel32.inc16
includelib kernel32.lib17
include user32.inc18
includelib user32.lib19
include comdlg32.inc20
includelib comdlg32.lib21
include comctl32.inc22
includelib comctl32.lib23
include gdi32.inc24
includelib gdi32.lib25
include shell32.inc26
includelib shell32.lib27
;********************************************************************28
CDN_FILEOK equ CDN_FIRST-0005h29
CDN_INITDONE equ CDN_FIRST - 030
CDN_SELCHANGE equ CDN_FIRST - 131
OFN_ENABLESIZING equ 00800000h32
IDM_MENUHELP1 equ 70033
IDM_MENUHELP2 equ 70134
IDM_MENUHELP3 equ 70235
IDM_MENUHELP4 equ 70336
IDM_MENUHELP5 equ 70437
IDM_MENUHELP6 equ 70538

39
IDC_MAIN equ 10040
IDM_MAIN equ 20041
IDA_MAIN equ 30042
DLG_MAIN equ 40043
DLG_GOTO equ 100044
IDC_RICHEDIT equ 101045
IDM_NEW equ 10146
IDM_OPEN equ 10247
IDM_SAVE equ 10348
IDM_SAVE_AS equ 10449
IDM_PAGE_SETUP equ 10550
IDM_PRINT equ 10651
IDM_EXIT equ 10752
IDM_UNDO equ 10853
IDM_CUT equ 10954
IDM_COPY equ 11055
IDM_PASTE equ 11156
IDM_DEL equ 11257
IDM_FIND equ 11358
IDM_FIND_NEXT equ 11459
IDM_REPLACE equ 11560
IDM_GOTO equ 11661
IDM_CHECK_ALL equ 11762
IDM_TIME_DATE equ 11863
IDM_LINE_WRAP equ 11964
IDM_FONT equ 12065
IDM_STATUS_BAR equ 12166
IDM_HELP equ 12267
IDM_ABOUT_NOTEPAD equ 12368
IDM_TOOL_BAR equ 12469
ID_EDIT equ 50070
IDC_PREVIEW equ 60071
ID_STATUSBAR equ 80072
ID_TOOLBAR equ 90073
ID_OK equ 20174
ID_CANCEL equ 20275
;******************************************************************76
OFNOTIFYEX struct77
hdr NMHDR <>78
lpOpenFileName OPENFILENAME <>79
lpsf dword ?80
lpIdItem dword ?81
OFNOTIFYEX ends82
;********************************************************************83
.data?84
hInstance dd ?85
hWinMain dd ?86
hMenu dd ?87
hEdit dd ?88
hEdit2 dd ?89
hIcon dd ?90
SetPaste dd ?91
@hDlg dd ?92
@hEdit dd ?93
hClipboard dd ?94
lpOldProc dd ?95
_lpMem dd ?96
_flag db ?97
_JFlag dd ?98
hFile dd ?99
hHeap dd ?100
hHeap2 dd ?101
lpHeap dd ?102
lpPrintBuffer dd ?103
lpNumByte dd ?104
lpVirtualMem dd ?105
FrId dd ?106
hFind dd ?107
lpFindMem dd ?108
dwFindNext dd ?109
hReplace dd ?110
hStatusBar dd ?111
hToolbar dd ?112
oldEditProc dd ?113
hDlg dd ?114
hDc dd ?115
hFont dd ?116
@dwHighSize dd ?117
@dwLowSize dd ?118
szPrinter dd MAX_PATH dup (?)119
szFileName dd MAX_PATH dup (?)120
lpBuff0 dd 1024 dup (?)121
lpBuff1 dd 1024 dup (?)122
szFindText dd MAX_PATH dup (?)123
szReplaceText dd MAX_PATH dup (?)124
logfont LOGFONT <?>125
.data126
stFr FINDREPLACE <sizeof FINDREPLACE,0,0,FR_DOWN or FR_HIDEWHOLEWORD,szFindText,szReplaceText,sizeof szFindText,sizeof szReplaceText,0,0,0>127
stButton equ this byte128
TBBUTTON <STD_FILENEW,IDM_NEW,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>129
TBBUTTON <STD_FILEOPEN,IDM_OPEN,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>130
TBBUTTON <STD_FILESAVE,IDM_SAVE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>131
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>132
TBBUTTON <STD_PRINT,IDM_PRINT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>133
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>134
TBBUTTON <STD_COPY,IDM_COPY,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>135
TBBUTTON <STD_CUT,IDM_CUT,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>136
TBBUTTON <STD_PASTE,IDM_PASTE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>137
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>138
TBBUTTON <STD_FIND,IDM_FIND,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1> 139
TBBUTTON <STD_REPLACE,IDM_REPLACE,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>140
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>141
TBBUTTON <STD_HELP,IDM_HELP,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0,-1>142
TBBUTTON <0,0,TBSTATE_ENABLED,TBSTYLE_SEP,0,0,-1>143
.const144

145
szClassName db "MYNotepad",0146
szDefCaption db "无标题",0147
szCaption db "记事本",0148
szNotCaption db "无标题",0149
szFilter db "文本文档案(*.txt)",0,"*.txt",0,"ASM文档(*.asm)",0,"*.asm",0,"ALL FILE(*.*)",0,"*.*",0,0150
szSaveYesOrNo db "你的文件%s已经修改过,是否保存文档?",0151
szDefExt db "txt",0152
szSaveDialog db "保存",0153
szSaveAs db "另存为",0154
szClass db "EDIT",0155
szErrPerson db "错误",0156
StatusBarCount dd 400,-1157
szSetText db "请选择文件进行预览",0158
szExisting db "文件 %s 已经存在,确定要覆盖它吗?",0159
szLnCol db "Ln %d,Col%d",0160
FINDMSGSTR db "commdlg_FindReplace",0161
szMenuHelp dd 0,IDM_MENUHELP1,0,0 162
ceshistr db "%s",0163
ceshi db "%d",0164
chengong db "记事本完成了,谢谢使用",0165
szTextOut db "指定行超出控件文本行数",0166
szNotFound db "找不到%s",0167
szTime db "%d:%02d %04d-%02d-%02d",0168
szAbout1 db "模拟记事本程序",0169
szAbout2 db "kiki-------梁越洋",0170
szFont db "宋体",0171
szApi db "该功能还在修改中,暂不提供",0172
szHelp db "怎么不会用要看帮助文件?不会吧!!都说模拟记事本拉,肯定是象记事本那样子使用拉:-)",0173
;********************************************************************174
.code175
;********************************************************************176
_SetFont proc uses ebx esi edi177

178
invoke CreateFont,logfont.lfHeight,logfont.lfWidth,logfont.lfEscapement,\179
logfont.lfOrientation,logfont.lfWeight,dword ptr logfont.lfItalic,\180
dword ptr logfont.lfUnderline,dword ptr logfont.lfStrikeOut,\181
dword ptr logfont.lfCharSet,dword ptr logfont.lfOutPrecision,\182
dword ptr logfont.lfClipPrecision,dword ptr logfont.lfQuality,\183
dword ptr logfont.lfPitchAndFamily,offset logfont.lfFaceName184
.if eax185
mov hFont,eax186
invoke SendMessage,hEdit,WM_SETFONT,hFont,TRUE187
.endif 188
ret189
_SetFont endp190
;********************************************************************191
_ChooseFont proc uses ebx esi edi192
local @stCF:CHOOSEFONT193

194
invoke RtlZeroMemory,addr @stCF,sizeof CHOOSEFONT195
mov @stCF.lStructSize,sizeof CHOOSEFONT196
push hInstance197
pop @stCF.hInstance198
push hWinMain199
pop @stCF.hWndOwner200
mov @stCF.lpLogFont,offset logfont201
mov @stCF.Flags,CF_NOOEMFONTS or CF_SCREENFONTS or CF_INITTOLOGFONTSTRUCT or CF_TTONLY202
invoke ChooseFont,addr @stCF203
.if eax204
mov eax,@stCF.iPointSize205
shl eax,1206
invoke _SetFont207
.endif208
ret209
_ChooseFont endp210
;********************************************************************211
Dlg_Proc proc uses ebx esi edi _hDlg,_uMsg,_wParam,_lParam212
local @hDlgEdit213
local @szDlgCount214

215
mov eax,_uMsg216
.if eax == WM_CLOSE217
invoke DestroyWindow,_hDlg218
.elseif eax == WM_COMMAND219
mov eax,_wParam220
.if ax == ID_OK221
invoke GetDlgItemInt,_hDlg,IDC_RICHEDIT,0,0222
push eax223
invoke GetDlgItem,_hDlg,IDC_RICHEDIT224
invoke SendMessage,hEdit,EM_GETLINECOUNT,0,0225
pop ecx226
.if ecx > eax227
invoke MessageBox,0,offset szTextOut,0,MB_OK228
.else229
mov eax,ecx230
dec eax231
invoke SendMessage,hEdit,EM_LINEINDEX,eax,0232
invoke SendMessage,hEdit,EM_SETSEL,eax,eax233
invoke SendMessage,hEdit,EM_SCROLLCARET,0,0234
invoke SendMessage,_hDlg,WM_CLOSE,0,0235
.endif236
.elseif ax == ID_CANCEL237
invoke SendMessage,_hDlg,WM_CLOSE,0,0238
.endif239
.else240
mov eax,FALSE241
ret242
.endif243
mov eax,TRUE244
ret245
Dlg_Proc endp246
;********************************************************************247
EditWndProc proc _hWnd,_uMsg,_wParam,_lParam248

249
mov eax,_uMsg250
.if (eax == WM_KEYDOWN) || (eax == WM_KEYUP)251
call _SetState252
.elseif eax == WM_LBUTTONDOWN || eax == WM_LBUTTONUP253
call _SetState254
.endif255
invoke CallWindowProc,oldEditProc,_hWnd,_uMsg,_wParam,_lParam256
ret257
EditWndProc endp258
;********************************************************************259
_TestSf proc uses ebx esi edi _address,_count,_address2260

261
mov ecx,_count262
mov esi,_address263
mov edi,_address2264
.repeat265
mov al,byte ptr [esi]266
.if al >="A" && al <= "Z"267
add al,20h268
.endif269
mov bl,byte ptr [edi]270
.if bl >="A" && bl <= "Z"271
add bl,20h272
.endif273
dec ecx274
inc esi275
inc edi276
sub al,bl277
.break .if al != 0278
.until ecx == 0279
.if !ecx && ZERO?280
mov eax,TRUE281
jmp @f282
.endif283
mov eax,FALSE284
@@: 285
and stFr.Flags,not FR_MATCHCASE286
ret287
_TestSf endp288
;********************************************************************289
_FindReplace proc uses ebx esi edi290
local @stRange:CHARRANGE291
local @LowSize,@HighSize,@Flags,@dwReturn292
293
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax294
mov eax,@stRange.cpMax295
mov @stRange.cpMin,eax296
invoke GetWindowTextLength,hEdit297
inc eax298
mov @HighSize,eax299
invoke VirtualAlloc,NULL,eax,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE300
mov lpFindMem,eax301
invoke GetWindowText,hEdit,lpFindMem,@HighSize302
invoke lstrlen,offset szFindText303
inc eax304
mov @LowSize,eax305
mov ebx,@stRange.cpMin306
mov @Flags,ebx307
@@:308
push ebx309
invoke GetWindowTextLength,hEdit310
cmp eax,0311
jz _NotF312
pop ebx313
add ebx,lpFindMem314
mov esi,ebx315
mov edi,offset szFindText316
.if !(stFr.Flags & FR_MATCHCASE)317
invoke _TestSf,esi,@LowSize,edi318
.if eax319
jmp @f320
.endif321
.endif322
cld323
mov ecx,@LowSize324
repe cmpsb325
.if ecx == 0 && ZERO?326
jmp @f327
.else328
inc @Flags329
mov ebx,@Flags330
mov edx,@HighSize331
sub edx,@LowSize332
.if ebx <= edx333
jmp @b334
.else335
jmp _NotF336
.endif337
.endif338
@@: mov edx,@Flags339
add edx,@LowSize340
dec edx341
invoke SendMessage,hEdit,EM_SETSEL,@Flags,edx342
mov @dwReturn,1343
jmp _End344
_NotF: invoke wsprintf,offset lpBuff1,offset szNotFound,offset szFindText345
invoke MessageBox,hWinMain,offset lpBuff1,offset szCaption,MB_OK346
mov @dwReturn,0347
_End: invoke VirtualFree,lpFindMem,0,MEM_DECOMMIT or MEM_RELEASE348
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1349
mov lpFindMem,0350
mov dwFindNext,-1351
mov eax,@dwReturn352
ret353
_FindReplace endp354
;********************************************************************355
_FindReplace2 proc uses ebx esi edi356
local @LowSize,@HighSize,@Flags,@dwReturn357
local @stRange:CHARRANGE358

359
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax360
mov eax,@stRange.cpMin361
mov @stRange.cpMax,eax362
invoke GetWindowTextLength,hEdit363
inc eax364
mov @HighSize,eax365
invoke VirtualAlloc,NULL,eax,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE366
mov lpFindMem,eax367
invoke GetWindowText,hEdit,lpFindMem,@HighSize368
invoke lstrlen,offset szFindText369
inc eax370
mov @LowSize,eax371
mov ebx,@stRange.cpMax372
sub ebx,@LowSize373
inc ebx374
mov @Flags,ebx375
@@: 376
cmp ebx,-1377
jle _Err378
add ebx,lpFindMem379
mov esi,ebx380
mov edi,offset szFindText381
.if !(stFr.Flags & FR_MATCHCASE)382
invoke _TestSf,esi,@LowSize,edi383
.if eax384
jmp @f385
.endif386
.endif387
cld388
mov ecx,@LowSize389
repe cmpsb390
.if (ecx == 0) && ZERO?391
jmp @f392
.else393
dec @Flags394
mov ebx,@Flags395
.if ebx >= 0396
jmp @b397
.endif398
jmp _Err399
.endif400
@@: 401
mov edx,@Flags402
add edx,@LowSize403
dec edx404
invoke SendMessage,hEdit,EM_SETSEL,@Flags,edx405
mov @dwReturn,1406
jmp _Ex407
_Err: invoke wsprintf,offset lpBuff1,offset szNotFound,offset szFindText408
invoke MessageBox,hWinMain,offset lpBuff1,offset szCaption,MB_OK409
mov @dwReturn,0410
_Ex: 411
invoke VirtualFree,lpFindMem,0,MEM_DECOMMIT or MEM_RELEASE412
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1413
mov lpFindMem,0414
mov dwFindNext,-1415
mov eax,@dwReturn416
ret417
_FindReplace2 endp418
;********************************************************************419
_pfnCall proc uses ebx esi edi _dwCookie,_HeapMem,_dwNumByte,_lpNumByte420

421
.if _dwCookie422
invoke WriteFile,hFile,_HeapMem,_dwNumByte,_lpNumByte,0423
.else424
invoke ReadFile,hFile,_HeapMem,_dwNumByte,_lpNumByte,0425
.endif426
ret427
_pfnCall endp428
;********************************************************************429
_CheckModify proc uses ebx esi edi430
431
invoke SendMessage,hEdit,EM_GETMODIFY,0,0432
.if eax433
invoke wsprintf,offset lpBuff0,offset szSaveYesOrNo,offset szFileName434
invoke MessageBox,hWinMain,offset lpBuff0,offset szCaption,MB_YESNOCANCEL435
.if eax == IDYES436
call _SaveFile437
mov eax,1438
.elseif eax == IDNO439
mov eax,-1440
.endif441
.else442
mov eax,0443
.endif444
ret445
_CheckModify endp446
;********************************************************************447
_PageSetup proc uses ebx esi edi448
local @stPage : PAGESETUPDLG449

450
invoke RtlZeroMemory,addr @stPage,sizeof @stPage451
mov @stPage.lStructSize,sizeof PAGESETUPDLG452
push hWinMain453
pop @stPage.hwndOwner454
invoke PageSetupDlg,addr @stPage455
.if eax && @stPage.hDevMode456
mov eax,@stPage.hDevMode457
mov eax,[eax]458
invoke wsprintf,offset szPrinter,offset ceshistr,eax459
.endif460
ret461
_PageSetup endp462
;********************************************************************463
_PrintDc proc uses ebx esi edi464
local @PrintSize465
local @Doc : DOCINFO466

467
invoke CreateDC,NULL,offset szPrinter,NULL,NULL468
mov hDc,eax469
.if hDc470
.if szPrinter471
invoke GetWindowTextLength,hEdit472
inc eax473
mov @PrintSize,eax474
invoke GetProcessHeap475
.if eax && (eax < 0C0000000H)476
mov hHeap2,eax477
.endif478
invoke HeapAlloc,hHeap2,HEAP_GENERATE_EXCEPTIONS or HEAP_NO_SERIALIZE or\479
HEAP_ZERO_MEMORY,@PrintSize480
.if eax && (eax < 0c0000000h)481
mov lpPrintBuffer,eax482
.endif483
invoke GetWindowText,hEdit,lpPrintBuffer,@PrintSize484
invoke StartDoc,hDc,NULL485
invoke StartPage,hDc486
invoke TextOut,hDc,10,10,lpPrintBuffer,@PrintSize487
invoke EndPage,hDc488
invoke EndDoc,hDc489
invoke HeapFree,hHeap2,NULL,lpPrintBuffer490
invoke RtlZeroMemory,offset szPrinter,sizeof szPrinter491
.endif492
.endif493
ret494
_PrintDc endp495
;********************************************************************496
_MadeApplication proc uses ebx esi edi497

498
invoke CreateWindowEx,0,offset szClass,NULL,\499
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN or WS_DLGFRAME\500
OR WS_VSCROLL or ES_NOHIDESEL or ES_AUTOHSCROLL or WS_HSCROLL,\501
0,0,0,0,hWinMain,ID_EDIT,hInstance,NULL502
mov hEdit,eax503
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0504
invoke CreateFont,-16,0,0,\505
0,FW_THIN,FALSE,\506
FALSE,FALSE,\507
GB2312_CHARSET,OUT_CHARACTER_PRECIS,\508
CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,\509
FF_MODERN,offset szFont510
.if eax511
mov hFont,eax512
invoke SendMessage,hEdit,WM_SETFONT,hFont,TRUE513
.endif 514
invoke SetClipboardViewer,hWinMain515
mov hClipboard,eax516
invoke CreateStatusWindow,SBARS_SIZEGRIP or WS_CHILD or WS_VISIBLE,0,hWinMain,ID_STATUSBAR517
mov hStatusBar,eax518
invoke SendMessage,hStatusBar,SB_SETPARTS,2,offset StatusBarCount519
invoke CreateToolbarEx,hWinMain,TBSTYLE_FLAT or WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS or CCS_ADJUSTABLE,\520
ID_TOOLBAR,0,HINST_COMMCTRL,IDB_STD_SMALL_COLOR,offset stButton,15,0,0,0,0,sizeof TBBUTTON521
mov hToolbar,eax522

523
invoke GetCommandLine524
mov esi,eax525
mov edi,offset szFileName526
_1: lodsb527
_2: 528
cmp al,22H529
jz _5530
_3: or al,al531
jz _4532
cmp al,20h533
jz _1534
mov [edi],al535
inc edi536
lodsb537
cmp al,20h538
jz _4539
jmp _3540
_5: lodsb541
cmp al,22H542
jz _1543
jmp _5544
_4:545

546
.if szFileName547
mov _JFlag,1548
jmp near ptr _IsJpAddress549
.endif550
_6 equ THIS BYTE551
ret552
_MadeApplication endp553
;********************************************************************554
_SetState proc uses ebx esi edi555
local @wParam,@lParam556
local @stRg:CHARRANGE557
local @LineIn,@Length558
local @Buffer559

560
invoke SendMessage,hEdit,EM_GETSEL,addr @stRg.cpMin,addr @stRg.cpMax561
invoke SendMessage,hEdit,EM_LINEFROMCHAR,-1,0562
mov @LineIn,eax563
invoke SendMessage,hEdit,EM_LINEINDEX,eax,0564
mov edx,@stRg.cpMin565
sub edx,eax566
inc edx567
inc @LineIn568
invoke wsprintf,offset lpBuff1,offset szLnCol,edx,@LineIn569
invoke SendMessage,hStatusBar,SB_SETTEXT,1,offset lpBuff1570
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1571

572
mov eax,@stRg.cpMin573
.if eax == @stRg.cpMax574
invoke EnableMenuItem,hMenu,IDM_CUT,MF_GRAYED575
invoke EnableMenuItem,hMenu,IDM_COPY,MF_GRAYED576
invoke EnableMenuItem,hMenu,IDM_DEL,MF_GRAYED577
.if hToolbar578
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_CUT,FALSE579
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_COPY,FALSE580
.endif581
.else582
invoke EnableMenuItem,hMenu,IDM_CUT,MF_ENABLED583
invoke EnableMenuItem,hMenu,IDM_COPY,MF_ENABLED584
invoke EnableMenuItem,hMenu,IDM_DEL,MF_ENABLED585
.if hToolbar586
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_CUT,TRUE587
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_COPY,TRUE588
.endif589
.endif590
invoke SendMessage,hEdit,EM_CANUNDO,0,0591
.if eax592
invoke EnableMenuItem,hMenu,IDM_UNDO,MF_ENABLED593
.else594
invoke EnableMenuItem,hMenu,IDM_UNDO,MF_GRAYED595
.endif596
invoke SendMessage,hEdit,EM_GETMODIFY,0,0597
.if eax598
invoke EnableMenuItem,hMenu,IDM_SAVE,MF_ENABLED599
invoke EnableMenuItem,hMenu,IDM_SAVE_AS,MF_ENABLED600
.if hToolbar601
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_SAVE,TRUE602
.endif603
.else604
invoke EnableMenuItem,hMenu,IDM_SAVE,MF_GRAYED605
invoke EnableMenuItem,hMenu,IDM_SAVE_AS,MF_GRAYED606
.if hToolbar607
invoke SendMessage,hToolbar,TB_ENABLEBUTTON,IDM_SAVE,FALSE608
.endif609
.endif610
ret611
_SetState endp612
;********************************************************************613
_ReSize proc uses ebx esi edi614
local stRect : RECT615
local @stRect : RECT616
local @Width,@Height,@Temp617

618
invoke GetClientRect,hWinMain,addr stRect619
mov eax,stRect.right620
sub eax,stRect.left621
mov @Width,eax622
mov eax,stRect.bottom623
sub eax,stRect.top624
mov @Height,eax625

626
invoke IsWindowVisible,hStatusBar627
.if eax628
invoke MoveWindow,hStatusBar,0,0,0,0,TRUE629
invoke GetWindowRect,hStatusBar,addr @stRect630
mov eax,@stRect.bottom631
sub eax,@stRect.top632
sub @Height,eax633
.endif634

635
invoke IsWindowVisible,hToolbar636
.if eax637
invoke SendMessage,hToolbar,TB_AUTOSIZE,0,0638
invoke GetWindowRect,hToolbar,addr @stRect639
mov eax,@stRect.bottom640
sub eax,@stRect.top641
mov stRect.top,eax642
sub @Height,eax643
.endif644
invoke MoveWindow,hEdit,stRect.left,stRect.top,@Width,@Height,TRUE645
ret646
_ReSize endp647
;********************************************************************648
_OpenHook proc uses ebx esi edi _hDlg,_uMsg,_wParam,_lParam649
local @FilePath[MAX_PATH]:BYTE650
local @hFile,@ReadFileNum651
local @ReadMem [2046]:BYTE652

653
mov eax,_uMsg654
.if eax == WM_NOTIFY655
mov esi,_lParam656
assume esi : ptr NMHDR657
.if [esi].code == CDN_FILEOK658
.elseif [esi].code == CDN_INITDONE659
invoke GetParent,_hDlg660
mov @hDlg,eax661
invoke GetDlgItem,_hDlg,IDC_PREVIEW662
mov @hEdit,eax663
invoke SendMessage,@hEdit,WM_SETTEXT,0,offset szSetText664
.elseif [esi].code == CDN_SELCHANGE665
invoke SendMessage,@hDlg,CDM_GETFILEPATH,MAX_PATH,addr @FilePath666
invoke CreateFile,addr @FilePath,GENERIC_READ,FILE_SHARE_READ,\667
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL668
mov @hFile,eax669
.if eax == INVALID_HANDLE_VALUE670
xor eax,eax671
ret672
.endif673
invoke ReadFile,@hFile,addr @ReadMem,2046,addr @ReadFileNum,NULL674
invoke SendMessage,@hEdit,WM_SETTEXT,0,addr @ReadMem 675
.endif676
invoke CloseHandle,@hFile677
.endif678
assume esi : nothing,edi : nothing679
xor eax,eax680
ret681
_OpenHook endp682
;********************************************************************683
_OpenFile proc uses ebx esi edi684
local stOpenFile:OPENFILENAME685

686
.if hFile687
invoke CloseHandle,hFile688
.endif689
invoke RtlZeroMemory,addr stOpenFile,sizeof OPENFILENAME690
mov stOpenFile.lStructSize,sizeof OPENFILENAME691
push hWinMain692
pop stOpenFile.hwndOwner693
mov stOpenFile.Flags,OFN_ENABLESIZING or OFN_FILEMUSTEXIST or \694
OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or \695
OFN_EXPLORER or OFN_ENABLETEMPLATE or OFN_ENABLEHOOK696
push hInstance697
pop stOpenFile.hInstance698
mov stOpenFile.lpTemplateName,DLG_MAIN699
mov stOpenFile.lpfnHook,offset _OpenHook700
mov stOpenFile.lpstrFilter,offset szFilter701
mov stOpenFile.nMaxFile,MAX_PATH702
mov stOpenFile.lpstrFile,offset szFileName703
invoke GetOpenFileName,addr stOpenFile704
.if eax705
_IsJpAddress equ THIS byte706
invoke CreateFile,offset szFileName,GENERIC_READ or GENERIC_WRITE,\707
FILE_SHARE_READ OR FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL708
.if eax == INVALID_HANDLE_VALUE709
invoke GetLastError710
.if eax711
invoke wsprintf,offset lpBuff1,offset ceshi,eax712
invoke MessageBox,NULL,offset lpBuff1,offset lpBuff1,MB_OK713
.endif714
jmp @f715
.endif716
mov hFile,eax717
.if hFile718
invoke SetWindowText,hWinMain,offset szFileName719
.endif720
invoke GetFileSize,hFile,addr @dwHighSize721
add eax,4722
mov @dwLowSize,eax723
invoke VirtualAlloc,NULL,@dwLowSize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE724
.if eax725
mov lpVirtualMem,eax726
.endif727
invoke _pfnCall,0,lpVirtualMem,@dwLowSize,offset lpNumByte728
invoke SetWindowText,hEdit,lpVirtualMem729
invoke VirtualFree,lpVirtualMem,0,MEM_DECOMMIT or MEM_RESERVE730
invoke CloseHandle,hFile731
.endif732
@@: .if _JFlag733
mov _JFlag,0734
jmp near ptr _6735
.else736
ret737
.endif738

739
_OpenFile endp740
;********************************************************************741
_SaveFile proc uses ebx esi edi742
local stOF : OPENFILENAME743
local dwSize744

745
.if szFileName746
jmp _CreateFile747
.endif748
invoke RtlZeroMemory,addr stOF,sizeof OPENFILENAME749
push hWinMain750
pop stOF.hwndOwner751
mov stOF.lStructSize,sizeof OPENFILENAME752
mov stOF.lpstrFilter,offset szFilter753
mov stOF.lpstrFile,offset szFileName754
mov stOF.nMaxFile,MAX_PATH755
mov stOF.lpstrTitle,offset szSaveDialog756
mov stOF.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST757
invoke GetSaveFileName,addr stOF758
.if eax759
_CreateFile: invoke CreateFile,offset szFileName,GENERIC_READ or GENERIC_WRITE,NULL,\760
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL761
.if eax == INVALID_HANDLE_VALUE762
jmp @f763
.endif764
mov hFile,eax765
invoke GetWindowTextLength,hEdit766
inc eax767
mov dwSize,eax768
invoke GetProcessHeap769
.if eax && (eax < 0C0000000H)770
mov hHeap,eax771
.endif772
invoke HeapAlloc,hHeap,HEAP_GENERATE_EXCEPTIONS or HEAP_NO_SERIALIZE or\773
HEAP_ZERO_MEMORY,dwSize774
.if eax && (eax < 0c0000000h)775
mov lpHeap,eax776
.endif777
pop ecx778
invoke GetWindowText,hEdit,lpHeap,dwSize779
invoke _pfnCall,1,lpHeap,dwSize,offset lpNumByte780
invoke CloseHandle,hFile781
invoke HeapFree,hHeap,NULL,lpHeap782
invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0783
.endif784
@@: ret785
_SaveFile endp786
;********************************************************************787
_WndProc proc uses ebx esi edi hWnd,uMsg,wParam,lParam788
local @lpCL789
local @stPt:PAINTSTRUCT790
local stRt:RECT791
local @stRange:CHARRANGE792
local @stTime:SYSTEMTIME793
local @wHour,@wMinute,@wYear,@wMonth,@wDay794

795
mov eax,uMsg796
.if eax == WM_CLOSE797
call _CheckModify798
.if (eax == 1) || (eax == 0) || (eax == -1)799
invoke DestroyWindow,hWinMain800
invoke PostQuitMessage,NULL801
invoke ChangeClipboardChain,hWinMain,hClipboard802
.endif803
.elseif eax == WM_CREATE804
mov eax,hWnd805
mov hWinMain,eax806
mov stFr.hwndOwner,eax807
push hInstance808
pop stFr.hInstance809
invoke RegisterWindowMessage,addr FINDMSGSTR810
mov FrId,eax811
invoke _MadeApplication812
call _ReSize813
invoke SetWindowLong,hEdit,GWL_WNDPROC,offset EditWndProc814
mov oldEditProc,eax815
.elseif eax == WM_PAINT816
invoke BeginPaint,hWnd,addr @stPt817
invoke EndPaint,hWnd,addr @stPt818
.elseif eax == WM_COMMAND819
mov eax,wParam820
.if ax == IDM_OPEN821
call _CheckModify822
cmp eax,-1823
jz @f824
invoke SendMessage,hEdit,EM_GETMODIFY,0,0825
.if !eax826
@@: call _OpenFile827
.endif828
.elseif ax == IDM_NEW829
invoke SendMessage,hEdit,EM_GETMODIFY,0,0830
.if eax831
invoke wsprintf,offset lpBuff0,offset szSaveYesOrNo,offset szFileName832
invoke MessageBox,hWinMain,offset lpBuff0,offset szCaption,MB_YESNOCANCEL833
.if eax == IDYES834
call _SaveFile835
.elseif eax == IDCANCEL836
jmp @f837
.endif838
.endif839
invoke SetWindowText,hWinMain,offset szNotCaption840
invoke SendMessage,hEdit,EM_SETSEL,0,-1841
invoke SendMessage,hEdit,WM_CLEAR,0,0842
.if hFile843
invoke CloseHandle,hFile844
invoke RtlZeroMemory,offset szFileName,sizeof szFileName845
.endif846
invoke SendMessage,hEdit,EM_SETMODIFY,FALSE,0847
invoke _SetState848
@@:849
.elseif ax == IDM_SAVE850
call _SaveFile851
call _SetState852
.elseif ax == IDM_SAVE_AS853
mov szFileName,0854
call _SaveFile855
call _SetState856
.elseif ax == IDM_EXIT857
invoke SendMessage,hWnd,WM_CLOSE,0,0858
.elseif ax == IDM_TIME_DATE859
invoke GetLocalTime,addr @stTime860
movzx eax,@stTime.wHour861
mov @wHour,eax862
movzx eax,@stTime.wMinute863
mov @wMinute,eax864
movzx eax,@stTime.wYear865
mov @wYear,eax866
movzx eax,@stTime.wMonth867
mov @wMonth,eax868
movzx eax,@stTime.wDay869
mov @wDay,eax870
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1871
invoke wsprintf,offset lpBuff1,offset szTime,@wHour,@wMinute,@wYear,@wMonth,@wDay872
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset lpBuff1873
invoke RtlZeroMemory,offset lpBuff1,sizeof lpBuff1874
.elseif ax == IDM_STATUS_BAR875
invoke GetMenuState,hMenu,IDM_STATUS_BAR,MF_BYCOMMAND876
.if eax & MF_CHECKED877
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_UNCHECKED878
invoke ShowWindow,hStatusBar,SW_HIDE879
.else880
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_CHECKED881
invoke ShowWindow,hStatusBar,SW_SHOWNORMAL882
.endif883
call _ReSize884
.elseif ax == IDM_CHECK_ALL885
invoke SendMessage,hEdit,EM_SETSEL,0,-1886
.elseif ax == IDM_COPY887
invoke SendMessage,hEdit,WM_COPY,0,0888
.elseif ax == IDM_CUT889
invoke SendMessage,hEdit,WM_CUT,0,0890
.elseif ax == IDM_PASTE891
invoke SendMessage,hEdit,WM_PASTE,0,0892
.elseif ax == IDM_UNDO893
invoke SendMessage,hEdit,EM_UNDO,0,0894
.elseif ax == IDM_DEL895
invoke SendMessage,hEdit,WM_CLEAR,0,0896
.elseif ax == IDM_FIND897
and stFr.Flags,not FR_DIALOGTERM898
invoke FindText,addr stFr899
.if eax900
mov hFind,eax901
.endif902
.elseif ax == IDM_FIND_NEXT903
.if stFr.Flags & FR_DOWN904
or stFr.Flags,FR_DOWN905
invoke _FindReplace906
.else907
and stFr.Flags,not FR_DOWN908
invoke _FindReplace2909
.endif910
.elseif ax == IDM_REPLACE911
and stFr.Flags,not FR_DIALOGTERM912
invoke ReplaceText,offset stFr913
.if eax914
mov hReplace,eax915
.endif916
.elseif ax == IDM_TOOL_BAR917
invoke GetMenuState,hMenu,IDM_TOOL_BAR,MF_BYCOMMAND918
.if eax & MF_CHECKED919
invoke CheckMenuItem,hMenu,IDM_TOOL_BAR,MF_UNCHECKED920
invoke ShowWindow,hToolbar,SW_HIDE921
.else922
invoke CheckMenuItem,hMenu,IDM_TOOL_BAR,MF_CHECKED923
invoke ShowWindow,hToolbar,SW_SHOWNORMAL924
.endif925
call _ReSize926
.elseif ax == IDM_GOTO927
invoke CreateDialogParam,hInstance,DLG_GOTO,hWinMain,offset Dlg_Proc,NULL928
mov hDlg,eax929
invoke SendDlgItemMessage,hDlg,IDC_RICHEDIT,EM_LIMITTEXT,12,0930
.elseif ax == IDM_PAGE_SETUP931
call _PageSetup932
.elseif ax == IDM_PRINT933
call _PrintDc934
.elseif ax == IDM_FONT935
invoke _ChooseFont936
.elseif ax == IDM_ABOUT_NOTEPAD937
invoke ShellAbout,hWinMain,offset szAbout1,offset szAbout2,hIcon938
.elseif ax == IDM_HELP939
invoke MessageBox,hWinMain,offset szHelp,offset chengong,MB_OK940
.elseif ax == IDM_LINE_WRAP941
invoke GetMenuState,hMenu,IDM_LINE_WRAP,MF_BYCOMMAND942
.if eax & MF_CHECKED943
invoke EnableMenuItem,hMenu,IDM_STATUS_BAR,MF_ENABLED944
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_CHECKED945
invoke ShowWindow,hStatusBar,SW_SHOWNORMAL946
invoke CheckMenuItem,hMenu,IDM_LINE_WRAP,MF_UNCHECKED947
invoke SendMessage,hEdit,EM_GETMODIFY,0,0948
.if eax949
mov _flag,1950
.endif951
invoke GetWindowTextLength,hEdit952
inc eax953
push eax954
invoke GlobalAlloc,GPTR,eax955
mov _lpMem,eax956
pop ecx957
invoke GetWindowText,hEdit,_lpMem,ecx958
invoke GetClientRect,hWinMain,addr stRt959
invoke DestroyWindow,hEdit960
invoke CreateWindowEx,0,offset szClass,NULL,\961
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN\962
OR WS_VSCROLL or ES_NOHIDESEL or ES_AUTOHSCROLL or WS_HSCROLL,\963
stRt.left,stRt.top,stRt.right,stRt.bottom,hWinMain,ID_EDIT,hInstance,NULL964
mov hEdit,eax965
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0966
invoke SetWindowText,hEdit,_lpMem967
invoke GlobalFree,_lpMem968
.if _flag969
invoke SendMessage,hEdit,EM_SETMODIFY,TRUE,0970
mov _flag,0971
.endif972
invoke SetFocus,hEdit973
invoke _SetFont974
.else975
invoke CheckMenuItem,hMenu,IDM_STATUS_BAR,MF_UNCHECKED976
invoke EnableMenuItem,hMenu,IDM_STATUS_BAR,MF_GRAYED977
invoke ShowWindow,hStatusBar,SW_HIDE978
invoke CheckMenuItem,hMenu,IDM_LINE_WRAP,MF_CHECKED979
invoke SendMessage,hEdit,EM_GETMODIFY,0,0980
.if eax981
mov _flag,1982
.endif983
invoke GetWindowTextLength,hEdit984
inc eax985
push eax986
invoke GlobalAlloc,GPTR,eax987
mov _lpMem,eax988
pop ecx989
invoke GetWindowText,hEdit,_lpMem,ecx990
invoke GetClientRect,hWinMain,addr stRt991
invoke DestroyWindow,hEdit992
invoke CreateWindowEx,0,offset szClass,NULL,\993
WS_CHILD OR WS_VISIBLE OR ES_MULTILINE OR ES_WANTRETURN\994
OR WS_VSCROLL or ES_NOHIDESEL,\995
stRt.left,stRt.top,stRt.right,stRt.bottom,hWinMain,ID_EDIT,hInstance,NULL996
mov hEdit,eax997
invoke SendMessage,hEdit,EM_LIMITTEXT,0,0998
invoke SetWindowText,hEdit,_lpMem999
invoke GlobalFree,_lpMem1000
.if _flag1001
invoke SendMessage,hEdit,EM_SETMODIFY,TRUE,01002
mov _flag,01003
.endif1004
invoke SetFocus,hEdit1005
invoke _SetFont1006
.endif1007
call _ReSize1008
.elseif ax == ID_EDIT1009
call _SetState1010
.endif1011
.elseif eax == WM_SIZE1012
call _ReSize1013
.elseif eax == WM_MENUSELECT1014
invoke MenuHelp,WM_MENUSELECT,wParam,lParam,lParam,hInstance,hStatusBar,offset szMenuHelp1015
.elseif eax == FrId1016
.if stFr.Flags & FR_DIALOGTERM1017
mov hFind,01018
.elseif stFr.Flags & FR_REPLACE1019
.if stFr.Flags & FR_DOWN1020
invoke _FindReplace1021
.else1022
invoke _FindReplace21023
.endif1024
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax1025
mov eax,@stRange.cpMin1026
.if eax != @stRange.cpMax1027
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset szReplaceText1028
.endif1029
.elseif stFr.Flags & FR_REPLACEALL1030
.while TRUE1031

1032
.if stFr.Flags & FR_DOWN1033
or stFr.Flags,FR_DOWN1034
invoke _FindReplace1035
.else1036
and stFr.Flags,not FR_DOWN1037
invoke _FindReplace21038
.endif1039
.break .if eax == 01040
invoke SendMessage,hEdit,EM_GETSEL,addr @stRange.cpMin,addr @stRange.cpMax1041
mov eax,@stRange.cpMin1042
.if eax != @stRange.cpMax1043
invoke SendMessage,hEdit,EM_REPLACESEL,TRUE,offset szReplaceText1044
.endif1045
.endw1046

1047
.elseif stFr.Flags & FR_DOWN1048
or stFr.Flags,FR_DOWN1049
invoke _FindReplace1050
invoke SendMessage,hEdit,EM_SCROLLCARET,0,01051
.else1052
and stFr.Flags,not FR_DOWN1053
invoke _FindReplace21054
invoke SendMessage,hEdit,EM_SCROLLCARET,0,01055
.endif1056
.elseif eax == WM_INITMENU1057
call _SetState1058
.elseif eax == WM_ACTIVATE1059
mov eax,wParam1060
.if (ax == WA_ACTIVE) || (ax == WA_CLICKACTIVE)1061
invoke SetFocus,hEdit1062
invoke SendMessage,hEdit,EM_SCROLLCARET,0,01063
.endif1064
.elseif eax == WM_NOTIFY1065
mov ebx,lParam1066
.if [ebx+NMHDR.code] == TTN_NEEDTEXT1067
assume ebx : ptr TOOLTIPTEXT1068
mov eax,[ebx].hdr.idFrom1069
mov [ebx].lpszText,eax1070
push hInstance1071
pop [ebx].hInst1072
assume ebx : nothing1073
.endif1074
.elseif eax == WM_DRAWCLIPBOARD1075
invoke IsClipboardFormatAvailable,CF_TEXT1076
.if eax1077
invoke EnableMenuItem,hMenu,IDM_PASTE,MF_ENABLED1078
.else1079
invoke EnableMenuItem,hMenu,IDM_PASTE,MF_GRAYED1080
.endif1081
.else1082
invoke DefWindowProc,hWnd,uMsg,wParam,lParam1083
ret1084
.endif1085
xor eax,eax1086
_OEN: ret1087
_WndProc endp1088
;********************************************************************1089
_WinMain proc1090
local stWndClass:WNDCLASSEX1091
local stMsg:MSG1092
local @hAccelerators1093

1094
invoke InitCommonControls1095
invoke GetModuleHandle,NULL1096
mov hInstance,eax1097
invoke LoadMenu,hInstance,IDM_MAIN1098
mov hMenu,eax1099
invoke LoadAccelerators,hInstance,IDA_MAIN1100
mov @hAccelerators,eax1101
invoke RtlZeroMemory,addr stWndClass,sizeof WNDCLASSEX1102
push hInstance1103
pop stWndClass.hInstance1104
invoke LoadIcon,hInstance,IDC_MAIN1105
mov hIcon,eax1106
mov stWndClass.hIcon,eax1107
mov stWndClass.hIconSm,eax1108
invoke LoadCursor,0,IDC_ARROW1109
mov stWndClass.hCursor,eax1110
mov stWndClass.cbSize,sizeof WNDCLASSEX1111
mov stWndClass.lpfnWndProc,offset _WndProc1112
mov stWndClass.lpszClassName,offset szClassName1113
mov stWndClass.style,CS_HREDRAW or CS_VREDRAW1114
mov stWndClass.hbrBackground,COLOR_BTNFACE+11115
invoke RegisterClassEx,addr stWndClass1116
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaption,\1117
WS_OVERLAPPEDWINDOW,100,80,600,\1118
400,NULL,hMenu,hInstance,NULL1119
.if eax1120
mov hWinMain,eax1121
.else1122
ret1123
.endif1124
invoke ShowWindow,hWinMain,SW_SHOWNORMAL1125
invoke UpdateWindow,hWinMain1126
.while TRUE1127
invoke GetMessage,addr stMsg,NULL,0,01128
.break .if eax == 01129
invoke TranslateAccelerator,hWinMain,@hAccelerators,addr stMsg1130
.if eax == 01131
invoke TranslateMessage,addr stMsg1132
invoke DispatchMessage,addr stMsg1133
.endif1134
.endw1135
ret1136
_WinMain endp1137
;********************************************************************1138
start: call _WinMain1139
invoke ExitProcess,NULL1140
end start1141

浙公网安备 33010602011771号