WIN32汇编语言教程:第09章 通用控件 · 9.5 窗口的子类化(2)

汇编源程序SubClass.asm的内容如下:

                 .386
                  .model flat, stdcall
                 option casemap :none
;####################################################################
; Include 文件定义
;####################################################################
include        windows.inc
include        user32.inc
includelib     user32.lib
include        kernel32.inc
includelib     kernel32.lib
;####################################################################
; Equ 等值定义
;####################################################################
ICO_MAIN          equ    1000
DLG_MAIN         equ    1000
IDC_HEX        equ    1001
IDC_DEC        equ    1002
;####################################################################
; 数据段
;####################################################################
                  .data?
hInstance      dd     ?
hWinMain          dd     ?
dwOption         dd     ?
lpOldProcEdit  dd     ?
                  .const
szFmtDecToHex  db     '%08X',0
szFmtHexToDec  db     '%u',0
szAllowedChar  db     '0123456789ABCDEFabcdef',08h
;####################################################################
; 代码段
;####################################################################
                  .code
;####################################################################
; IDC_HEX编辑框的新窗口过程
;####################################################################
_ProcEdit      proc       uses ebx edi esi hWnd,uMsg,wParam,lParam
 
                 mov    eax,uMsg
                 .if    uMsg == WM_CHAR
                         mov    eax,wParam
                         mov    edi,offset szAllowedChar
                         mov    ecx,sizeof szAllowedChar
                         repnz  scasb
                         .if    ZERO?
                                 .if    al > '9'
                                         and al,not 20h
                                 .endif
                                 invoke CallWindowProc,lpOldProcEdit,\
                                         hWnd,uMsg,eax,lParam
                                 ret
                         .endif
                 .else
                         invoke CallWindowProc,lpOldProcEdit,\
                                 hWnd,uMsg,wParam,lParam
                          ret
                 .endif
                 xor    eax,eax
                  ret
 
_ProcEdit      endp
;####################################################################
; 计算16进制到10进制
;####################################################################
_HexToDec      proc
                 local  @szBuffer[512]:byte
 
                  invoke GetDlgItemText,hWinMain,IDC_HEX,\
                         addr @szBuffer,sizeof @szBuffer
                 lea    esi,@szBuffer
                  cld
                 xor    eax,eax
                  mov    ebx,16
                 .while TRUE
                         movzx  ecx,byte ptr [esi]
                         inc    esi
                          .break .if ! ecx
                         .if    cl > '9'
                                 sub    cl,'A' - 0ah
                         .else
                                 sub    cl,'0'
                         .endif
                         mul    ebx
                         add    eax,ecx
                 .endw
                  invoke wsprintf,addr @szBuffer,addr szFmtHexToDec,eax
                  invoke SetDlgItemText,hWinMain,IDC_DEC,addr @szBuffer
                 ret
 
_HexToDec      endp
;####################################################################
; 计算10进制到16进制
;####################################################################
_DecToHex      proc
                  local  @szBuffer[512]:byte
 
                 invoke GetDlgItemInt,hWinMain,IDC_DEC,NULL,FALSE
                 invoke wsprintf,addr @szBuffer,addr szFmtDecToHex,eax
                 invoke SetDlgItemText,hWinMain,IDC_HEX,addr @szBuffer
                  ret
 
_DecToHex      endp
;####################################################################
_ProcDlgMain       proc       uses ebx edi esi hWnd,wMsg,wParam,lParam
 
                   mov    eax,wMsg
;********************************************************************
                   .if    eax == WM_CLOSE
                           invoke EndDialog,hWnd,NULL
;********************************************************************
                   .elseif eax == WM_INITDIALOG
                   mov    eax,hWnd
                   mov    hWinMain,eax
                   invoke SendDlgItemMessage,hWnd,\
                           IDC_HEX,EM_LIMITTEXT,8,0
                   invoke SendDlgItemMessage,hWnd,\
                           IDC_DEC,EM_LIMITTEXT,10,0
                   invoke GetDlgItem,hWnd,IDC_HEX
                   invoke SetWindowLong,eax,GWL_WNDPROC,addr _ProcEdit
                   mov    lpOldProcEdit,eax
;********************************************************************
          .elseif eax == WM_COMMAND
                   mov    eax,wParam
                   .if    ! dwOption
                           mov    dwOption,TRUE
                           .if    ax ==  IDC_HEX
                                   invoke _HexToDec
                           .elseif ax ==  IDC_DEC
                                   invoke _DecToHex
                           .endif
                           mov    dwOption,FALSE
                   .endif
           .else
                   mov    eax,FALSE
                 ret
           .endif
           mov    eax,TRUE
       ret
 
_ProcDlgMain      endp
;####################################################################
start:
                  invoke GetModuleHandle,NULL
                  mov    hInstance,eax
                  invoke DialogBoxParam,hInstance,DLG_MAIN,\
                         NULL,offset _ProcDlgMain,NULL
                 invoke ExitProcess,NULL
;####################################################################

上页:第09章 通用控件 · 9.5 窗口的子类化(1) 下页:第09章 通用控件 · 9.5 窗口的子类化(3)

第09章 通用控件

版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号