подскажите, какое событие у кнопки "Нет" и как вообще неизвестные события можно отследить (в Оле или другой программе) и книжку посоветуйте, где события по категориям упорядочены http://webfile.ru/4448586 спасибо!
да..с! Вот, один дурак так спросил, что сто умных ответить не могут.. Прогу (http://webfile.ru/4448586 ) писал сто лет назад на Delphi (написал через два часа после начала изучения манов), сжал-разжал FSG 2.0, исходники давно утеряны. Вероятно, использовалось событие onMouseMove из VCL. Сейчас хотел переписать программку на асме и не нашел в SDK события onMouseMove (дальше просто рандомное MoveWindow), как его (onMouseMove, если это оно) реализовать на асм?
вот код: Код (Text): .486 .model flat,stdcall option casemap:none ; --------------- Includes include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\gdi32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\gdi32.lib ; --------------- Datas section .data ClassName BYTE "SimpleWinClass",0 AppName BYTE "application",0 wc WNDCLASSEX <> mss MSG <> hwnd HWND ? hInstance dd ? BUTTON_CLASS DB "BUTTON",0 BUTTON_NAME DB "MY_BUTTON",0 MSG_WIN MSG <0> shablon db "%d, %d",0 contener db 50 dup (?) ; --------------- Code section .code start: invoke GetModuleHandle,0 mov hInstance,eax mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW mov wc.lpfnWndProc,offset WndProc mov wc.cbClsExtra,0 mov wc.cbWndExtra,0 push hInstance pop wc.hInstance mov wc.hbrBackground,11 mov wc.lpszMenuName, 0 mov wc.lpszClassName, offset ClassName invoke LoadIcon,0,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,0,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateWindowEx,0,addr ClassName, addr AppName,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,0,0, hInstance,0 mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOW invoke UpdateWindow, hwnd .while TRUE invoke GetMessage,addr mss,0,0,0 .break .if !eax invoke TranslateMessage,addr mss invoke DispatchMessage,addr mss .endw mov eax,mss.wParam invoke ExitProcess,0 WndProc proc hWnd:HWND, umsg:UINT, wParam:WPARAM,lParam:LPARAM LOCAL xx:DWORD, yy:DWORD mov xx,100 mov yy, 100 .if umsg==WM_DESTROY invoke PostQuitMessage,0 .elseif umsg==WM_CREATE invoke CreateWindowEx,0,addr BUTTON_CLASS,addr BUTTON_NAME,WS_CHILD + WS_VISIBLE, xx,yy,150,50,hWnd,1,hInstance,0 .elseif umsg==WM_COMMAND mov eax, wParam shr eax,16 .if ax==BN_CLICKED invoke MessageBox,0,addr BUTTON_NAME ,addr BUTTON_NAME ,0 .endif .elseif umsg==WM_MOUSEMOVE mov eax,lParam mov ebx,lParam and eax,0000ffffh shr ebx,16 .if wParam==1 add xx,eax add yy, ebx invoke InvalidateRect,hwnd,0,TRUE .endif invoke wsprintf,addr contener,addr shablon,eax,ebx invoke SetWindowText,hWnd,addr contener .else invoke DefWindowProc,hWnd,umsg,wParam,lParam ret .endif xor eax,eax ret WndProc endp end start для кнопки стоит событие "BN_CLICKED", оно успешно обрабатывается; при замене события на WM_MOUSEMOVE, ничего не происходит (не работает), хотя форма (окно) обрабатывает WM_MOUSEMOVE, что видно в заголовке окна. п.с. думаю, что WM_MOUSEMOVE отслеживает движение курсора мыши, а не "наезд" на элемент..
bizdon Разумеется, так оно и есть. А у каждого элемента есть размеры и координаты, которые можно сравнить с координатами мыши и...
..или использовать WM_MOUSEHOVER|WM_MOUSELEAVE или как их там. маусемуве, если мышь не захвачена поступает только когда мыша движется над элементом. для разборок с событиями стоит использовать спаи. например, идущий в поставке с мсвс. сторонних тоже хватает
CyberManiac, qqwe - спасибо! я и сам уже начал понимать, что "onMouseMove" придется программировать, используя размеры кнопки и положение курсора.. а в delphi всё было так просто..
без дельфей ешшо прощее. просто чуть немногее почитать мсдн. поэкспериментировать, поглядеть в спай, читая расшифровки в мсдн. для начала стоит почитать Ч. Петзолд "Программирование для Windows 95" кою не помешало бы добавить в литературу сайта, ибо там прекрасно изложенные азы буку в бумажном виде вы найдете врядли. поэтому, если она вам понравится, то можно и распечать себе в книжки
должно работать примерно так: Код (Text): ; opros.asm .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib include \masm32\include\masm32.inc includelib \masm32\lib\masm32.lib include \masm32\macros\macros.asm DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD Rnd PROTO .data DLG dd 1003 BTN dd 1001 shablon db "%d, %d, rnd_x=%d,rnd_y=%d",0 contener db 50 dup (?) buffer db 50 dup(?) koord RECT <201,122,266,160> op db "Opros",0 click_no db " Не в деньгах счастье",0 click db 0 click_yes db 0 .data? hInstance HINSTANCE ? .const IDC_STC1 equ 1000 IDC_BTN1 equ 1001 IDC_BTN2 equ 1002 IDD_DLG equ 1003 IDC_STC2 equ 1004 IDC_BTN3 equ 1005 IDD_DLG1 equ 1006 .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke DialogBoxParam, hInstance, DLG ,NULL,addr DlgProc,NULL invoke ExitProcess,eax DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hBTN2:HWND, cursor_point:POINT,x:DWORD,y:DWORD .IF uMsg==WM_INITDIALOG invoke SetWindowText,hWnd,addr op .if click invoke GetDlgItem, hWnd,IDC_STC2 invoke SetWindowText,eax,addr click_no .endif invoke GetDlgItem, hWnd,BTN invoke SetFocus,eax .ELSEIF uMsg==WM_CLOSE invoke EndDialog, hWnd,NULL .ELSEIF uMsg==WM_COMMAND mov edx,wParam .IF dx==1005 invoke EndDialog, hWnd,NULL .elseif dx==1001 invoke EndDialog, hWnd,NULL mov DLG,1006 mov BTN,1005 mov click_yes,1 jmp start .elseif dx==1002 invoke EndDialog, hWnd,NULL mov click,1 mov DLG,1006 mov BTN,1005 jmp start .ENDIF .elseif uMsg==WM_MOUSEMOVE .if (click==1 || click_yes==1) jmp metka .endif invoke GetCursorPos, addr cursor_point invoke ScreenToClient,hWnd, addr cursor_point mov eax,cursor_point.x mov ebx,cursor_point.y pusha invoke GetDlgItem, hWnd,1002 mov hBTN2,eax invoke wsprintf,addr contener,addr shablon,cursor_point.x,cursor_point.y,koord.left,koord.top invoke SetWindowText,hWnd,addr contener popa .if (eax>=koord.left && eax<=koord.right) .if (ebx>=koord.top && ebx<=koord.bottom) nextrnd_x: xchg eax,edx invoke Rnd sub edx,eax .if (edx<0 || eax<4 || eax<4 || edx<75) jmp nextrnd_x .endif mov x,eax mov koord.left, eax add koord.left,-2 mov koord.right, eax add koord.right,63 nextrnd_y: invoke Rnd sub ebx,eax .if (ebx<0 || eax<4 || ebx<45 || eax<4) jmp nextrnd_y .endif mov y,eax mov koord.top, eax add koord.top,-2 mov koord.bottom, eax add koord.bottom,33 invoke MoveWindow,hBTN2,x,y,61,31,TRUE .endif .endif metka: .ELSE xor eax, eax ret .ENDIF mov eax,TRUE ret DlgProc endp Rnd proc invoke GetTickCount invoke nrandom,eax movzx eax,al and eax,07fh ret Rnd endp end start comment $ opros.rc #define IDD_DLG 1003 #define IDC_BTN1 1001 #define IDC_STC1 1000 #define IDC_BTN2 1002 #define IDD_DLG1 1006 #define IDC_BTN3 1005 #define IDC_STC2 1004 IDD_DLG DIALOGEX -84,15,168,96 CAPTION "Опрос" FONT 10,"MS Sans Serif",400,0,0 STYLE 0x94C308C6 EXSTYLE 0x00000001 BEGIN CONTROL "ДА",IDC_BTN1,"Button",0x50010F01,36,63,30,15 CONTROL " Довольны ли вы своей зарплатой ?",IDC_STC1,"Static",0x10000000,21,27,129,12 CONTROL "НЕТ",IDC_BTN2,"Button",0x50000F00,102,63,30,15 END IDD_DLG1 DIALOGEX 0,-12,111,54 CAPTION "Opros" FONT 10,"MS Sans Serif",400,0,204 STYLE 0x94C308C6 EXSTYLE 0x00000001 BEGIN CONTROL "OK",IDC_BTN3,"Button",0x50010F01,36,30,30,15 CONTROL " Мы и не сомневались, что Вы так думаете.",IDC_STC2,"Static",0x50000000,3,3,102,18 END & в аттаче исходники и файлы на delphi (136kb) и (восстановленный по его подобию) на асме (4kb) http://openfile.ru/649578/
Код (Text): ... mov eax,[wParam] ;shr eax,16 ;.if ax==BN_CLICKED .if eax=BN_CLICKED shl 16 or IDC_BTN_MY_KNOPKA ;BN_CLICKED = 0, смело удалите "BN_CLICKED shl 16 or " ... :)