события

Тема в разделе "WASM.BEGINNERS", создана пользователем bizdon, 25 апр 2010.

  1. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    подскажите, какое событие у кнопки "Нет"
    и как вообще неизвестные события можно отследить (в Оле или другой программе)
    и книжку посоветуйте, где события по категориям упорядочены

    http://webfile.ru/4448586

    спасибо!
     
  2. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    да..с! Вот, один дурак так спросил, что сто умных ответить не могут..
    Прогу (http://webfile.ru/4448586 ) писал сто лет назад на Delphi (написал через два часа после начала изучения манов), сжал-разжал FSG 2.0, исходники давно утеряны. Вероятно, использовалось событие onMouseMove из VCL. Сейчас хотел переписать программку на асме и не нашел в SDK события onMouseMove (дальше просто рандомное MoveWindow), как его (onMouseMove, если это оно) реализовать на асм?
     
  3. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Нужно обрабатывать сообщение WM_MOUSEMOVE, если я правильно понял вопрос.
     
  4. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    вот код:
    Код (Text):
    1.             .486
    2.             .model  flat,stdcall
    3.             option  casemap:none
    4. ; --------------- Includes
    5.             include \masm32\include\windows.inc
    6.             include \masm32\include\kernel32.inc
    7.             include \masm32\include\user32.inc
    8.             include \masm32\include\gdi32.inc
    9.             includelib \masm32\lib\kernel32.lib
    10.             includelib \masm32\lib\user32.lib
    11.             includelib \masm32\lib\gdi32.lib
    12. ; --------------- Datas section
    13.             .data
    14. ClassName BYTE "SimpleWinClass",0
    15. AppName   BYTE "application",0
    16. wc        WNDCLASSEX <>
    17. mss       MSG <>
    18. hwnd      HWND ?
    19. hInstance dd ?
    20. BUTTON_CLASS        DB    "BUTTON",0
    21. BUTTON_NAME           DB     "MY_BUTTON",0
    22. MSG_WIN        MSG      <0>
    23. shablon db "%d, %d",0
    24. contener db 50 dup (?)
    25.  
    26. ; --------------- Code section
    27.                     .code
    28. start:
    29. invoke GetModuleHandle,0
    30. mov hInstance,eax
    31.         mov wc.cbSize, sizeof WNDCLASSEX
    32.         mov wc.style, CS_HREDRAW or CS_VREDRAW
    33.         mov wc.lpfnWndProc,offset WndProc
    34.         mov wc.cbClsExtra,0
    35.         mov wc.cbWndExtra,0
    36. push hInstance
    37.         pop wc.hInstance
    38.         mov wc.hbrBackground,11
    39.         mov wc.lpszMenuName, 0
    40.         mov wc.lpszClassName, offset ClassName
    41. invoke LoadIcon,0,IDI_APPLICATION
    42.         mov wc.hIcon,eax
    43.         mov wc.hIconSm,eax
    44. invoke LoadCursor,0,IDC_ARROW
    45.         mov wc.hCursor,eax
    46. invoke RegisterClassEx, addr wc
    47. invoke CreateWindowEx,0,addr ClassName,
    48. addr AppName,WS_OVERLAPPEDWINDOW,
    49. CW_USEDEFAULT,CW_USEDEFAULT,
    50. CW_USEDEFAULT,CW_USEDEFAULT,0,0,
    51. hInstance,0
    52.     mov     hwnd,eax
    53. invoke  ShowWindow, hwnd,SW_SHOW
    54. invoke UpdateWindow, hwnd  
    55. .while TRUE
    56.     invoke GetMessage,addr mss,0,0,0
    57.     .break .if !eax
    58.     invoke TranslateMessage,addr mss
    59.     invoke DispatchMessage,addr mss
    60. .endw  
    61.         mov eax,mss.wParam
    62. invoke ExitProcess,0
    63. WndProc proc hWnd:HWND, umsg:UINT,
    64.     wParam:WPARAM,lParam:LPARAM
    65.     LOCAL xx:DWORD, yy:DWORD
    66.      mov xx,100
    67.      mov yy, 100
    68.     .if umsg==WM_DESTROY
    69.     invoke PostQuitMessage,0
    70.         .elseif umsg==WM_CREATE
    71.     invoke    CreateWindowEx,0,addr BUTTON_CLASS,addr  BUTTON_NAME,WS_CHILD + WS_VISIBLE, xx,yy,150,50,hWnd,1,hInstance,0
    72.     .elseif umsg==WM_COMMAND
    73.         mov eax, wParam
    74.         shr eax,16
    75.             .if ax==BN_CLICKED
    76.         invoke MessageBox,0,addr BUTTON_NAME  ,addr BUTTON_NAME  ,0
    77.             .endif
    78.     .elseif umsg==WM_MOUSEMOVE             
    79.         mov eax,lParam
    80.         mov ebx,lParam
    81.             and eax,0000ffffh
    82.             shr ebx,16 
    83.             .if wParam==1
    84.       add xx,eax
    85.      add yy, ebx
    86.         invoke InvalidateRect,hwnd,0,TRUE
    87.             .endif       
    88.             invoke wsprintf,addr contener,addr shablon,eax,ebx
    89.             invoke SetWindowText,hWnd,addr contener
    90.         .else
    91.         invoke DefWindowProc,hWnd,umsg,wParam,lParam
    92.         ret
    93.         .endif
    94.         xor eax,eax
    95.         ret
    96. WndProc endp
    97. end start
    для кнопки стоит событие "BN_CLICKED", оно успешно обрабатывается;
    при замене события на WM_MOUSEMOVE, ничего не происходит (не работает),
    хотя форма (окно) обрабатывает WM_MOUSEMOVE, что видно в заголовке окна.

    п.с. думаю, что WM_MOUSEMOVE отслеживает движение курсора мыши, а не "наезд" на элемент..
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    bizdon
    Разумеется, так оно и есть. А у каждого элемента есть размеры и координаты, которые можно сравнить с координатами мыши и...
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ..или использовать WM_MOUSEHOVER|WM_MOUSELEAVE или как их там. маусемуве, если мышь не захвачена поступает только когда мыша движется над элементом.

    для разборок с событиями стоит использовать спаи. например, идущий в поставке с мсвс. сторонних тоже хватает
     
  7. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    CyberManiac, qqwe - спасибо!
    я и сам уже начал понимать, что "onMouseMove" придется программировать, используя размеры кнопки и положение курсора.. а в delphi всё было так просто..
     
  8. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    без дельфей ешшо прощее. просто чуть немногее почитать мсдн. поэкспериментировать, поглядеть в спай, читая расшифровки в мсдн.

    для начала стоит почитать
    Ч. Петзолд "Программирование для Windows 95"

    кою не помешало бы добавить в литературу сайта, ибо там прекрасно изложенные азы

    буку в бумажном виде вы найдете врядли. поэтому, если она вам понравится, то можно и распечать себе в книжки
     
  9. bizdon

    bizdon Member

    Публикаций:
    0
    Регистрация:
    7 апр 2009
    Сообщения:
    86
    должно работать примерно так:
    Код (Text):
    1. ; opros.asm
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5.  
    6. include \masm32\include\windows.inc
    7. include \masm32\include\user32.inc
    8. include \masm32\include\kernel32.inc
    9. includelib \masm32\lib\user32.lib
    10. includelib \masm32\lib\kernel32.lib
    11. include    \masm32\include\masm32.inc
    12. includelib \masm32\lib\masm32.lib
    13. include \masm32\macros\macros.asm
    14.  
    15. DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    16. Rnd PROTO
    17. .data
    18. DLG dd 1003
    19. BTN dd 1001
    20. shablon db "%d, %d, rnd_x=%d,rnd_y=%d",0
    21. contener db 50 dup (?)
    22. buffer db 50 dup(?)
    23. koord RECT <201,122,266,160>
    24. op db "Opros",0
    25. click_no db "          Не в деньгах счастье",0
    26. click db 0
    27. click_yes db 0
    28. .data?
    29. hInstance HINSTANCE ?
    30.  
    31. .const
    32. IDC_STC1     equ 1000
    33. IDC_BTN1     equ 1001
    34. IDC_BTN2    equ 1002
    35. IDD_DLG     equ 1003
    36. IDC_STC2    equ 1004
    37. IDC_BTN3    equ 1005
    38. IDD_DLG1    equ 1006
    39.  
    40. .code
    41. start:
    42.     invoke GetModuleHandle, NULL
    43.     mov    hInstance,eax   
    44.     invoke DialogBoxParam, hInstance, DLG ,NULL,addr DlgProc,NULL  
    45.     invoke ExitProcess,eax
    46. DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    47.     LOCAL  hBTN2:HWND, cursor_point:POINT,x:DWORD,y:DWORD
    48.     .IF uMsg==WM_INITDIALOG
    49.         invoke SetWindowText,hWnd,addr op
    50.         .if click
    51.             invoke GetDlgItem, hWnd,IDC_STC2
    52.             invoke SetWindowText,eax,addr click_no
    53.         .endif
    54.        
    55.         invoke GetDlgItem, hWnd,BTN
    56.         invoke SetFocus,eax
    57.     .ELSEIF uMsg==WM_CLOSE
    58.         invoke EndDialog, hWnd,NULL
    59.     .ELSEIF uMsg==WM_COMMAND
    60.             mov edx,wParam
    61.             .IF     dx==1005
    62.                 invoke EndDialog, hWnd,NULL
    63.             .elseif  dx==1001
    64.                 invoke EndDialog, hWnd,NULL
    65.                 mov DLG,1006
    66.                 mov BTN,1005
    67.                 mov click_yes,1
    68.                 jmp start
    69.             .elseif dx==1002
    70.     invoke EndDialog, hWnd,NULL
    71.                 mov click,1
    72.                 mov DLG,1006
    73.                 mov BTN,1005
    74.                 jmp start
    75.             .ENDIF
    76.     .elseif uMsg==WM_MOUSEMOVE
    77.         .if (click==1 || click_yes==1)
    78.             jmp metka  
    79.         .endif
    80.         invoke GetCursorPos, addr cursor_point
    81.         invoke ScreenToClient,hWnd, addr cursor_point
    82.         mov eax,cursor_point.x
    83.         mov ebx,cursor_point.y
    84.         pusha      
    85.         invoke GetDlgItem, hWnd,1002
    86.         mov hBTN2,eax
    87.             invoke wsprintf,addr contener,addr shablon,cursor_point.x,cursor_point.y,koord.left,koord.top
    88.             invoke SetWindowText,hWnd,addr contener
    89.         popa
    90.         .if (eax>=koord.left && eax<=koord.right)
    91.             .if (ebx>=koord.top && ebx<=koord.bottom)          
    92.                 nextrnd_x:
    93.                     xchg eax,edx
    94.                     invoke Rnd
    95.                     sub edx,eax
    96.                         .if (edx<0 || eax<4 || eax<4 || edx<75)
    97.                             jmp nextrnd_x
    98.                         .endif
    99.                                 mov x,eax
    100.                         mov koord.left, eax
    101.                         add koord.left,-2
    102.                             mov koord.right, eax
    103.                             add koord.right,63
    104.                 nextrnd_y:
    105.                         invoke Rnd
    106.                                 sub ebx,eax
    107.                                 .if (ebx<0 || eax<4 || ebx<45 || eax<4)
    108.                                     jmp nextrnd_y
    109.                                 .endif
    110.                                 mov y,eax
    111.                         mov koord.top, eax
    112.                         add koord.top,-2
    113.                             mov koord.bottom, eax
    114.                             add koord.bottom,33
    115.                         invoke MoveWindow,hBTN2,x,y,61,31,TRUE
    116.             .endif
    117.         .endif
    118.             metka: 
    119.     .ELSE
    120.     xor    eax, eax
    121.     ret
    122.     .ENDIF
    123.     mov eax,TRUE
    124.     ret
    125. DlgProc endp
    126.             Rnd proc
    127.             invoke GetTickCount
    128.             invoke nrandom,eax
    129.             movzx eax,al
    130.             and eax,07fh
    131.             ret
    132.             Rnd endp
    133. end start
    134.  
    135.  
    136. comment $ opros.rc
    137. #define IDD_DLG 1003
    138. #define IDC_BTN1 1001
    139. #define IDC_STC1 1000
    140. #define IDC_BTN2 1002
    141. #define IDD_DLG1 1006
    142. #define IDC_BTN3 1005
    143. #define IDC_STC2 1004
    144.  
    145. IDD_DLG DIALOGEX -84,15,168,96
    146. CAPTION "Опрос"
    147. FONT 10,"MS Sans Serif",400,0,0
    148. STYLE 0x94C308C6
    149. EXSTYLE 0x00000001
    150. BEGIN
    151.   CONTROL "ДА",IDC_BTN1,"Button",0x50010F01,36,63,30,15
    152.   CONTROL " Довольны ли вы своей зарплатой ?",IDC_STC1,"Static",0x10000000,21,27,129,12
    153.   CONTROL "НЕТ",IDC_BTN2,"Button",0x50000F00,102,63,30,15
    154. END
    155.  
    156. IDD_DLG1 DIALOGEX 0,-12,111,54
    157. CAPTION "Opros"
    158. FONT 10,"MS Sans Serif",400,0,204
    159. STYLE 0x94C308C6
    160. EXSTYLE 0x00000001
    161. BEGIN
    162.   CONTROL "OK",IDC_BTN3,"Button",0x50010F01,36,30,30,15
    163.   CONTROL "         Мы и не сомневались,                       что Вы так думаете.",IDC_STC2,"Static",0x50000000,3,3,102,18
    164. END
    165. &
    в аттаче исходники и файлы на delphi (136kb) и (восстановленный по его подобию) на асме (4kb)
    http://openfile.ru/649578/
     
  10. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Код (Text):
    1.        ...
    2.        mov      eax,[wParam]
    3.        ;shr      eax,16
    4.        ;.if       ax==BN_CLICKED
    5.        .if      eax=BN_CLICKED shl 16 or IDC_BTN_MY_KNOPKA
    6.        ;BN_CLICKED = 0, смело удалите "BN_CLICKED shl 16 or "
    7.        ...
    8. :)