友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
依依小说 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第66部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




 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 窗口的子类化(3)

    
                    end     start

程序运行后将显示如图9。9所示的对话框,上面的编辑控件是经过子类化的,只能输入16进制字符,当输入字母a~f的时候,不管输入的是大写还是小写字母,都会被控件转换成大写字母。下面的编辑框是ES_NUMBER风格的,可以输入数字。不管在哪个编辑框中输入数值,程序会马上进行转换并将结果在另一个编辑框中显示出来。


图9。9  窗口子类化例子的运行界面

程序在对话框的初始化消息WM_INITDIALOG中对这两个编辑控件发送EM_LIMITTEXT消息,以此限制能够输入的最大字符长度,接下来程序通过GetDlgItem获取IDC_HEX编辑框的窗口句柄,并使用SetWindowLong函数将编辑框的新窗口过程设置到_ProcEdit子程序中,返回的原窗口过程地址被保存到lpOldProcEdit变量中:

    invoke  GetDlgItem;hWnd;IDC_HEX

    invoke  SetWindowLong;eax;GWL_WNDPROC;addr _ProcEdit

    mov     lpOldProcEdit;eax

这样,当Windows向IDC_HEX编辑框发送消息时,_ProcEdit子程序就会收到消息,在_ProcEdit中我们仅处理感兴趣的WM_CHAR消息,程序在数据段中定义了一个允许输入的字符表,表中包括0~9、大小写的A~F以及退格键(如果不允许输入退格键的话将无法修正输入错误)。然后在处理WM_CHAR消息时使用scasb指令进行查表,如果字符在表中,则将WM_CHAR消息通过CallWindowProc函数转发给原来的窗口过程,如果不在表中则直接返回,相当于丢弃了这个按键动作。代码如下:

            nst

szAllowedChar       db      '0123456789ABCDEFabcdef';08h

            de

                        。。。

            mov     eax;wParam  ;WM_CHAR消息中的一段代码

            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

在转发之前,程序还对字符进行判断,如果字符是小写的a~f的话(表中的字符中大于“9”的肯定是字母),则通过and al;not 20h语句将字母转换成大写,因为大写字母的ASCII码从41h开始,小写字母从61h开始,这样的计算方法对大写字母没有影响,对小写的则刚好能够转换成大写的。程序将�
返回目录 上一页 下一页 回到顶部 赞(0) 踩(0)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!