독서 노트 - Windows 환경에서 32비트 어셈블리 언어 프로그램 설계 (5) 모드 대화상자

2190 단어 windows
리소스는 VC 같은 것으로 생성된 다음 복사할 수 있습니다.
예를 들어 MFC 프로젝트마다 리소스가 있습니다.h, 아무런 수정도 하지 않았을 때, 이 Resource.h 파일은 원래 자체로 가지고 있던 것이다.자원에 대한 수정과 추가 같은 것을 진행할 때, 새로 추가된 자원의 ID는 이 프로젝트의 Resource에 추가됩니다.h중.Win32 어셈블리의 RC 파일에 처음에 포함된 Resource.h는 아무런 수정도 하지 않았기 때문에 새로 추가된 자원의 ID를 #define 매크로로 추가합니다.
#include <resource.h>

#define IDD_DLG 130
#define IDC_BTN_TEST 1001
#define IDI_ICO_HEHE 1002

IDI_ICO_HEHE ICON	"hehe.ico"

IDD_DLG DIALOGEX 0, 0, 316, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "     "
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "  ",IDOK,205,69,50,14
    PUSHBUTTON      "  ",IDCANCEL,259,69,50,14
    PUSHBUTTON      "  ",IDC_BTN_TEST,113,18,50,14
END
ASM 파일에 대해 이것은 당연히 손으로 써야 한다.
DialogBoxParam의 콜백 함수에 대해서는 반드시 판단 논리를 잘 써야 한다.이것은 VC에서 디버깅하는 것보다 좋지 않다.
또한 응용 프로그램의 실례는 dd이지만, 잘못 쓰면 알림이 있을 수 있어서 다행이다.
RC 파일에 있는 컨트롤 ID를 정의하는 것을 잊지 마십시오. 그러나 컴파일을 쓰지 않았을 때도 알림이 있을 수 있어서 다행입니다.
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib

IDD_DLG equ 130
IDC_BTN_TEST equ 1001
IDI_ICO_HEHE equ 1002

.data
gszCaption	db	'Caption',0
gszText		db	'Text',0
.data?
ghInstance	dd	?

.code
DlgFunc proc uses ebx edi esi hWnd,wMsg,wParam,lParam
	
	mov eax,wMsg
	.if eax==WM_CLOSE
		invoke EndDialog,hWnd,NULL
	.elseif eax==WM_INITDIALOG
		invoke LoadIcon,ghInstance,IDI_ICO_HEHE
		invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
	.elseif eax==WM_COMMAND
		mov eax,wParam
		.if ax==IDOK
			invoke EndDialog,hWnd,NULL
		.elseif ax==IDC_BTN_TEST
			invoke MessageBox,hWnd,addr gszText,addr gszCaption,MB_OK
		.endif
	.else
			mov eax,FALSE
			ret
	.endif
	
	mov eax,TRUE
	ret
DlgFunc endp

start:
	invoke GetModuleHandle,NULL
	mov ghInstance,eax
	invoke DialogBoxParam,ghInstance,IDD_DLG,NULL,addr DlgFunc,NULL
	invoke ExitProcess,NULL
end start

좋은 웹페이지 즐겨찾기