⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directdraw.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 ASM
字号:
;******************************
;文件:DirectDraw.asm         *
;功能:演示如何使用DirectDraw *
;******************************
.386p
.model flat,stdcall
include win32.inc
extrn GetMessageA:proc
extrn TranslateMessage:proc
extrn DispatchMessageA:proc
extrn ShowWindow:proc
extrn UpdateWindow:proc
extrn CreateWindowExA:proc
extrn RegisterClassA:proc
extrn DefWindowProcA:proc
extrn MessageBoxA:proc
extrn ExitProcess:proc
extrn LoadIconA:proc
extrn LoadCursorA:proc
extrn GetStockObject:proc
extrn GetModuleHandleA:proc
extrn PostQuitMessage:proc
extrn GetSystemMetrics:proc
extrn DirectDrawCreate:proc
extrn SetBkColor:proc
extrn SetTextColor:proc
extrn TextOutA:proc
extrn SetTextAlign:proc
extrn MoveToEx:proc
extrn LineTo:proc
extrn Rectangle:proc

NULL  = 0
DD_OK = 0
DDSCL_FULLSCREEN     =    00000001H
DDSCL_EXCLUSIVE      =    00000010H
SM_CXSCREEN          =   0
SM_CYSCREEN          =   1
VK_ESCAPE        = 1BH
DDSD_CAPS               = 00000001H
DDSCAPS_PRIMARYSURFACE  = 00000200H

POINT struc
	x dd ?
	y dd ?
	ends
MSG struc
    hwnd 	dd ?
    message	dd ?
    wParam	dd ?
    lParam	dd ?
    time	dd ?
    pt		POINT<>
    ends

WNDCLASS struc
	style		dd ?
	lpfnWndProc	dd ?
	cbClsExtra	dd ?
	cbWndExtra	dd ?
	hInstance	dd ?
	hIcon		dd ?
	hCursor		dd ?
	hbrBackground	dd ?
	lpszMenuName	dd ?
	lpszClassName	dd ?
	ends

IDirectDrawVtbl	STRUC
	; IUnknown methods
	QueryInterface	dd ?
	AddRef	dd ?
	Release	dd ?
	; IDirectDraw methods
	DD_Compact	dd ?
	DD_CreateClipper	dd ?
	DD_CreatePalette	dd ?
	DD_CreateSurface	dd ?
	DD_DuplicateSurface	dd ?
	DD_EnumDisplayModes	dd ?
	DD_EnumSurfaces	dd ?
	DD_FlipToGDISurface	dd ?
	DD_GetCaps	dd ?
	DD_GetDisplayMode	dd ?
	DD_GetFourCCCodes	dd ?
	DD_GetGDISurface	dd ?
	DD_GetMonitorFrequency	dd ?
	DD_GetScanLine	dd ?
	DD_GetVerticalBlankStatus	dd ?
	DD_Initialize	dd ?
	DD_RestoreDisplayMode	dd ?
	DD_SetCooperativeLevel	dd ?
	DD_SetDisplayMode	dd ?
	DD_WaitForVerticalBlank	dd ?
	ENDS


IDirectDrawSurfaceVtbl	STRUC
	; IUnknown methods
	QueryInterface	dd ?
	AddRef	dd ?
	Release	dd ?
	; IDirectDrawSurface methods
	DDS_AddAttachedSurface	dd ?
	DDS_AddOverlayDirtyRect	dd ?
	DDS_Blt	dd ?
	DDS_BltBatch	dd ?
	DDS_BltFast	dd ?
	DDS_DeleteAttachedSurface	dd ?
	DDS_EnumAttachedSurfaces	dd ?
	DDS_EnumOverlayZOrders	dd ?
	DDS_Flip	dd ?
	DDS_GetAttachedSurface	dd ?
	DDS_GetBltStatus	dd ?
	DDS_GetCaps	dd ?
	DDS_GetClipper	dd ?
	DDS_GetColorKey	dd ?
	DDS_GetDC	dd ?
	DDS_GetFlipStatus	dd ?
	DDS_GetOverlayPosition	dd ?
	DDS_GetPalette	dd ?
	DDS_GetPixelFormat	dd ?
	DDS_GetSurfaceDesc	dd ?
	DDS_Initialize	dd ?
	DDS_IsLost	dd ?
	DDS_mLock	dd ?
	DDS_ReleaseDC	dd ?
	DDS_Restore	dd ?
	DDS_SetClipper	dd ?
	DDS_SetColorKey	dd ?
	DDS_SetOverlayPosition	dd ?
	DDS_SetPalette	dd ?
	DDS_Unlock	dd ?
	DDS_UpdateOverlay	dd ?
	DDS_UpdateOverlayDisplay	dd ?
	DDS_UpdateOverlayZOrder	dd ?
	ENDS

