Win32のASMプログラミングメニューデモと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                        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

フレーズを削除することはできません。

 

公開された475元の記事 ウォンの賞賛545 ビュー304万+

おすすめ

転載: blog.csdn.net/bcbobo21cn/article/details/104210340