Уроки Iczelion'а



         

Урок 22. Суперклассинг - часть 3


WinMain endp

Wndproc proc uses ebx edi hWnd:HWND, uMsg:UINT, wparam:WpARAM,

lparam:LpARAM LOCAL wc:WNDCLASSEX .if uMsg==WM_CREATE mov wc.cbSize,sizeof WNDCLASSEX

invoke GetClassInfoEx,NULL,addr EditClass,addr wc push wc.lpfnWndproc pop OldWndproc mov wc.lpfnWndproc, OFFSET EditWndproc

push hInstance pop wc.hInstance mov wc.lpszClassName,OFFSET OurClass invoke RegisterClassEx, addr wc

xor ebx,ebx mov edi,20 .while ebx<6 invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR OurClass,NULL,\ WS_CHILD+WS_VISIBLE+WS_BORDER,20,\ edi,300,25,hWnd,ebx,\ hInstance,NULL mov dword ptr [hwndEdit+4*ebx],eax

add edi,25 inc ebx .endw invoke SetFocus,hwndEdit

.elseif uMsg==WM_DESTROY invoke postQuitMessage,NULL .else invoke DefWindowproc,hWnd,uMsg,wparam,lparam

ret .endif xor eax,eax ret

Wndproc endp

EditWndproc pROC hEdit:DWORD,uMsg:DWORD,wparam:DWORD,lparam:DWORD

.if uMsg==WM_CHAR mov eax,wparam .if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK

.if al>="a" && al<="f" sub al,20h .endif invoke CallWindowproc,OldWndproc,hEdit,uMsg,eax,lparam

ret .endif .elseif uMsg==WM_KEYDOWN mov eax,wparam

.if al==VK_RETURN invoke MessageBox,hEdit,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION invoke SetFocus,hEdit

.elseif al==VK_TAB invoke GetKeyState,VK_SHIFT test eax,80000000 .if ZERO?

invoke GetWindow,hEdit,GW_HWNDNEXT .if eax==NULL invoke GetWindow,hEdit,GW_HWNDFIRST .endif

.else invoke GetWindow,hEdit,GW_HWNDpREV .if eax==NULL invoke GetWindow,hEdit,GW_HWNDLAST

.endif .endif invoke SetFocus,eax xor eax,eax

ret .else invoke CallWindowproc,OldWndproc,hEdit,uMsg,wparam,lparam ret

.endif .else invoke CallWindowproc,OldWndproc,hEdit,uMsg,wparam,lparam ret

.endif xor eax,eax ret EditWndproc endp

end start

Анализ:

Программа создаст простое окно с "измененными" edit control'ами в своей клиентской области. Edit control'ы будут принимать только шестнадцатиричные числа. Фактически, я адаптировал пример с сабклассингом. программа стартует как обычно, а самое интересное происходит, когда создается основное окно:




Содержание  Назад  Вперед