《windows环境下32位汇编语言程序设计》

下载本书

添加书签

windows环境下32位汇编语言程序设计- 第74节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!

让我们通过一个简单的例子来演示窗口子类化的实现过程,程序实现的就是前面介绍的16进制与10进制转换的程序,源代码位于所附光盘的Chapter09SubClass目录中。程序首先在资源脚本文件SubClass。rc中定义了一个对话框,对话框中包括两个编辑控件,IDC_DEC用来输入10进制数值,它包含ES_NUMBER风格,只能输入0~9的数值;而IDC_HEX用来输入16进制数值,代码如下:

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#include                    

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#define ICO_MAIN            1000

#define DLG_MAIN            1000

#define IDC_HEX         1001

#define IDC_DEC         1002

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ICO_MAIN        ICON            〃Main。ico〃

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

DLG_MAIN DIALOG 107; 102; 129; 42

STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU

CAPTION 〃Hex  Dec〃

FONT 9; 〃宋体〃



 LTEXT 〃Hex〃; …1; 7; 9; 15; 8

 EDITTEXT IDC_HEX; 27; 7; 94; 12

 LTEXT 〃Dec〃; …1; 7; 26; 15; 8

 EDITTEXT IDC_DEC; 27; 24; 94; 12; ES_NUMBER



汇编源程序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



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第9章 通用控件


9。5 窗口的子类化(2)

    
IDC_DEC         equ     1002

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 数据段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                    。data?

hInstance       dd      ?

hWinMain            dd      ?

dwOption            dd      ?

lpOldProcEdit   dd      ?

                    nst

szFmtDecToHex   db      '%08X';0

szFmtHexToDec   db      '%u';0

szAllowedChar   db      '0123456789ABCDEFabcdef';08h

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 代码段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                    de

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 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_MAND

                    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

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第9章 通用控件


9。5 窗口
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架