Ассемблер и WinAPI, не срабатывают некоторые события - Assembler

Узнай цену своей работы

Формулировка задачи:

Начал делать простенькую программу с таймером но столкнулся с такой проблемой - не срабатывают некоторые события. Вот например
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
...........
WM_CREATE срабатывает - там несколько CreateWindowEx - окна создаются а вот по WM_TIMER ничего включается таймер тут
    .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
IDC_TIMER делал разным (0,1,5 и т.д.) так же пока искал в чем дело, обнаружил что и WM_KEYDOWN тоже не срабатывает

Решение задачи: «Ассемблер и 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы