Ассемблер и WinAPI, не срабатывают некоторые события - Assembler
Формулировка задачи:
Начал делать простенькую программу с таймером но столкнулся с такой проблемой - не срабатывают некоторые события.
Вот например
WM_CREATE срабатывает - там несколько CreateWindowEx - окна создаются а вот по WM_TIMER ничего
включается таймер тут
IDC_TIMER делал разным (0,1,5 и т.д.)
так же пока искал в чем дело, обнаружил что и WM_KEYDOWN тоже не срабатывает
WndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL hBrush:HBRUSH .If uMsg==WM_DESTROY Invoke PostQuitMessage,NULL .ElseIf uMsg==WM_TIMER Invoke SetWindowText,hDebug,ADDR paramStr1 .ElseIf uMsg==WM_CREATE Invoke CreateWindowEx,0,ADDR staticClass,ADDR stText1,WS_CHILD or WS_VISIBLE,10,10,200,20,hWnd,0,hInstance,0 MOV hStatic,EAX ...........
.ElseIf uMsg==WM_COMMAND MOV EAX,lParam .If EAX == hButtonStart Invoke EnableWindow,hButtonStart,FALSE Invoke EnableWindow,hButtonStop,TRUE Call GameInit MOV GameStarted,1 Invoke SetTimer,hWnd,IDC_TIMER,100,NULL MOV TimerID,EAX .elseif EAX == hButtonStop Invoke KillTimer,hWnd,TimerID MOV GameStarted,0 Invoke EnableWindow,hButtonStart,TRUE Invoke EnableWindow,hButtonStop,FALSE .Endif
Решение задачи: «Ассемблер и WinAPI, не срабатывают некоторые события»
textual
Листинг программы
WndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL hBrush:HBRUSH LOCAL gun_pic:HBITMAP .If uMsg==WM_DESTROY Invoke PostQuitMessage,NULL .ElseIf uMsg==WM_CREATE Invoke CreateWindowEx,0,ADDR staticClass,ADDR stText1,WS_CHILD or WS_VISIBLE,10,10,200,20,hWnd,0,hInstance,0 MOV hStatic,EAX Invoke CreateWindowEx,0,ADDR editClass,ADDR editText,WS_CHILD or WS_VISIBLE or WS_BORDER or ES_NUMBER, 220,10,30,20,hWnd,0,hInstance,0 MOV hEdit,EAX Invoke CreateWindowEx,0,ADDR buttonClass,ADDR bStartText,WS_CHILD or WS_VISIBLE,40,40,140,25,hWnd,0,hInstance,0 MOV hButtonStart,EAX Invoke CreateWindowEx,0,ADDR buttonClass,ADDR bStopText,WS_CHILD or WS_VISIBLE or WS_DISABLED,200,40,140,25,hWnd,0,hInstance,0 MOV hButtonStop,EAX Invoke CreateWindowEx,0,ADDR staticClass,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER,10,70,SizeX,SizeY,hWnd,0,hInstance,0 MOV hScreen,EAX Invoke CreateWindowEx,0,ADDR editClass,NULL,WS_CHILD or WS_VISIBLE or WS_BORDER,350,10,200,50,hWnd,0,hInstance,0 MOV hDebug,EAX Invoke LoadImage,hInstance,addr gunfilename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE mov gun_pic,eax Invoke CreateWindowEx,0,ADDR staticClass,NULL,WS_CHILD or SS_BITMAP or WS_VISIBLE,0,0,0,0,hScreen,0,hInstance,0 MOV _Gun,EAX invoke SendMessage,_Gun,STM_SETIMAGE,IMAGE_BITMAP,gun_pic .ElseIf uMsg==WM_KEYDOWN .If wParam==VK_LEFT MOV kLeft,1 Invoke SetWindowText,hDebug,addr txtLeft .endif .If wParam==VK_RIGHT MOV kRight,1 Invoke SetWindowText,hDebug,addr txtRight .endif .If wParam==VK_SPACE MOV kSpace,1 .EndIf .ElseIf uMsg==WM_KEYUP .If wParam==VK_LEFT MOV kLeft,0 Invoke SetWindowText,hDebug,NULL .endif .If wParam==VK_RIGHT MOV kRight,0 Invoke SetWindowText,hDebug,NULL .endif .If wParam==VK_SPACE MOV kSpace,0 .EndIf .ElseIf uMsg==WM_COMMAND MOV EAX,lParam .If EAX == hButtonStart Invoke EnableWindow,hButtonStart,FALSE Invoke EnableWindow,hButtonStop,TRUE ;Call GameInit MOV GameStarted,1 Invoke SetTimer,hWnd,1,100,NULL MOV TimerID,EAX .elseif EAX == hButtonStop Invoke KillTimer,hWnd,1 MOV GameStarted,0 Invoke EnableWindow,hButtonStart,TRUE Invoke EnableWindow,hButtonStop,FALSE .Endif MOV EAX,wParam .If AX==IDM_FILE_NEW Invoke MessageBox,NULL,ADDR szFileNew,Offset szAppName,MB_OK .ElseIf AX==IDM_FILE_OPEN Invoke MessageBox, NULL,ADDR szFileOpen, Offset szAppName,MB_OK .Elseif AX==IDM_HELP_ABOUT Invoke MessageBox,NULL,ADDR szHelpAbout, Offset szAppName, MB_OK .EndIf .ElseIf uMsg==WM_TIMER ;îñГ*îâГ*îé öèêë èãðû .if kLeft==1 Invoke SetWindowText,hDebug,addr txtLeft dec PlayerX .endif .if (kRight==1 && PlayerX < 640-GunSizeX) Invoke SetWindowText,hDebug,addr txtRight inc PlayerX .endif Invoke wsprintf,addr tempStr,addr paramStr1,PlayerX invoke MoveWindow,_Gun,PlayerX,PlayerY,96,96,TRUE .ElseIf uMsg==WM_PAINT Invoke BeginPaint,hWnd,ADDR ps Invoke EndPaint,hWnd,ADDR ps .Else Invoke DefWindowProc,hWnd,uMsg,wParam,lParam RET .EndIf XOR EAX,EAX RET WndProc EndP
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д