;----------------
;编译模式="EXE"
;----------------
;本程序是我(lixner)参考《电脑爱好者》2003年第7期的《用Delphi写小游戏之华容道》,在此对原作者表示感谢!
;本程序所包含的资源文件(图片),系我从网上下载并设计制作的,只是为了代替文字,让界面更好看些,没其它的意
;思,如果有关的人不同意,我将予以删除并向您道谦!
;由于我也是初学者,所以程序中难免有不当之处,请大家谅解,并请大家指正,谢谢!
;如果你有更好的算法或者有更好的思路或好的参考资料、电子书等等,请发给我一份:lixner@126.com 谢谢!
.386
.model flat, stdcall
option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib kernel32.lib
includelib gdi32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;************** Equ 数据 **********************************
IDM_MAIN equ 2000
IDM_EXIT equ 2002
;************** Equ 数据 **********************************
IDB_0 equ 3000
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
x db ? ;坐标x
y db ? ;坐标y
oldx db ? ;源位置
oldy db ?
newx db ? ;新位置
newy db ?
myi db ?
myj db ?
;>>>>>>>>>>>>>>>>>>>>>>>
hInstance dd ?
hWinMain dd ?
hCursor dd ?
hMenu dd ?
hmyDc dd ?
hBmpBack dd ?
hDcBack dd ?
;************** 数据段 ************************************
.data
mymap dd 03ff0102h ;02 01 ff 03
dd 0ffffffffh ;ff ff ff ff
dd 05ff0604h ;04 06 ff 05
dd 0ff0809ffh ;ff 09 08 ff
dd 00888807h ;07 88 88 00
mygood dd 00000000h
szClassName db 'lixner',0
good db 'G O O D !!!',0
good1 db ' G O O D !!!',13,10,13,10,' By lixner',13,10,13,10
db'mailto: lixner@126.com',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
call _WinMain
invoke ExitProcess,NULL
;********************************************************************
; 将窗口移动到屏幕中间
; 参数:窗口句柄
;********************************************************************
_CenterWindow proc hWnd:DWORD
local @stRectDeskTop:RECT,@stRectWin:RECT
local @dwWidth:DWORD,@dwHeight:DWORD
invoke GetWindowRect,hWnd,addr @stRectWin
invoke GetDesktopWindow
mov ebx,eax
invoke GetWindowRect,ebx,addr @stRectDeskTop
mov eax,@stRectWin.bottom
sub eax,@stRectWin.top
mov @dwHeight,eax
mov eax,@stRectWin.right
sub eax,@stRectWin.left
mov @dwWidth,eax
mov ebx,@stRectDeskTop.bottom
sub ebx,@dwHeight
shr ebx,1
mov ecx,@stRectDeskTop.right
sub ecx,@dwWidth
shr ecx,1
invoke MoveWindow,hWnd,ecx,ebx,@dwWidth,@dwHeight,FALSE
ret
_CenterWindow endp
;********************************************************************
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWcMain:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL ;模块句柄
mov hInstance,eax
invoke LoadMenu,hInstance,IDM_MAIN ;加载菜单
invoke GetSubMenu,eax,0 ;PopUp 菜单要用到子菜单
mov hMenu,eax
invoke MessageBox,0,offset good1,offset good,0
;*************** 注册窗口类 *****************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWcMain.hCursor,eax
mov @stWcMain.cbSize,sizeof WNDCLASSEX
mov @stWcMain.hIconSm,0
mov @stWcMain.style,CS_HREDRAW or CS_VREDRAW
mov @stWcMain.lpfnWndProc,offset WndMainProc
mov @stWcMain.cbClsExtra,0
mov @stWcMain.cbWndExtra,0
mov eax,hInstance
mov @stWcMain.hInstance,eax
mov @stWcMain.hIcon,0
mov @stWcMain.hbrBackground,COLOR_WINDOW + 1
mov @stWcMain.lpszClassName,offset szClassName
mov @stWcMain.lpszMenuName,0
invoke RegisterClassEx,addr @stWcMain
;***************** 建立输出窗口 *****************************************
; 属性:没有标题栏,不显示在任务栏
;********************************************************************
invoke CreateWindowEx,WS_EX_TOOLWINDOW,\
offset szClassName,NULL,\
WS_POPUP or WS_SYSMENU,\
0,0,230,280,\
NULL,NULL,hInstance,NULL
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndMainProc proc uses ebx edi esi, \
hWnd:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
local @stPos:POINT
local @stPs:PAINTSTRUCT,@hDC:DWORD
LOCAL ps :PAINTSTRUCT
mov eax,uMsg
.if eax == WM_CREATE
mov eax,hWnd
mov hWinMain,eax
call _Init
;********************************************************************
.elseif eax == WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDC,eax
mov eax,@stPs.rcPaint.right
sub eax,@stPs.rcPaint.left
mov ecx,@stPs.rcPaint.bottom
sub ecx,@stPs.rcPaint.top
invoke BitBlt,@hDC,@stPs.rcPaint.left,@stPs.rcPaint.top,eax,ecx,\
hDcBack,200,@stPs.rcPaint.top,SRCCOPY
invoke EndPaint,hWnd,addr @stPs
invoke GetDC,hWnd
mov hmyDc,eax
call _paint
invoke ReleaseDC,hWinMain,hWnd
;********************************************************************
; 由于没有菜单,下面代码用于按下右键时弹出POPUP菜单
;********************************************************************
.elseif eax == WM_RBUTTONDOWN
.if wParam == MK_RBUTTON
invoke GetCursorPos,addr @stPos
invoke TrackPopupMenu,hMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
.endif
;********************************************************************
; 由于没有标题栏,下面代码用于按下左键时移动窗口
;********************************************************************
.elseif eax == WM_LBUTTONDOWN
mov eax,lParam
movzx ecx,ax ; x
shr eax,16 ; y
.if eax<15d
invoke UpdateWindow,hWnd ;即时刷新
invoke ReleaseCapture
invoke SendMessage,hWnd,WM_NCLBUTTONDOWN,HTCAPTION,0
.elseif eax>15d && ecx>15d
sub eax,15d
sub ecx,15d
mov bl,50d
div bl
mov x,al
mov eax,ecx
div bl
mov y,al
add al,x
cmp al,7h
ja down
call _formmousedown
.endif
down:
;********************************************************************
.elseif eax == WM_LBUTTONUP
mov eax,lParam
movzx ecx,ax ; x
shr eax,16 ; y
.if eax>15d && ecx>15d
sub eax,15d
sub ecx,15d
mov bl,50d
div bl
mov newx,al
mov eax,ecx
div bl
mov newy,al
add al,newx
cmp al,7h
ja UP
call _formmouseup
.endif
UP:
invoke SendMessage,hWinMain,WM_PAINT,0,offset szClassName
mov ebx,03h
mov ecx,01h
.if BYTE ptr [mymap+ebx*4+ecx]==01h
invoke MessageBox,0,offset good1,offset good,0
.endif
;********************************************************************
.elseif eax == WM_COMMAND
.if lParam == 0
mov eax,wParam
.if ax == IDM_EXIT
call _Quit
.endif
.endif
;********************************************************************
.elseif eax == WM_CLOSE
call _Quit
;********************************************************************
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;********************************************************************
; 注意:WndProc 处理 Windows 消息后,必须在 Eax 中返回 0
; 但是由 DefWindowProc 处理后的返回值不能改变,否则窗口
; 将无法显示!
;********************************************************************
xor eax,eax
ret
WndMainProc endp
_Init proc
local @hDC
invoke SendMessage,hWinMain,WM_SETTEXT,0,offset szClassName
invoke LoadBitmap,hInstance,IDB_0 ;装入背景图片
mov hBmpBack,eax
invoke GetDC,hWinMain
mov @hDC,eax
invoke CreateCompatibleDC,@hDC ;建立背景及数字 DC
mov hDcBack,eax
invoke ReleaseDC,hWinMain,@hDC
invoke SelectObject,hDcBack,hBmpBack
invoke _CenterWindow,hWinMain
invoke SetWindowPos,hWinMain,HWND_TOPMOST,0,0,0,0,\
SWP_NOMOVE or SWP_NOSIZE
ret
_Init endp
;********************************************************************
_Quit proc
local @stWindow:RECT
invoke DestroyMenu,hMenu
invoke DeleteDC,hDcBack
invoke DeleteObject,hBmpBack
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
ret
_Quit endp
未完
[此贴子已经被作者于2006-10-15 18:59:26编辑过]