?? tut3.html
字號:
<br><b><font color="#CCCCCC"><font size=-1> lpClassName:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> lpWindowName:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> dwStyle:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> X:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> Y:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> nWidth:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> nHeight:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> hWndParent:DWORD
,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> hMenu:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> hInstance:DWORD,\</font></font></b>
<br><b><font color="#CCCCCC"><font size=-1> lpParam:DWORD</font></font></b>
<p><font color="#CCCCCC"><font size=-1>Let's see detailed description of
each parameter:</font></font>
<br><font size=-1><b><font color="#999900">dwExStyle:</font></b><font color="#CCCCCC">
Extra window styles. This is the new parameter that is added to the old
CreateWindow. You can put new window styles for Windows 95 & NT here.You
can specify your ordinary window style in dwStyle but if you want some
special styles such as topmost window, you must specify them here. You
can use NULL if you don't want extra window styles.</font></font>
<br><font size=-1><b><font color="#999900">lpClassName: </font></b><font color="#CCCCCC">(Required).
Address of the ASCIIZ string containing the name of window class you want
to use as template for this window. The Class can be your own registered
class or predefined window class. As stated above, every window you created
must be based on a window class.</font></font>
<br><font size=-1><b><font color="#999900">lpWindowName: </font></b><font color="#CCCCCC">Address
of the ASCIIZ string containing the name of the window. It'll be shown
on the title bar of the window. If this parameter is NULL, the title bar
of the window will be blank.</font></font>
<br><font size=-1><b><font color="#999900">dwStyle: </font></b><font color="#CCCCCC">
Styles of the window. You can specify the appearance of the window here.
Passing NULL is ok but the window will have no system menu box, no
minimize-maximize buttons, and no close-window button. The window would
not be of much use at all. You will need to press Alt+F4 to close it. The
most common window style is WS_OVERLAPPEDWINDOW. A window style is only
a bit flag. Thus you can combine several window styles by "or" operator
to achieve the desired appearance of the window. WS_OVERLAPPEDWINDOW style
is actually a combination of the most common window styles by this method.</font></font>
<br><font size=-1><b><font color="#999900">X,Y:</font></b><font color="#CCCCCC">
The coordinate of the upper left corner of the window. Normally this values
should be CW_USEDEFAULT, that is, you want Windows to decide for you where
to put the window on the desktop.</font></font>
<br><font size=-1><b><font color="#999900">nWidth, nHeight: </font></b><font color="#CCCCCC">The
width and height of the window in pixels. You can also use CW_USEDEFAULT
to let Windows choose the appropriate width and height for you.</font></font>
<br><font size=-1><b><font color="#999900">hWndParent: </font></b><font color="#CCCCCC">A
handle to the window's parent window (if exists). This parameter tells
Windows whether this window is a child (subordinate) of some other window
and, if it is, which window is the parent. Note that this is not the parent-child
relationship of multiple document interface (MDI). Child windows are not
bound to the client area of the parent window. This relationship is specifically
for Windows internal use. If the parent window is destroyed, all child
windows will be destroyed automatically. It's really that simple. Since
in our example, there's only one window, we specify this parameter as NULL.</font></font>
<br><font size=-1><b><font color="#999900">hMenu:</font></b><font color="#CCCCCC">
A handle to the window's menu. NULL if the class menu is to be used. Look
back at the a member of WNDCLASSEX structure, lpszMenuName. lpszMenuName
specifies *default* menu for the window class. Every window created from
this window class will have the same menu by default. Unless you specify
an *overriding* menu for a specific window via its hMenu parameter. hMenu
is actually a dual-purpose parameter. In case the window you want to create
is of a predefined window type (ie. control), such control cannot own a
menu. hMenu is used as that control's ID instead. Windows can decide whether
hMenu is really a menu handle or a control ID by looking at lpClassName
parameter. If it's the name of a predefined window class, hMenu is a control
ID. If it's not, then it's a handle to the window's menu.</font></font>
<br><font size=-1><b><font color="#999900">hInstance:</font></b><font color="#CCCCCC">
The instance handle for the program module creating the window.</font></font>
<br><font size=-1><b><font color="#999900">lpParam: </font></b><font color="#CCCCCC">Optional
pointer to a data structure passed to the window. This is used by MDI window
to pass the CLIENTCREATESTRUCT data. Normally, this value is set to NULL,
meaning that no data is passed via CreateWindow(). The window can retrieve
the value of this parameter by the call to GetWindowLong function.</font></font>
<p><b><font size=-1><font color="#006600"> </font><font color="#999900">
mov hwnd,eax</font></font></b>
<br><b><font color="#999900"><font size=-1> invoke ShowWindow,
hwnd,CmdShow</font></font></b>
<br><b><font color="#999900"><font size=-1> invoke UpdateWindow,
hwnd</font></font></b>
<p><font color="#CCCCCC"><font size=-1>On successful return from CreateWindowEx,
the window handle is returned in eax. We must keep this value for future
use. The window we just created is not automatically displayed. You must
call ShowWindow with the window handle and the desired *display state*
of the window to make it display on the screen. Next you can call UpdateWindow
to order your window to repaint its client area. This function is useful
when you want to update the content of the client area. You can omit this
call though.</font></font>
<p><b><font size=-1><font color="#006600"> </font><font color="#999900">
.WHILE TRUE</font></font></b>
<br><b><font color="#999900"><font size=-1>
invoke GetMessage, ADDR msg,NULL,0,0</font></font></b>
<br><b><font color="#999900"><font size=-1>
.BREAK .IF (!eax)</font></font></b>
<br><b><font color="#999900"><font size=-1>
invoke TranslateMessage, ADDR msg</font></font></b>
<br><b><font color="#999900"><font size=-1>
invoke DispatchMessage, ADDR msg</font></font></b>
<br><b><font color="#999900"><font size=-1> .ENDW</font></font></b>
<p><font color="#CCCCCC"><font size=-1>At this time, our window is up on
the screen. But it cannot receive input from the world. So we have to *inform*
it of relevant events. We accomplish this with a message loop. There's
only one message loop for each module. This message loop continually checks
for messages from Windows with GetMessage call. GetMessage passes a pointer
to a MSG structure to Windows. This MSG structure will be filled with information
about the message that Windows want to send to a window in the module.
GetMessage function will not return until there's a message for a window
in the module. During that time, Windows can give control to other programs.
This is what forms the cooperative multitasking scheme of Win16 platform.
GetMessage returns FALSE if WM_QUIT message is received which, in the message
loop, will terminate the loop and exit the program.</font></font>
<br><font color="#CCCCCC"><font size=-1>TranslateMessage is a utility function
that takes raw keyboard input and generates a new message (WM_CHAR) that
is placed on the message queue. The message with WM_CHAR contains the ASCII
value for the key pressed, which is easier to deal with than the raw keyboard
scan codes. You can omit this call if your program doesn't process keystrokes.</font></font>
<br><font color="#CCCCCC"><font size=-1>DispatchMessage sends the message
data to the window procedure responsible for the specific window the message
is for.</font></font>
<p><b><font size=-1><font color="#006600"> </font><font color="#999900">
mov eax,msg.wParam</font></font></b>
<br><b><font color="#999900"><font size=-1> ret</font></font></b>
<br><b><font color="#999900"><font size=-1>WinMain endp</font></font></b>
<p><font color="#CCCCCC"><font size=-1>If the message loop terminates,
the exit code is stored in wParam member of the MSG structure. You can
store this exit code into eax to return it to Windows. At the present time,
Windows does not make use of the return value, but it's better to be on
the safe side and plays by the rule.</font></font>
<p><b><font color="#999900"><font size=-1>WndProc proc hWnd:HWND, uMsg:UINT,
wParam:WPARAM, lParam:LPARAM</font></font></b>
<p><font color="#CCCCCC"><font size=-1>This is our window procedure. You
don't have to name it WndProc. The first parameter, hWnd, is the window
handle of the window that the message is destined for. uMsg is the message.
Note that uMsg is not a MSG structure. It's just a number, really. Windows
defines hundreds of messages, most of which your programs will not be interested
in. Windows will send an appropriate message to a window in case something
relevant to that window happens. The window procedure receives the message
and reacts to it intelligently. wParam and lParam are just extra parameters
for use by some messages. Some messages do send accompanying data in addition
to the message itself. Those data are passed to the window procedure by
means of lParam and wParam.</font></font>
<p><b><font color="#999900"><font size=-1> .IF uMsg==WM_DESTROY</font></font></b>
<br><b><font color="#999900"><font size=-1>
invoke PostQuitMessage,NULL</font></font></b>
<br><b><font color="#999900"><font size=-1> .ELSE</font></font></b>
<br><b><font color="#999900"><font size=-1>
invoke DefWindowProc,hWnd,uMsg,wParam,lParam</font></font></b>
<br><b><font color="#999900"><font size=-1>
ret</font></font></b>
<br><b><font color="#999900"><font size=-1> .ENDIF</font></font></b>
<br><b><font color="#999900"><font size=-1> xor eax,eax</font></font></b>
<br><b><font color="#999900"><font size=-1> ret</font></font></b>
<br><b><font color="#999900"><font size=-1>WndProc endp</font></font></b>
<p><font color="#CCCCCC"><font size=-1>Here comes the crucial part. This
is where most of your program's intelligence resides. The codes that respond
to each Windows message are in the window procedure. Your code must check
the Windows message to see if it's a message it's interested in. If it
is, do anything you want to do in response to that message and then return
with zero in eax. If it's not, you MUST call DefWindowProc, passing
all parameters you received to it for default processing.. This DefWindowProc
is an API function that processes the messages your program are not interested
in.</font></font>
<br><font color="#CCCCCC"><font size=-1>The only message that you MUST
respond to is WM_DESTROY. This message is sent to your window procedure
whenever your window is closed. By the time your window procedure receives
this message, your window is already removed from the screen. This is just
a notification that your window was destroyed, you should prepare yourself
to return to Windows. In response to this, you can perform housekeeping
prior to returning to Windows. You have no choice but to quit when it comes
to this state. If you want to have a chance to stop the user from closing
your window, you should process WM_CLOSE message. Now back to WM_DESTROY,
after performing housekeeping chores, you must call PostQuitMessage which
will post WM_QUIT back to your module. WM_QUIT will make GetMessage return
with zero value in eax, which in turn, terminates the message loop and
quits to Windows. You can send WM_DESTROY message to your own window procedure
by calling DestroyWindow function.</font></font>
<p>
<hr WIDTH="100%">
<center><b><font color="#009900"><font size=-1>[<a href="http://win32asm.cjb.net">Iczelion's
Win32 Assembly HomePage</a>]</font></font></b></center>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -