📄 lion-tut-c09.htm
字号:
<b>
invoke SetWindowText,hwndEdit,ADDR TestString</b> <br>
<b> .ELSEIF
ax==IDM_CLEAR</b> <br>
<b>
invoke SetWindowText,hwndEdit,NULL</b> <br>
<b> .ELSEIF
ax==IDM_GETTEXT</b> <br>
<b>
invoke GetWindowText,hwndEdit,ADDR buffer,512</b> <br>
<b>
invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK</b> <br>
<b> .ELSE</b>
<br>
<b>
invoke DestroyWindow,hWnd</b> <br>
<b> .ENDIF</b>
<br>
<b> .ELSE</b> <br>
<b> .IF ax==ButtonID</b>
<br>
<b>
shr eax,16</b> <br>
<b>
.IF ax==BN_CLICKED</b> <br>
<b>
invoke SendMessage,hWnd,WM_COMMAND,IDM_GETTEXT,0</b> <br>
<b>
.ENDIF</b> <br>
<b> .ENDIF</b>
<br>
<b> .ENDIF</b> <br>
<b> .ELSE</b> <br>
<b> invoke DefWindowProc,hWnd,uMsg,wParam,lParam</b>
<br>
<b> ret</b> <br>
<b> .ENDIF</b> <br>
<b> xor eax,eax</b> <br>
<b> ret</b> <br>
<b>WndProc endp</b> <br>
<b>end start</b>
<h3> <font color="#ff0000"><b>分析:</b></font></h3>
我们现在开始分析,
<ul>
<b> .ELSEIF uMsg==WM_CREATE</b> <br>
<b> invoke CreateWindowEx,WS_EX_CLIENTEDGE,
\</b> <br>
<b>
ADDR EditClassName,NULL,\</b> <br>
<b>
WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT\</b> <br>
<b>
or ES_AUTOHSCROLL,\</b> <br>
<b>
50,35,200,25,hWnd,EditID,hInstance,NULL</b> <br>
<b> mov hwndEdit,eax</b> <br>
<b> invoke SetFocus, hwndEdit</b>
<br>
<b> invoke CreateWindowEx,NULL, ADDR
ButtonClassName,\</b> <br>
<b>
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>
</ul>
我们在WM_CREATE中产生子控件,其中在函数CreateWindowEx中给子控件窗口一个WS_EX_CLIENTEDGE风格,它使得子控件窗口看上去边界下凹,具有立体感。每一个子控件的类名都是预定义的,譬如:按钮的预定义类名是"button",编辑框是"edit"。接下来的参数是窗口风格,除了通常的窗口风格外,每一个控件都有自己的扩展风格,譬如:按钮类的扩展风格前面加有BS_,编辑框类则是:ES_,WIN32 API 参考中有所有的扩展风格的描述。注意:您在CreateWindowsEx函数中本来要传递菜单句柄的地方传入子窗口空间的ID号不会有什么副作用,因为子窗口控件本身不能有菜单。产生控件后,我们保存它们的句柄,然后调用SetFocus把焦点设到编辑控件上以便用户立即可以输入。
接下来的是如何处理控件发送的通知消息WM_COMMAND:
<p><b> .ELSEIF uMsg==WM_COMMAND</b> <br>
<b> mov eax,wParam</b> <br>
<b> .IF lParam==0</b>
<p>我们以前讲过选择菜单想也会发送WM_COMMAND
消息,那我们应如何区分呢?看了下表您就会一目了然:<br>
<center>
<table BORDER width="100%" >
<tr>
<td> </td>
<td>Low word of wParam</td>
<td>High word of wParam</td>
<td>lParam</td>
</tr>
<tr>
<td>Menu</td>
<td>Menu ID</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>Control</td>
<td>Control ID</td>
<td>Notification code</td>
<td>Child Window Handle</td>
</tr>
</table>
</center>
<p>其中我们可以看到不能用wParam来区分,因为菜单和控件的ID号可能相同,而且子窗口空间的消息号也有可能为0。
<p><b> .IF ax==IDM_HELLO</b>
<br>
<b>
invoke SetWindowText,hwndEdit,ADDR TestString</b> <br>
<b> .ELSEIF
ax==IDM_CLEAR</b> <br>
<b>
invoke SetWindowText,hwndEdit,NULL</b> <br>
<b> .ELSEIF
ax==IDM_GETTEXT</b> <br>
<b>
invoke GetWindowText,hwndEdit,ADDR buffer,512</b> <br>
<b>
invoke MessageBox,NULL,ADDR buffer,ADDR AppName,MB_OK</b>
<p>您可以调用SetWindowText函数把一字符串繁缛到编辑控件中去,为了清0,传入NULL值。SetWindowText是一个通用函数,即可以用它来设定一个窗口的标题,也可以用它来改变一个按钮上的文字。如果是要得到按钮上的文字,则调用GetWindowText。
<p><b> .IF ax==ButtonID</b>
<br>
<b>
shr eax,16</b> <br>
<b>
.IF ax==BN_CLICKED</b> <br>
<b>
invoke SendMessage,hWnd,WM_COMMAND,IDM_GETTEXT,0</b> <br>
<b>
.ENDIF</b> <br>
<b> .ENDIF</b>
<p>上面的片段是处理用户按钮事件的。他首先检查wParam的高字节看是否是按钮的ID 号,若是则检查低字节看发送的消息号是否BN_CLICKED,该消息是在按钮按下时发送的,如果一切都对,则转入处理该消息,我们可以从处理消息IDM_GETTEXT处复制全部的代码,但是更专业的办法是在发送一条IDM_GETTEXT消息让主窗口过程处理,这只要把传送的消息设置为WM_COMMAND,再把wParam的低字节中设置为IDM_GETTEXT即可。这样一来您的代码就简洁了许多,所以尽可能利用该技巧。
最后,当然不是或有或无,必须在消息循环中调用函数TranslateMessage,因为您的应用程序需要在编辑框中输入可读的文字。如果省略了该函数,就不能在编辑框中输入任何东西。 </p>
<hr size="1">
<div align="center">
<script language="JavaScript1.1" src=http://ad.t2t2.com/textclick.asp?user=bigluo&style=4&bkcolor=no></script>
<br>
</div>
<!-- 10:1 文本广告交换 -->
<div align="center">
<script language="JavaScript1.1" src=http://coolsite21.com:90/c21.dll?Type=PT&id=1047&col=6&ReferID=1047&v=0></script>
<!-- 10:1 文本广告交换 --> </div>
<hr size="1">
<br>
<div align="center"> 翻译:Lxx,校对:LuoYunBin's Win32 ASM Page,<a href="http://asm.yeah.net">http://asm.yeah.net</a></div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -