使用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 为什么需要等值定义相关推荐

  1. Win32 ASM 简单对话框编程Demo

    一.  ASM基本对话框 asm文件: ;>>>>>>>>>>>>>>>>>>>> ...

  2. win32下Socket编程(1)

    一.win32的socket编程,是socket编程中比较经典也比较基础的一部分,根据传输方式和协议的区别,可以简单的分为TCP传递和UDP传递两种.这篇文章主要是阐述基于TCP的Socket编程. ...

  3. win32,win64编程永恒;语言编程需要注意的64位

    win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 作者:拳拳的Blog | 出处:博客园 | 2011/12/10 7:17:51 | 阅读 79次 一.数据类型特别是int相 ...

  4. 【ASM学习】普通数据库向ASM实例的迁移(二)

    --接着rman的做 在rman恢复时,数据库是mount状态的,这里需要将数据打开!ORCL>conn system/yang[@]orcl as sysdba 已连接. ORCL>al ...

  5. VC++学习(6):菜单编程

    1.       MFC中的顶层菜单默认为弹出菜单(Pop-up),它是不能用来作命令响应的,当取消Pop-up选项后可接受命令响应. 2.       消息的分类:标准消息,命令消息,通告消息. [ ...

  6. oracle asm和文件系统,Oracle工具之--ASM与文件系统及跨网络传输文件

    Oracle工具之--ASM与文件系统及跨网络传输文件 Oracle DBMS_FILE_TRANSFER可以实现文件系统和ASM磁盘组之间实现文件传输及ASM磁盘组之间跨网络的传输. DBMS_FI ...

  7. 解决ORA-15097 Cannot shutdown ASM if OCR is Located in ASM

    环境介绍: 数据库版本: oracle 11.2.0.1 数据库平台:所有平台 [@more@] 问题现象: 当你试图关闭ASM的时候,报以下错误: ORA-15097: cannot SHUTDOW ...

  8. CGLIB依赖ASM(关于java字节码框架ASM的学习)

    本文转自: http://www.cnblogs.com/liuling/archive/2013/05/25/asm.html 一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生 ...

  9. RedHat5.2下Linux Oracle 10g ASM 安装详细实录-第二篇-ASM安装

    五.安装ASM 1.在oracle网站下载支持包: http://www.oracle.com/technology ... x/asmlib/rhel5.html 2.根据linux内核下载相应的a ...

最新文章

  1. 前端javascript实现二进制读写操作
  2. 安装mysql-8.0.13-winx64遇到的问题和亲测有效的安装方法
  3. [云炬创业基础笔记]第二章创业者测试19
  4. 响应QML中的用户输入
  5. python临床数据_从临床试验中获取数据
  6. 华为root工具_华为手机EMUI9 ROOT通用操作方法
  7. Python-cvxopt库的使用(1)(解决LP问题)
  8. MySQL怎么查游戏内邮件附件_怎么查询游戏mysql账号密码
  9. iscsi-target
  10. eigen3.3.8帮助文档下载 chm_惠普7500A驱动下载-惠普hp 7500A打印机驱动下载 v28.8官方版...
  11. Python Numpy中reshape函数参数-1的含义
  12. 织梦支持php版本,DedeCMS不支持PHP5.3、5.4及以上版本后台500错误白屏的解决方法...
  13. redhat7的wget使用
  14. JAVA电影院售票系统毕业设计 开题报告
  15. pdf编辑工具linux,7个Ubuntu下的PDF编辑工具
  16. WORD中如何调整字间距
  17. ssm教务系统网站 毕业设计-附源码290915
  18. [CSP2020]儒略日
  19. 牛逼的人,都不太要面子
  20. DeFi中价值千万的关键字Gitcoin

热门文章

  1. tomcat部署项目
  2. ADB连接小米手机模拟上下左右滑动实例演示
  3. 打开和关闭mysql服务的两种方法
  4. 在matlab中提取线性方程组的系数矩阵
  5. 【HDU1495非常可乐】【POJ3414Pots】
  6. OpenCV中使用神经网络 CvANN_MLP
  7. 2.1.5 梯度检验
  8. vue打包配置发布路径
  9. spring-cloud-sleuth+zipkin追踪服务实现(一)
  10. .NET Core Community 第二个千星项目诞生:Util