DDPIXELFORMAT	STRUC
	dwSize				DWORD		?
	dwFlags				DWORD		?
	dwFourCC			DWORD		?
	dwRGBBitCount		DWORD		?
	dwRBitMask			DWORD		?
	dwGBitMask			DWORD		?
	dwBBitMask			DWORD		?
	dwRGBAlphaBitMask	DWORD		?
	ENDS

DDCOLORKEY	STRUC
	dwColorSpaceLowValue		DWORD		?
	dwColorSpaceHighValue		DWORD		?
	ENDS

DDSCAPS		STRUC
	dwCaps			DWORD		?
	ENDS

DDSURFACEDESC	STRUC
	dwSize				DWORD		?
	dwFlags				DWORD		?
	dwHeight			DWORD		?
	dwWidth				DWORD		?
	lPitch				DWORD		?
	dwBackBufferCount	DWORD		?
	dwMipMapCount		DWORD		?
	dwAlphaBitDepth		DWORD		?
	dwReserved			DWORD		?
	lpSurface			DWORD		?
	ddckCKDestOverlay	DDCOLORKEY		<>
	ddckCKDestBlt		DDCOLORKEY		<>
	ddckCKSrcOverlay	DDCOLORKEY		<>
	ddckCKSrcBlt		DDCOLORKEY		<>
	ddpfPixelFormat		DDPIXELFORMAT	<>
	ddsCaps				DDSCAPS			<>
	ENDS

.data
	Text		db 'Left ButtonDown',0
	myclassname	db 'MyClass',0
	caption		db 'Direct Draw Sample',0
	Err			db 'Error',0
	szMsg1		db 'Hello ,DirectDraw !',0
	szMsg2		db 'To exit ,Press ESC',0
	align 4
	hInst		dd ?
	hWnd		dd ?
	hdc			dd 0
	lpDD		dd 0
	lpDDSPrimary dd 0
	msg		MSG<>
	wc		WNDCLASS<>
	ddsd	DDSURFACEDESC<>

.code
main:
	call	InitMainWindow	;初始化主窗口
	call	InitDirectDraw	;初始化DirectDraw

MsgLoop:	;消息循环
	call	GetMessageA,offset msg,0,0,0
	or		eax,eax
	jz		Exit
	call	TranslateMessage,offset msg
	call	DispatchMessageA,offset msg
	jmp		MsgLoop
Exit:
	call	ExitProcess,0

;**********************************************************
;消息处理函数
WinMsgProc  proc uses ebx edi esi, handle:DWORD, wMsg:DWORD, wParam1:DWORD, lParam1:DWORD
	cmp		wMsg,WM_CREATE
	jz		create
	cmp		wMsg,WM_DESTROY
	jz		destory
	cmp		wMsg,WM_LBUTTONDOWN
	jz		lbuttondown
	cmp		wMsg,WM_KEYDOWN
	jz		keydown
	jmp		default
create:
	xor		eax,eax
	ret
keydown:
	mov		ebx,wParam1
	cmp		ebx,VK_ESCAPE	;按下了ESC?
	jnz		default
	jmp		destory
destory:	;退出
	call	FreeDirectDraw
	call	PostQuitMessage,0
	xor		eax,eax
	ret
lbuttondown:
	call	DrawIt
	xor		eax,eax
	ret
default:
	call	DefWindowProcA,handle,wMsg,wParam1,lParam1
	ret
