超类化:
源代码网整理以下 在这一讲我们将学习什么是超类化以及它有什么作用;同时你还会学到怎样在自己的窗口中用Tab键在控件中切换这一技巧。
源代码网整理以下理论:
源代码网整理以下在你的程序生涯中你肯定遇到过这样的情况,你需要一系列的控件,但它们之间却只有一点点的不同。例如,你可能需要10个只接受数字的 Edit 控件,当然你可以通过多种方法来达到这个目的。
源代码网整理以下创建自己的类并用它实例化为那些控件
源代码网推荐 创建那些 Edit 控件并把它们全部子类化
源代码网推荐 超类化Edit 控件
源代码网推荐 第一种方法太乏味了,因为你必须自己实现Edit 控件的每个功能,但这项工作不是轻松就能完成的。第二种方法好于第一种,但仍然要做许多工作,子类化几个Edit 控件还可以接受,但若要子类化十几二十个,这项工作简直就是一场恶梦。在这种情况下就应该使用超类化这个技巧,它是用于控制某一个特定窗口类的特殊方法。通过这种控制就可以修改窗口类的特性使之符合你的要求,然后再创建那一堆控件就可以了。 软件开发网 www.mscto.com
源代码网整理以下超类化有如下几个步骤:
源代码网整理以下通过调用 GetClassInfoEx 来获得想要进行超类化操作的窗口类的信息。函数GetClassInfoEx 需要一个指向 WNDCLASSEX 结构的指针,用于当成功返回时填入窗口类的信息。
源代码网推荐 按需要修改 WNDCLASSEX 结构的成员,其中有两个成员必须修改:
源代码网推荐 hInstance 存放程序的实例句柄
源代码网推荐 lpszClassName 指向一个新类名的指针
源代码网推荐 不必修改成员 lpfnWndProc,但大多数情况下还是需要的。但要记住如果要使用函数 CallWindowProc 调用老窗口的过程,那就必须保存成员 lpfnWndProc 的原值。
源代码网推荐 注册修改完的 WNDCLASSEX 结构,得到一个具有旧窗口类某些特性的新窗口类。
源代码网推荐 用新窗口类创建窗口
源代码网推荐 如果要创建具有相同特性的多个控件,超类化就比子类化要好。
源代码网整理以下举例:
源代码网整理以下.386
源代码网推荐 .model flat,stdcall
源代码网推荐 option casemap:none
源代码网推荐 include masm32includewindows.inc
源代码网推荐 include masm32includeuser32.inc
源代码网推荐 include masm32includekernel32.inc
源代码网推荐 includelib masm32libuser32.lib
源代码网推荐 includelib masm32libkernel32.lib
源代码网推荐 WM_SUPERCLASS equ WM_USER 5
源代码网推荐 WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
源代码网推荐 EditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
源代码网整理以下.data
源代码网推荐 ClassName db "SuperclassWinClass",0
源代码网推荐 AppName db "Superclassing Demo",0
源代码网推荐 EditClass db "EDIT",0
源代码网推荐 OurClass db "SUPEREDITCLASS",0
源代码网推荐 Message db "You pressed the Enter key in the text box!",0
源代码网整理以下.data?
源代码网推荐 hInstance dd ?
源代码网推荐 hwndEdit dd 6 dup(?) ;存放6个窗口句柄的数组
源代码网推荐 OldWndProc dd ? ;原来的窗口过程
源代码网整理以下.code
源代码网推荐 start:
源代码网推荐 invoke GetModuleHandle, NULL
源代码网推荐 mov hInstance,eax
源代码网推荐 invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
源代码网推荐 invoke ExitProcess,eax 软件开发网 www.mscto.com
源代码网整理以下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 hInst
源代码网推荐 pop wc.hInstance
源代码网推荐 mov wc.hbrBackground,COLOR_APPWORKSPACE
源代码网推荐 mov wc.lpszMenuName,NULL
源代码网推荐 mov wc.lpszClassName,OFFSET ClassName