📄 lion-tut-c08.htm
字号:
<br>
<b> CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\</b>
<br>
<b> 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 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_COMMAND</b> <br>
<b> mov eax,wParam</b> <br>
<b> .IF ax==IDM_TEST</b> <br>
<b> invoke
MessageBox,NULL,ADDR Test_string,OFFSET AppName,MB_OK</b> <br>
<b> .ELSEIF ax==IDM_HELLO</b> <br>
<b> invoke
MessageBox, NULL,ADDR Hello_string, OFFSET AppName,MB_OK</b> <br>
<b> .ELSEIF ax==IDM_GOODBYE</b>
<br>
<b> invoke
MessageBox,NULL,ADDR Goodbye_string, OFFSET AppName, MB_OK</b> <br>
<b> .ELSE</b> <br>
<b> invoke
DestroyWindow,hWnd</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> <br>
<b>**************************************************************************************************************************</b>
<center>
<b>Menu.rc</b>
</center>
<b>**************************************************************************************************************************</b>
<p><b>#define IDM_TEST 1</b> <br>
<b>#define IDM_HELLO 2</b> <br>
<b>#define IDM_GOODBYE 3</b> <br>
<b>#define IDM_EXIT 4</b>
<p><b>FirstMenu MENU</b> <br>
<b>{</b> <br>
<b> POPUP "&PopUp"</b> <br>
<b> {</b> <br>
<b> MENUITEM "&Say Hello",IDM_HELLO</b>
<br>
<b> MENUITEM "Say &GoodBye",
IDM_GOODBYE</b> <br>
<b> MENUITEM SEPARATOR</b>
<br>
<b> MENUITEM "E&xit",IDM_EXIT</b>
<br>
<b> }</b> <br>
<b> MENUITEM "&Test", IDM_TEST</b> <br>
<b>}</b> <br>
<h3><font color="#ff0000">分析:</font></h3>
我们先来分析资源文件:<br>
<dl><b>#define IDM_TEST 1
/* equal to IDM_TEST equ 1*/</b> <br>
<b>#define IDM_HELLO 2</b> <br>
<b>#define IDM_GOODBYE 3</b> <br>
<b>#define IDM_EXIT 4</b> <br>
</dl>
上面的几行定义了菜单项的ID号。只要注意菜单项ID号必须唯一外,您可以给ID号任何值。
<p><b>FirstMenu MENU</b>
<p>用关键字MENU定义菜单。
<p><b> POPUP "&PopUp"</b> <br>
<b> {</b> <br>
<b> MENUITEM "&Say Hello",IDM_HELLO</b>
<br>
<b> MENUITEM "Say &GoodBye",
IDM_GOODBYE</b> <br>
<b> MENUITEM SEPARATOR</b>
<br>
<b> MENUITEM "E&xit",IDM_EXIT</b>
<br>
<b> }</b>
<p>定义一个有四个菜单项的子菜单,其中第三个菜单项是一个分隔线。
<p><b> MENUITEM "&Test", IDM_TEST</b>
<p>定义主菜单中的一项。下面我们来看看源代码。<br>
<dl><b>MenuName db "FirstMenu",0
; The name of our menu in the resource file.</b> <br>
<b>Test_string db "You selected Test menu item",0</b> <br>
<b>Hello_string db "Hello, my friend",0</b> <br>
<b>Goodbye_string db "See you again, bye",0</b> <br>
</dl>
MenuName是资源文件中指定的菜单的名字。因为您可以在脚本文件中定义任意多个菜单,所以在使用前必须指定您要使用那一个,接下来的行是在选中菜单项时显示在相关对话框中的字符串。<br>
<dl><b>IDM_TEST equ 1
; Menu IDs</b> <br>
<b>IDM_HELLO equ 2</b> <br>
<b>IDM_GOODBYE equ 3</b> <br>
<b>IDM_EXIT equ 4</b> <br>
</dl>
定义用在WINDOWS窗口过程中的菜单项ID号。这些值必须和脚本文件中的相同。
<p><b> .ELSEIF uMsg==WM_COMMAND</b> <br>
<b> mov eax,wParam</b> <br>
<b> .IF ax==IDM_TEST</b> <br>
<b> invoke
MessageBox,NULL,ADDR Test_string,OFFSET AppName,MB_OK</b> <br>
<b> .ELSEIF ax==IDM_HELLO</b> <br>
<b> invoke
MessageBox, NULL,ADDR Hello_string, OFFSET AppName,MB_OK</b> <br>
<b> .ELSEIF ax==IDM_GOODBYE</b>
<br>
<b> invoke
MessageBox,NULL,ADDR Goodbye_string, OFFSET AppName, MB_OK</b> <br>
<b> .ELSE</b> <br>
<b> invoke
DestroyWindow,hWnd</b> <br>
<b> .ENDIF</b>
<p>在本窗口过程中我们处理WM_COMMAND消息。当用户选择了一个菜单项时,该菜单项的ID放入参数wParam中被同时送到WINDOWS的窗口过程,我们把它保存到eax寄存器中以便和预定义的菜单项ID比较用。前三种情况下,当我们选中Test、Say Hello、Say GoodBye菜单项时,会弹出一个对话框其中显示一个相关的字符串,选择Exit菜单项时,我们就调用函数DestroyWindow,其中的参数是我们窗口的句柄,这样就销毁了窗口。
就像您所看到的,通过在一个窗口类中指定菜单名的方法来给一个应用程序生成一个菜单是简单而直观的。除此方法外您还可以用另一种方法,其中资源文件是一样的,源文件中也只有少数的改动,这些改动如下:<br>
<dl><b>.data?</b> <br>
<b>hInstance HINSTANCE ?</b> <br>
<b>CommandLine LPSTR ?</b> <br>
<b>hMenu HMENU ?
; handle of our menu</b> <br>
</dl>
定义了一个变量来保存我们的菜单的句柄,然后:
<p> <b> invoke LoadMenu, hInst, OFFSET
MenuName</b> <br>
<b> mov hMenu,eax</b>
<br>
<b> INVOKE CreateWindowEx,NULL,ADDR
ClassName,ADDR AppName,\</b> <br>
<b> WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\</b>
<br>
<b> CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,\</b>
<br>
<b> hInst,NULL</b>
<p>调用LoadMenu函数,该函数需要实例句柄和菜单名的字符串,调用的结果返回指向菜单的句柄,然后传给函数CreateWindowEx刚返回的菜单句柄就可以了。</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>
</dl></body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -