Ну, в общем, помучаться пришлось... Но не зря! Короче у меня получилось, то что я хотел. Конечно далеко не шедевр! Думаю что можно все проще сделать. Ну для меня и это пока пойдет! Я же еще Чайник
) Короче привожу свой пример (профессионалов прошу не смеяться! см. мое имя выше
Правда без коментариев, ну да ничего.
;--------------------------
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
ClassName db "MyClass",0
AppName db "Прикол",0
ButtonClassName db "button",0
ButtonText db "ХА-ХА-ХА",0
.data?
hInstance HINSTANCE ?
hwndButton HWND ?
CurX dd ?
CurY dd ?
ButtonXCenter dd ?
ButtonYCenter dd ?
.const
ButtonID equ 1
CenterX equ 35
CenterY equ 15
MaxX equ 425
MaxY equ 450
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL,SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPED OR WS_CAPTION OR WS_SYSMENU OR WS_MINIMIZEBOX,CW_USEDEFAULT,\
CW_USEDEFAULT,500,500,NULL,NULL,\
hInst,NULL
mov hwnd,eax
INVOKE ShowWindow,hwnd,SW_SHOWNORMAL
INVOKE UpdateWindow, hwnd
.WHILE TRUE
INVOKE GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL hdc:HDC
LOCAL ps:PAINTSTRUCT
LOCAL pt:POINT
.IF uMsg==WM_DESTROY
invoke DeleteObject,hBitmap
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
200,400,70,30,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
mov CurX,200
mov CurY,400
.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd,ADDR ps
mov hdc,eax
;......
invoke DeleteDC,hMemDC
invoke EndPaint,hWnd, ADDR ps
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF ax==ButtonID
shr eax,16
.IF ax==BN_CLICKED
invoke GetCursorPos,addr pt
invoke ScreenToClient,hWnd,addr pt
add pt.y,25
invoke ClientToScreen,hWnd,addr pt
invoke SetCursorPos,pt.x,pt.y
.ENDIF
.ENDIF
.ELSEIF uMsg==WM_MOUSEMOVE
invoke GetCursorPos,addr pt
invoke ScreenToClient,hWnd,addr pt
mov eax,CurX
sub eax,10
cmp pt.x,eax
jl finisch
mov eax,CurY
sub eax,10
cmp pt.y,eax
jl finisch
mov eax,CurX
add eax,80
cmp pt.x,eax
jg finisch
mov eax,CurY
add eax,40
cmp pt.y,eax
jg finisch
mov eax,CurX
add eax,CenterX
mov ButtonXCenter,eax
mov eax,CurY
add eax,CenterY
mov ButtonYCenter,eax
mov eax,ButtonXCenter
.if pt.x>eax
sub CurX,10
.elseif pt.x<eax
add CurX,10
.endif
mov eax,ButtonYCenter
.if pt.y>eax
sub CurY,10
.elseif pt.y<eax
add CurY,10
.endif
.if CurX<=10
add CurY,10
add CurX,70
.Endif
.if CurY<=10
add CurY,70
add CurX,30
.Endif
mov eax,MaxX
.If CurX>=eax
sub CurY,10
sub CurX,70
.Endif
mov eax,MaxY
.if CurY>=eax
sub CurY,70
sub CurX,10
.endif
invoke MoveWindow,hwndButton,CurX,CurY,70,30,1
.ELSE
Invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
finisch:
xor eax,eax
ret
WndProc endp
end start
;---------------------
В общем, извратился по полной! НО получилось! Есть правда глюк такой: когда быстро мышку двигаешь, все равно можно мышку "поймать"
Видать не успевает или что?
)
Может кто-нибудь поделиться своими примерчиками? Или выскажется по моему? Ошибки там, или совет какой кто даст?