营销型网站托管,厦门的商城网站建设,制作公司网站的作用,58同城做公司网站怎修改;运行效果 ;win32汇编环境,窗口程序中使编辑框控件子类化的示例一 ;窗口子类化#xff0c;就是把某种控件#xff0c;自已再打造一遍#xff0c;加入自已的功能。比如弄个特殊形状的按钮#xff0c;或只能输入特殊字符的编辑框 ;当然#xff0c;一般来说#xff0c;这都是…;运行效果 ;win32汇编环境,窗口程序中使编辑框控件子类化的示例一 ;窗口子类化就是把某种控件自已再打造一遍加入自已的功能。比如弄个特殊形状的按钮或只能输入特殊字符的编辑框 ;当然一般来说这都是很麻烦的事儿。其它的语言像VC之类的有子类的概念其原理也是这些但是又进行了更复杂的封装。所以知其然更知其所以然很重要。 ;这里的例子是把默认的编辑框弄成只能输入十六进制的编辑框。 ;复制下面代码进RadAsm可直接编译。重要部分加备注。 ;下面为asm文件
.386 .model flat,stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ; WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD ; .DATA ClassName db SimpleWinClass,0 AppName db 窗口程序的模版,0 szSTClass db static,0 ;静态控件类名 szSTCaption db 该编辑框只能输入十六进制数值:,0
EditClass db EDIT,0 ;编辑框的类名 Message db 你按下了回车键,0 .DATA? hInstance HINSTANCE ? CommandLine LPSTR ?
hwndEdit dd ? OldWndProc dd ? ; .CODE
start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT invoke ExitProcess, eax ; WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc, OFFSET WndProc mov wc.cbClsExtra,NULL mov wc.cbWndExtra,NULL push hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,270,150, NULL,NULL,hInst, NULL mov hwnd,eax invoke ShowWindow, hwnd,CmdShow invoke UpdateWindow, hwnd .while TRUE invoke GetMessage, ADDR msg,NULL,0,0 .break .if (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .endw mov eax,msg.wParam ret WinMain endp ; WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .if uMsg WM_CREATE invoke CreateWindowEx,NULL,ADDR szSTClass,ADDR szSTCaption, WS_CHILD WS_VISIBLE,20, 20, 250, 20,hWnd,NULL,NULL,NULL ;创建静态控件用来显示文本 invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR EditClass,NULL,WS_CHILDWS_VISIBLEWS_BORDER,20,50,210,25,hWnd,NULL,hInstance,NULL ;创建编辑框 mov hwndEdit,eax ;保存编辑框的句柄 invoke SetFocus,eax ;让编辑框得到焦点就是程序启动后光标在编辑框里 invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr EditWndProc ;把原来的窗口函数地址替换为自定义窗口函数的地址 mov OldWndProc,eax ;返回值则是原来的窗口函数地址 .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 ;这个窗口函数是插入主窗口消息循环的函数只截取了2个消息即下面的 WM_CHAR 和 WM_KEYDOWN其它的消息不管仍交回原主窗口 WndProc 函数处理 .if uMsg WM_CHAR ;截取了WM_CHAR消息相当于在这个编辑框里按任何字符都在这里面处理。而里面除了处理这十六个字符和删除键backspace键外没有对其它字符的处理所以会导致按其它的字符没有反应 mov eax,wParam .if (al0 al9) || (alA alF) || (ala alf) || alVK_BACK .if ala alf sub al,20h ;加上20h是让小写的变成大写的 .endif invoke CallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam ;如果在CHAR消息发生时不是在这些范围内的字符则返回这个地址 OldWndProc 函数继续执行就是返回原来的主窗口WndProc函数执行其它消息 ret .endif .elseif uMsgWM_KEYDOWN ;截取了WM_KEYDOWN消息 mov eax,wParam .if al VK_RETURN ;如果按了回车键则显示输入的是什么内容 invoke MessageBox,hEdit,addr Message,addr AppName,MB_OKMB_ICONINFORMATION invoke SetFocus,hEdit .else invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam ;如果在按键消息发生时不是按的回车键则返回这个地址 OldWndProc 函数继续执行 ret .endif .else invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam ;如果不是上面的 WM_CHAR 和 WM_KEYDOWN 消息则返回这个地址 OldWndProc 函数继续执行 ret .endif xor eax,eax ret EditWndProc endp
; end start