?? directdraw.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 + -