使用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 0x6004
ICO_MAIN ICON "Main.ico"
IDM_MAIN menu discardable
BEGIN
popup "物资信息"
BEGIN
menuitem "添加物资", IDM_ADDWZ
menuitem "更新物资", IDM_UPDATEWZ
menuitem "删除物资", IDM_DELWZ
menuitem separator
menuitem "查询物资", IDM_QUERYWZ
END
popup "仓库信息"
BEGIN
menuitem "添加仓库", IDM_ADDCK
menuitem "更新仓库", IDM_UPDATECK
menuitem "删除仓库", IDM_DELCK
menuitem separator
menuitem "查询仓库", IDM_QUERYCK
END
popup "帮助" ,HELP
BEGIN
menuitem "帮助主题", IDM_HELP
menuitem separator
menuitem "关于本程序...",IDM_ABOUT
END
END
ASMファイル;
; Win32 菜单 Demo,by bobo
.386
.model flat, stdcall
option casemap :none
include \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 _dwCommandID
local @szBuffer[256]:byte
pushad
invoke wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
invoke MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OK
popad
ret
_DisplayMenuItem endp
_Quit proc
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
ret
_Quit endp
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam
mov eax,uMsg
.if eax == WM_CREATE
.elseif eax == WM_COMMAND
invoke _DisplayMenuItem,wParam
.elseif eax == WM_CLOSE
call _Quit
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
xor eax,eax
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
local @hAccelerator
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke LoadMenu,hInstance,IDM_MAIN
mov hMenu,eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
invoke LoadIcon,hInstance,ICO_MAIN
mov @stWndClass.hIcon,eax
mov @stWndClass.hIconSm,eax
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\
offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW,\
100,100,400,300,\
NULL,hMenu,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
.if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endif
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
コマンドラインビルド:
G:\ MASM32 \含む:\ win32ASM \ MISMenuDemo>セットは= G含みます
G:\ win32ASM \ MISMenuDemo>セットLIB = G:\ MASM32 \ libに
G:\ win32ASM \ MISMenuDemo>セットパス= G:\ MASM32 \ビン;%パス%
G:\ win32ASM \ MISMenuDemo>ミリリットル/ C / COFF wz.asm
のMicrosoft(R)マクロアセンブラバージョン6.14.8444
著作権(C)マイクロソフト社1981年から1997年。全著作権所有。
組み立て:wz.asm
***********
ASCIIビルド
***********
G:\ win32ASM \ MISMenuDemo> RC wz.rc
G:\ win32ASM \ MISMenuDemo>リンク/サブシステム:wz.res wz.obj窓
のMicrosoft(R)をインクリメンタルリンカーバージョン5.12.8078
著作権(C)マイクロソフト社1992年から1998年。全著作権所有。
G:\ win32ASM \ MISMenuDemo>
結果;
メニュー項目は、メニュー項目を定義し使用して、BEGIN ... ENDを内側にして含まれているメニューのドロップダウン項目のうち、ドロップダウンメニューの項目を定義するポップアップを使用してリソースファイル。
二つのサブアセンブリコードのプロセスがありますが、_DisplayMenuItemは、ID値を表示するには、メニューをクリックし、_Quitは、撤退します。
プロセス内のメインダイアログで何もドライ、メニューをクリックすると、あなたが行う、WM_COMMANDメッセージを受け取ります
_DisplayMenuItem、wParamに呼び出し
メニュー表示識別値をクリックします。
各メニュー識別子の値を定義しているリソース・ファイルに、と定義された同等のEQUを定義して、ASMファイルで、これはどのような状況であり、なぜそれを2回定義する必要があり、クラウドビン弟のWin32もこれと他のEQUが含まれているアセンブラました値が定義されています。
Cうち、RESOURCE.Hファイルで識別されたリソースの値の一般的な定義、及びそれにRESOURCE.Hを含みます。
また、リソース識別子を必要とし、RCコマンドの.RCにコンパイルファイル.RES文書を使用して、コンパイルは、それぞれが異なる場合なので、ファイルOBJミリリットルasmコマンドはアセンブラ識別されるリソースの値を使用した場合、それが必要である;のrcファイルが別々にコンパイルされています値は、それぞれ、これら2つが異なっています。
等価性を定義することが必要である。唯一のASMの統合開発環境、ミリリットルとRCヘルプのあなた、それが実行されると、定義されたコードが必要とされているEQU。
ここでは、メッセージループ、
呼び出しTranslateAccelerator、hWinMain、@ hAccelerator、addrの@stMsg
フレーズを削除することはできません。