WinMsgProc  endp
;***************************************************************
;初始化主窗口
InitMainWindow proc
	call	GetModuleHandleA,0
	mov		[hInst],eax
	
	mov		wc.lpszClassName,offset myclassname
	mov		eax,[hInst]
    mov		wc.hInstance,eax
	mov		wc.lpfnWndProc,offset WinMsgProc
	call	LoadIconA,0,IDI_APPLICATION
	mov		wc.hIcon,eax
	call	LoadCursorA,0,IDC_IBEAM
	mov		wc.hCursor,eax
	mov		wc.lpszMenuName,0
	call	GetStockObject,WHITE_BRUSH
	mov		wc.hbrBackground,eax
	mov		wc.style,CS_HREDRAW or CS_VREDRAW or CS_GLOBALCLASS
	mov		wc.cbClsExtra,0
	mov		wc.cbWndExtra,0

	call	RegisterClassA,offset wc	;注册窗口类

	call	GetSystemMetrics,SM_CXSCREEN
	push	eax
	call	GetSystemMetrics,SM_CYSCREEN
	pop		ebx
	;建立窗口
	call	CreateWindowExA,0,offset myclassname,offset caption,WS_POPUP,0,0,ebx,eax,0,0,[hInst],0
	mov		[hWnd],eax

	call	ShowWindow,[hWnd],1
	call	UpdateWindow,[hWnd]
	ret
InitMainWindow endp
;***************************************************************
;初始化DirectDraw
InitDirectDraw proc
	;生成DirectDraw对象
	call	DirectDrawCreate,NULL,offset lpDD,NULL
	cmp		eax,DD_OK
	jnz		@Error
	;独占、全屏模式
	mov		eax,lpDD
	mov		eax,[eax]
	call	[eax+IDirectDrawVtbl.DD_SetCooperativeLevel],lpDD,hWnd,DDSCL_EXCLUSIVE OR DDSCL_FULLSCREEN
	cmp		eax,DD_OK
	jnz		@Error
	;设置显示分辨率
	mov		eax,lpDD
	mov		eax,[eax]
	call	[eax+IDirectDrawVtbl.DD_SetDisplayMode],lpDD,640,480,8
	cmp		eax,DD_OK
	jnz		@Error
	;建立主页面
	mov		ddsd.dwSize,size DDSURFACEDESC
	mov		ddsd.dwFlags , DDSD_CAPS
	mov		ddsd.ddsCaps.dwCaps , DDSCAPS_PRIMARYSURFACE
	mov		eax,lpDD
	mov		eax,[eax]
	call	[eax+IDirectDrawVtbl.DD_CreateSurface],lpDD,offset ddsd, offset lpDDSPrimary, NULL
	cmp		eax,DD_OK
	jnz		@Error
	ret
@Error:
	call Fail	
	ret
InitDirectDraw endp
;***************************************************************
;用DirectDraw的兼容DC在主窗口上输出文字和图案
DrawIt	proc
	;取DC
	mov		eax,lpDDSPrimary
	mov		eax,[eax]
	call	[eax+IDirectDrawSurfaceVtbl.DDS_GetDC],lpDDSPrimary,offset hdc
	;输出
	call	SetBkColor, hdc,0FF0000H;RGB( 0, 0, 255 )
	call	SetTextColor, hdc, 0FFFFH;RGB( 255, 255, 0 )
	call	TextOutA, hdc, 200, 200,offset szMsg1, 19
	call	TextOutA, hdc, 200, 220,offset szMsg2, 18
	call	Rectangle, hdc, 50,100,200,200
	call	MoveToEx,hdc,0,0,NULL
	call	LineTo,hdc,640,480
	;输出DC
	mov		eax,lpDDSPrimary
	mov		eax,[eax]
	call	[eax+IDirectDrawSurfaceVtbl.DDS_ReleaseDC],lpDDSPrimary,hdc	

	ret
DrawIt	endp	
;******************************************************
;删除DirectDraw和DirectDrawSuface对象
FreeDirectDraw proc
	cmp		lpDDSPrimary,NULL
	jz		FreeDD
	mov		eax,lpDDSPrimary
	mov		eax,[eax]
	call	[eax+IDirectDrawSurfaceVtbl.Release],lpDDSPrimary	
FreeDD:
	cmp		lpDD,NULL
	jz		FreeDirectDrawEnd
	mov		eax,lpDD
	mov		eax,[eax]
	call	[eax+IDirectDrawVtbl.Release],lpDD
FreeDirectDrawEnd:
	ret
FreeDirectDraw endp
;******************************************************
Fail	proc
	call	MessageBoxA,NULL,offset Err,offset caption,MB_OK
	call	ExitProcess,0
Fail	endp
	end main

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -