📄 lion-tut-c09.htm
字号:
<html>
<head>
<link rel="stylesheet" href="../../asm.css">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Iczelion's win32 asm tutorial</title>
</head>
<body bgcolor="#FFFFFF" background="../../images/back01.jpg">
<p align="center"><font size="5"><u><strong><font color="#0000FF">第九课 子窗口控件</font></strong></u></font></p>
<hr size="1">
本课中我们将探讨控件,这些控件是我们程序主要的输入输出设备。
<h3> <font color="#ff0000">理论:</font></h3>
WINDOWS 提供了几个预定义的窗口类以方便我们的使用。大多数时间内,我们把它们用在对话框中,所以我们一般就它们叫做子窗口控件。子窗口控件会自己处理消息,并在自己状态发生改变时通知父窗口。这样就大大地减轻了我们的编程工作,所以我们应尽可能地利用它们。本课中我们把这些控件放在窗口中以简化程序,但是大多数时间内子窗口控件都是放在对话框中的。
我们示例中演示的子窗口控件包括:按钮、下拉菜单、检查框、单选按钮、编辑框等。
使用子窗口控件时,先调用CreateWindow 或
CreateWindowEx。在这里由于WINDOWS 已经注册了这些子控件,所以无须我们再注册。当然我们不能改变它们的类名称。譬如:如果您想产生一个按钮,在调用上述两个函数时就必须指定类名为"button"。其他必须指定的参数还有父窗口的句柄和将要产生的子控件的ID号。子控件的ID号是用来标识子控件的,故也必须是唯一 的。子控件产生后,当其状态改变时将会向父窗口发送消息。一般我们应在父窗口的WM_CREATE消息中产生字控件。子控件向父窗口发送的消息是WM_COMMAND,并在传递的参数wPara的底位中包括控件的ID号,消息号在wParam的高位,lParam中则包括了子控件的窗口的句柄。各类控件有不同的消息代码集,详情请参见WIN32 API参考手册。
父窗口也可以通过调用函数SendMessage向子控件发送消息,其中第一个参数是子控件的窗口句柄,第二个参数是要发送的消息号,附加的参数可以在wParam和lParam中传递,其实只要知道了某个窗口的句柄就可以用该函数向其发送相关消息。
所以产生了子窗口后必须处理WM_COMMAND消息以便可以接收到子控件的消息。<p></p>
<h3><font color="#ff0000">例子:</font></h3>
我们将产生一个窗口,在该窗口中有一个编辑框和一个按钮。当您按下按钮时 ,会弹出一个对话框其中显示了您在编辑框中输入的内容。另外,该应用程序还有一个菜单,其中有四个菜单项:
<ol>
<li> <b>Say Hello</b> -- 把一个字符串输入编辑控件;</li>
<li> <b>Clear Edit Box</b> -- 清除编辑控件中的字符串;</li>
<li> <b>Get Text </b>-- 弹出对话框显示编辑控件中的字符串;</li>
<li> <b>Exit </b>-- 退出应用程序。</li>
</ol>
<b>.386</b> <br>
<b>.model flat,stdcall</b> <br>
<b>option casemap:none</b>
<p><b>WinMain proto :DWORD,:DWORD,:DWORD,:DWORD</b>
<p><b>include \masm32\include\windows.inc</b> <br>
<b>include \masm32\include\user32.inc</b> <br>
<b>include \masm32\include\kernel32.inc</b> <br>
<b>includelib \masm32\lib\user32.lib</b> <br>
<b>includelib \masm32\lib\kernel32.lib</b>
<p><b>.data</b> <br>
<b>ClassName db "SimpleWinClass",0</b> <br>
<b>AppName db "Our First Window",0</b> <br>
<b>MenuName db "FirstMenu",0</b> <br>
<b>ButtonClassName db "button",0</b> <br>
<b>ButtonText db "My First Button",0</b> <br>
<b>EditClassName db "edit",0</b> <br>
<b>TestString db "Wow! I'm in an edit box now",0</b>
<p><b>.data?</b> <br>
<b>hInstance HINSTANCE ?</b> <br>
<b>CommandLine LPSTR ?</b> <br>
<b>hwndButton HWND ?</b> <br>
<b>hwndEdit HWND ?</b> <br>
<b>buffer db 512 dup(?)
; buffer to store the text retrieved from the edit box</b>
<p><b>.const</b> <br>
<b>ButtonID equ 1
; The control ID of the button control</b> <br>
<b>EditID equ 2
; The control ID of the edit control</b> <br>
<b>IDM_HELLO equ 1</b> <br>
<b>IDM_CLEAR equ 2</b> <br>
<b>IDM_GETTEXT equ 3</b> <br>
<b>IDM_EXIT equ 4</b>
<p><b>.code</b> <br>
<b>start:</b> <br>
<b> invoke GetModuleHandle, NULL</b> <br>
<b> mov hInstance,eax</b> <br>
<b> invoke GetCommandLine<br>
mov CommandLine,eax</b> <br>
<b> invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT</b>
<br>
<b> invoke ExitProcess,eax</b>
<p><b>WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD</b>
<br>
<b> LOCAL wc:WNDCLASSEX</b> <br>
<b> LOCAL msg:MSG</b> <br>
<b> LOCAL hwnd:HWND</b> <br>
<b> mov wc.cbSize,SIZEOF WNDCLASSEX</b> <br>
<b> mov wc.style, CS_HREDRAW or CS_VREDRAW</b>
<br>
<b> mov wc.lpfnWndProc, OFFSET WndProc</b> <br>
<b> mov wc.cbClsExtra,NULL</b> <br>
<b> mov wc.cbWndExtra,NULL</b> <br>
<b> push hInst</b> <br>
<b> pop wc.hInstance</b> <br>
<b> mov wc.hbrBackground,COLOR_BTNFACE+1</b> <br>
<b> mov wc.lpszMenuName,OFFSET MenuName</b> <br>
<b> mov wc.lpszClassName,OFFSET ClassName</b>
<br>
<b> invoke LoadIcon,NULL,IDI_APPLICATION</b> <br>
<b> mov wc.hIcon,eax</b> <br>
<b> mov wc.hIconSm,eax</b> <br>
<b> invoke LoadCursor,NULL,IDC_ARROW</b> <br>
<b> mov wc.hCursor,eax</b> <br>
<b> invoke RegisterClassEx, addr wc</b> <br>
<b> invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,
\</b> <br>
<b>
ADDR AppName, WS_OVERLAPPEDWINDOW,\</b> <br>
<b>
CW_USEDEFAULT, CW_USEDEFAULT,\</b> <br>
<b>
300,200,NULL,NULL, hInst,NULL</b> <br>
<b> mov hwnd,eax</b> <br>
<b> invoke ShowWindow, hwnd,SW_SHOWNORMAL</b> <br>
<b> invoke UpdateWindow, hwnd</b> <br>
<b> .WHILE TRUE</b> <br>
<b> invoke GetMessage, ADDR msg,NULL,0,0</b>
<br>
<b> .BREAK .IF (!eax)</b> <br>
<b> invoke TranslateMessage, ADDR
msg</b> <br>
<b> invoke DispatchMessage, ADDR msg</b>
<br>
<b> .ENDW</b> <br>
<b> mov eax,msg.wParam</b> <br>
<b> ret</b> <br>
<b>WinMain endp</b>
<p><b>WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM</b> <br>
<b> .IF uMsg==WM_DESTROY</b> <br>
<b> invoke PostQuitMessage,NULL</b>
<br>
<b> .ELSEIF uMsg==WM_CREATE</b> <br>
<b> invoke CreateWindowEx,WS_EX_CLIENTEDGE,
ADDR EditClassName,NULL,\</b> <br>
<b>
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\</b> <br>
<b>
ES_AUTOHSCROLL,\</b> <br>
<b>
50,35,200,25,hWnd,8,hInstance,NULL</b> <br>
<b> mov hwndEdit,eax</b> <br>
<b> invoke SetFocus, hwndEdit</b>
<br>
<b> invoke CreateWindowEx,NULL, ADDR
ButtonClassName,ADDR ButtonText,\</b> <br>
<b>
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\</b> <br>
<b>
75,70,140,25,hWnd,ButtonID,hInstance,NULL</b> <br>
<b> mov hwndButton,eax</b> <br>
<b> .ELSEIF uMsg==WM_COMMAND</b> <br>
<b> mov eax,wParam</b> <br>
<b> .IF lParam==0</b> <br>
<b> .IF ax==IDM_HELLO</b>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -