;----------------
;编译模式="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编辑过]

 
											





 VJUugeko.rar
VJUugeko.rar 
	    


