?? 窗口子類化演示.txt
字號:
窗口子類化演示 作者:msfm 于2008-1-17上傳
--------------------------------------------------------------------------------
編輯前言:msfm給我們提供了一個窗口子類化的例子,程序?qū)崿F(xiàn)了檢測輸入
是否在給定范圍的功能。程序很簡單,但是對于學習者來說有很大的參考意義。
另外我們還可以根據(jù)這個程序的框架擴展出自己需要的程序。通過積累框架的代碼
在日后會很方便我們編寫簡單的程序。
;MASMPlus 代碼模板 - 普通的 Windows 程序代碼
;********************************************************************
; 窗口子類化演示
; 起源于一個DELPHI項目,需要控制一些字符輸入,要求速度優(yōu)先,于是想到用嵌入?yún)R編
; 解決循環(huán)查找字符,帶來的時間浪費問題。
; 于是簡單的 使用了窗口自類化方法,其中需要注意的是,使用模態(tài)與非模態(tài)對話框,VK_RETURN
; 消息將不被攔截,希望高手賜教原因。
; 程序還有相當大的優(yōu)化改進,空間,同時存在很大的不足,目前只是提供了一個框架,希望大
; 家修改,并提出寶貴的意見。謝謝
;********************************************************************
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
.data?
hInstance dd ?
hWinMain dd ?
dwOption dd ?
lpOldProcEdit dd ?
hedt dd ?
buf db 256 dup(?)
.const
szClassName db 'MyClass',0
Cedt db "Edit",0 ;標準控件
Cstc db "static",0 ;標準控件
szCaptionMain db '字符檢測',0 ;Cation
szCaption db '范圍定義 *、0..9、:、A..Z、a..z',0 ;合法字符
lpText db '提示',0
lpCaption db '包含非法字符',0
tbTable db '*','*','0','9',':',':',
'A','Z',
'a','z' ;定義合法字符Table
tbTableLen db $-tbTable ;length(Table)
.code
_isLetter proc
pushad
;下面的程序是一個雙層循環(huán),看起來不是很精巧,但是
;算法足夠簡單,容易理解
invoke lstrlen,addr buf
mov ecx,eax
lea esi,buf
iloop: ;外層循環(huán)
mov bl,[esi] ;從輸入中取出一個字符
xor edx,edx ;我們使用edx作為標記
push ecx
lea edi,tbTable
movzx ecx,tbTableLen
jloop: ;內(nèi)層循環(huán)
mov ax,[edi]
.if (al>bl)
inc edx
jmp nexti
.elseif (ah>=bl)
jmp nexti
.else
add edi,2
.endif
loop jloop
nexti:
pop ecx
.if (edx!=0) ;如果沒有標記,說明不符合范圍
mov eax,1
popad
ret
.endif
inc esi
loop iloop
popad
xor eax,eax
ret
_isLetter endp
_ProcEdit proc hWnd,uMsg,wParam,lParam
pushad
mov eax,uMsg
.if eax==WM_KEYDOWN
.if wParam == VK_RETURN
invoke GetWindowText,hedt,addr buf,sizeof buf
invoke _isLetter
.if eax !=0
invoke MessageBox,hWnd,addr lpCaption,addr lpText ,MB_ICONWARNING
invoke SetFocus,hedt
ret
.endif
ret
.endif
.else
invoke CallWindowProc,lpOldProcEdit,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
popad
ret
_ProcEdit endp
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax == WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcWinMain endp
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100,100,400,200,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset Cstc,offset szCaption,\
WS_VISIBLE or WS_CHILD,\
25,10,350,20,\
hWinMain,NULL,hInstance,NULL
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset Cedt,NULL,\
WS_VISIBLE or WS_CHILD,\
25,50,350,40,\
hWinMain,NULL,hInstance,NULL
mov hedt,eax
invoke SetFocus,hedt
invoke SetWindowLong,hedt,GWL_WNDPROC,addr _ProcEdit
mov lpOldProcEdit,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循環(huán)
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
--------------------------------------------------------------------------------
歡迎訪問AoGo匯編小站:http://www.aogosoft.com/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -