📄 tut22.html
字号:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta name="Author" content="lancelot">
<meta name="GENERATOR" content="Mozilla/4.51 [en] (Win95; I) [Netscape]">
<title>Iczelion's Win32 Assembly Tutorial 22: SuperClassing</title>
</head>
<body text="#C0C0C0" bgcolor="#000000" link="#FFFF00" vlink="#C0C0C0" alink="#C0FFC0">
<center>
<h1>
<font face="Arial,Helvetica"><font color="#CC6600">Tutorial 22: Superclassing</font></font></h1></center>
<font face="Arial,Helvetica"><font size=-1>In this tutorial, we will learn
about superclassing, what it is and what it is for. You will also learn
how to provide Tab key navigation to the controls in your own window.</font></font>
<br><font face="Arial,Helvetica"><font size=-1>Download the example <a href="files/tut22.zip">here</a></font></font>
<h3>
<font face="Arial,Helvetica"><font color="#3366FF">Theory:</font></font></h3>
<font face="Arial,Helvetica"><font size=-1>In your programming career,
you will surely encounter a situation where you need several controls with
*slightly* different behavior. For example, you may need 10 edit controls
which accept only number. There are several ways to achieve that goal:</font></font>
<ul>
<li>
<font face="Arial,Helvetica"><font size=-1>Create your own class and instantiate
the controls</font></font></li>
<li>
<font face="Arial,Helvetica"><font size=-1>Create those edit control and
then subclass all of them</font></font></li>
<li>
<font face="Arial,Helvetica"><font size=-1>Superclass the edit control</font></font></li>
</ul>
<font face="Arial,Helvetica"><font size=-1>The first method is too tedious.
You have to implement every functionality of the edit control yourself.
Hardly a task to be taken lightly. The second method is better than the
first one but still too much work. It is ok if you subclass only a few
controls but it's going to be a nightmare to subclass a dozen or so controls.
Superclassing is the technique you should use for this occasion.</font></font>
<br><font face="Arial,Helvetica"><font size=-1>Subclassing is the method
you use to *take control* of a particular window class. By *taking control*,
I mean you can modify the properties of the window class to suit your purpose
then then create the bunch of controls.</font></font>
<br><font face="Arial,Helvetica"><font size=-1>The steps in superclassing
is outlined below:</font></font>
<ul>
<li>
<font face="Arial,Helvetica"><font size=-1>call <font color="#FFFF00">GetClassInfoEx</font>
to obtain the information about the window class you want to superclass.
<font color="#FFFF00">GetClassInfoEx</font>
requires a pointer to a WNDCLASSEX structure which will be filled with
the information if the call returns successfully.</font></font></li>
<li>
<font face="Arial,Helvetica"><font size=-1>Modify the WNDCLASSEX members
that you want. However, there are two members which you MUST modify:</font></font></li>
<ul>
<li>
<font face="Arial,Helvetica"><font size=-1><font color="#FFFF00">hInstance</font>
You must put the instance handle of your program into this member.</font></font></li>
<li>
<font face="Arial,Helvetica"><font size=-1><font color="#FFFF00">lpszClassName </font>
You must provide it with a pointer to a new class name.</font></font></li>
<br><font face="Arial,Helvetica"><font size=-1>You need not modify lpfnWndProc
member but most of the time, you need to do it. Just remember to save the
original lpfnWndProc member if you want to call it with <font color="#FFFF00">CallWindowProc</font>.</font></font></ul>
<li>
<font face="Arial,Helvetica"><font size=-1>Register the modifed WNDCLASSEX
structure. You'll have a new window class which has several characteristics
of the old window class.</font></font></li>
<li>
<font face="Arial,Helvetica"><font size=-1>Create windows from the new
class</font></font></li>
</ul>
<font face="Arial,Helvetica"><font size=-1>Superclassing is better than
subclassing if you want to create many controls with the same characteristics.</font></font>
<h3>
<font face="Arial,Helvetica"><font color="#3366FF"><font size=-1>Example:</font></font></font></h3>
<b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>.386</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>.model
flat,stdcall</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>option
casemap:none</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>include
\masm32\include\windows.inc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>include
\masm32\include\user32.inc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>include
\masm32\include\kernel32.inc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>includelib
\masm32\lib\user32.lib</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>includelib
\masm32\lib\kernel32.lib</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>WM_SUPERCLASS
equ WM_USER+5</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>WinMain
PROTO :DWORD,:DWORD,:DWORD,:DWORD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>EditWndProc
PROTO :DWORD,:DWORD,:DWORD,:DWORD</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>.data</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>ClassName
db "SuperclassWinClass",0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>AppName
db "Superclassing Demo",0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>EditClass
db "EDIT",0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>OurClass
db "SUPEREDITCLASS",0</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>Message
db "You pressed the Enter key in the text box!",0</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>.data?</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>hInstance
dd ?</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>hwndEdit
dd 6 dup(?)</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>OldWndProc
dd ?</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>.code</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>start:</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
invoke GetModuleHandle, NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov hInstance,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
invoke ExitProcess,eax</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>WinMain
proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
LOCAL wc:WNDCLASSEX</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
LOCAL msg:MSG</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
LOCAL hwnd:HWND</font></font></font></b>
<p><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.cbSize,SIZEOF WNDCLASSEX</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.style, CS_HREDRAW or CS_VREDRAW</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.lpfnWndProc, OFFSET WndProc</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.cbClsExtra,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.cbWndExtra,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
push hInst</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
pop wc.hInstance</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.hbrBackground,COLOR_APPWORKSPACE</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.lpszMenuName,NULL</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.lpszClassName,OFFSET ClassName</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
invoke LoadIcon,NULL,IDI_APPLICATION</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.hIcon,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
mov wc.hIconSm,eax</font></font></font></b>
<br><b><font face="Arial,Helvetica"><font color="#FF6600"><font size=-1>
invoke LoadCursor,NULL,IDC_ARROW</font></font></font></b>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -