卓越2008

用一颗谦虚的心面对大家,用一颗坚定的心面对困难,用一颗执著的心面对理想,用一颗虔诚的心面对技术。

导航

一个记事本的例子(作者kiki)

Posted on 2007-08-04 10:53  Casm  阅读(1298)  评论(0)    收藏  举报

 

   1;********************************************************************
   2; 用下列命令进行编译和链接:
   3; ml //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
  11option 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;********************************************************************
 211Dlg_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
 245Dlg_Proc  endp
 246;********************************************************************
 247EditWndProc  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
 257EditWndProc  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;********************************************************************
1138start: call  _WinMain
1139 invoke  ExitProcess,NULL
1140end  start
1141