欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义

发布时间:2025/4/14 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

使用Win32 ASM制作一个窗口菜单;

资源文件;

#define ICO_MAIN 0x1000 //图标 #define IDM_MAIN 0x2000 //菜单#define IDM_HELP 0x4301 #define IDM_ABOUT 0x4302 #define IDM_ADDWZ 0x5001 #define IDM_UPDATEWZ 0x5002 #define IDM_DELWZ 0x5003 #define IDM_QUERYWZ 0x5004 #define IDM_ADDCK 0x6001 #define IDM_UPDATECK 0x6002 #define IDM_DELCK 0x6003 #define IDM_QUERYCK 0x6004ICO_MAIN ICON "Main.ico"IDM_MAIN menu discardableBEGINpopup "物资信息"BEGINmenuitem "添加物资", IDM_ADDWZmenuitem "更新物资", IDM_UPDATEWZmenuitem "删除物资", IDM_DELWZmenuitem separatormenuitem "查询物资", IDM_QUERYWZENDpopup "仓库信息"BEGINmenuitem "添加仓库", IDM_ADDCKmenuitem "更新仓库", IDM_UPDATECKmenuitem "删除仓库", IDM_DELCKmenuitem separatormenuitem "查询仓库", IDM_QUERYCKENDpopup "帮助" ,HELPBEGINmenuitem "帮助主题", IDM_HELPmenuitem separatormenuitem "关于本程序...",IDM_ABOUTENDEND

asm文件;

; Win32 菜单 Demo,by bobo.386.model flat, stdcalloption casemap :noneinclude \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib; Equ 等值定义 ICO_MAIN equ 1000h ;图标 IDM_MAIN equ 2000h ;菜单 IDM_HELP equ 4301h IDM_ABOUT equ 4302h IDM_ADDWZ equ 0x5001 IDM_UPDATEWZ equ 0x5002 IDM_DELWZ equ 0x5003 IDM_QUERYWZ equ 0x5004 IDM_ADDCK equ 0x6001 IDM_UPDATECK equ 0x6002 IDM_DELCK equ 0x6003 IDM_QUERYCK equ 0x6004; 数据段.data? hInstance dd ? hWinMain dd ? hMenu dd ?; 数据段.const szClassName db 'MIS Menu Demo',0 szCaptionMain db 'MIS Menu ',0 szMenuHelp db '帮助主题',0 szMenuAbout db '关于本程序...',0 szCaption db '菜单选择',0 szFormat db '您选择了菜单命令:%08x',0; 代码段.code _DisplayMenuItem proc _dwCommandIDlocal @szBuffer[256]:bytepushadinvoke wsprintf,addr @szBuffer,addr szFormat,_dwCommandIDinvoke MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OKpopadret_DisplayMenuItem endp_Quit procinvoke DestroyWindow,hWinMaininvoke PostQuitMessage,NULLret_Quit endp_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParammov eax,uMsg.if eax == WM_CREATE.elseif eax == WM_COMMANDinvoke _DisplayMenuItem,wParam.elseif eax == WM_CLOSEcall _Quit.elseinvoke DefWindowProc,hWnd,uMsg,wParam,lParamret.endif ;********************************************************************xor eax,eaxret_ProcWinMain endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _WinMain proclocal @stWndClass:WNDCLASSEXlocal @stMsg:MSGlocal @hAcceleratorinvoke GetModuleHandle,NULLmov hInstance,eaxinvoke LoadMenu,hInstance,IDM_MAINmov hMenu,eax;******************************************************************** ; 注册窗口类 ;********************************************************************invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClassinvoke LoadIcon,hInstance,ICO_MAINmov @stWndClass.hIcon,eaxmov @stWndClass.hIconSm,eaxinvoke LoadCursor,0,IDC_ARROWmov @stWndClass.hCursor,eaxpush hInstancepop @stWndClass.hInstancemov @stWndClass.cbSize,sizeof WNDCLASSEXmov @stWndClass.style,CS_HREDRAW or CS_VREDRAWmov @stWndClass.lpfnWndProc,offset _ProcWinMainmov @stWndClass.hbrBackground,COLOR_WINDOW + 1mov @stWndClass.lpszClassName,offset szClassNameinvoke RegisterClassEx,addr @stWndClass ;******************************************************************** ; 建立并显示窗口 ;********************************************************************invoke CreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szCaptionMain,\WS_OVERLAPPEDWINDOW,\100,100,400,300,\NULL,hMenu,hInstance,NULLmov hWinMain,eaxinvoke ShowWindow,hWinMain,SW_SHOWNORMALinvoke UpdateWindow,hWinMain ;******************************************************************** ; 消息循环 ;********************************************************************.while TRUEinvoke GetMessage,addr @stMsg,NULL,0,0.break .if eax == 0invoke TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg.if eax == 0invoke TranslateMessage,addr @stMsginvoke DispatchMessage,addr @stMsg.endif.endwret_WinMain endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start:call _WinMaininvoke ExitProcess,NULL ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end start

命令行构建:

G:\win32ASM\MISMenuDemo>set include=g:\masm32\include

G:\win32ASM\MISMenuDemo>set lib=g:\masm32\lib

G:\win32ASM\MISMenuDemo>set path=g:\masm32\bin;%path%

G:\win32ASM\MISMenuDemo>ml /c /coff wz.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: wz.asm

***********
ASCII build
***********

G:\win32ASM\MISMenuDemo>rc wz.rc

G:\win32ASM\MISMenuDemo>Link /subsystem:windows wz.obj wz.res
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

G:\win32ASM\MISMenuDemo>

结果;

 

资源文件里使用popup定义一个下拉出来的菜单项,下拉出来的菜单项包含在BEGIN...END里面,使用menuitem定义一个菜单项;

 

汇编代码有2个子过程;_DisplayMenuItem,显示单击的菜单标识值;_Quit,退出;

在主对话框过程里啥也没干;当单击菜单,收到WM_COMMAND消息,执行

invoke    _DisplayMenuItem,wParam

显示单击的菜单标识值;

 

在资源文件里面定义了各菜单标识的值;在asm文件里面又定义了等值equ定义;这是啥情况;为什么要定义2次呢;云彬兄的Win32汇编程序里面也都包含这个equ等值定义;

搞C的时候,一般在resource.h文件里定义资源标识的值,然后包含resource.h就可以了;

因为汇编的时候各是各的,使用ml命令把asm汇编为obj文件时需要资源标识的值;rc文件是单独编译;使用rc命令把.rc文件编译为.RES文件的时候,也需要资源标识的值;这两次各是各的;

所以需要等值定义;只是在asm集成开发环境里,ml和rc它一次帮你执行了;代码里是需要equ定义的;

 

此处,消息循环里,

invoke    TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg

这句不能删除;

 

总结

以上是生活随笔为你收集整理的Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。