让我们通过一个简单的例子来演示窗口子类化的实现过程,程序实现的就是前面介绍的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] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。
赞一下
添加书签加入书架