Всем Здравия желаю! Возникла проблема с установкой своего курсора, при наведении его на кнопку. Перепробовал массу вариантов но ничто не катит, в чем проблема неясно. ниже исходник asm.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 ;================================================================================================== WinMain proto WORD,WORD,WORD,WORD ;====================================================================================================== .data ClassName db "SimpleWinClass",0 ButtonClassName db "button",0 OK db "биби",0 AppName db "даздравствует мир!",0 ;======================================================================================================= .data? hInstance HINSTANCE ? hwndButton HWND ? CommandLine LPSTR ? .const ButtonID equ 1 ;====================================================================================================== .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL, CommandLine, SW_SHOWDEFAULT invoke ExitProcess,eax ;====================================================================================================== WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShowWORD 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 hInstance pop wc.hInstance mov wc.hbrBackground,COLOR_WINDOW+1 mov wc.lpszMenuName,NULL mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDC_ARROW mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,hInst,900 mov wc.hCursor,eax invoke RegisterClassEx, addr wc INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,333,222,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 ;----------------------------------------------------------------------------------------------------------------- .IF uMsg==WM_CREATE invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR OK,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\ 75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL mov hwndButton, eax invoke ShowWindow, hwndButton, SW_SHOW invoke LoadCursor,hwndButton,901 .ENDIF ;----------------------------------------------------------------------------------------------------------------- .IF uMsg==WM_CLOSE call ExitProcess .ENDIF ;----------------------------------------------------------------------------------------------------------------- .IF uMsg==WM_COMMAND mov eax, wParam .IF ax==1 shr eax,16 .IF ax==0 invoke MessageBeep, 50 .ENDIF .ENDIF .ENDIF ;----------------------------------------------------------------------------------------------------------------- invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret WndProc endp ;----------------------------------------------------------------------------------------------------------------- end start файл rsrc.rc : 900 CURSOR MOVEABLE PURE LOADONCALL DISCARDABLE "cur.cur" 901 CURSOR MOVEABLE PURE LOADONCALL DISCARDABLE "cur1.cur" В пределах всего окна всё норм, курсор с айдэ 900 ставится, но в пределах кнопки 901-й нехотит. Да функция SetCursor не помогает.
Vitaly747_007 1) Для выкладывания кода форум поддерживает тег code. 2) С исходниками к этому с позволения сказать "компилятору" желательно выкладывать bat-файл, позволяющий их скомпилировать. 3) Примерно то же самое мне рассказывают люди, чьи навыки работы с компьютером, как максимум, ограничиваются проверкой почты: "Я нажала все кнопки, и ничего не помогло". Так вот перед тем, как начать пробовать варианты, имеет смысл пройти всю теорию. 4) В общем, отвечаю с условием, что теория впредь будет читаться перед написанием программы или по крайней мере перед созданием темы на форуме. Вот эту чушь: Код (Text): ;----------------------------------------------------------------------------------------------------------------- .IF uMsg==WM_CREATE invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR OK,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\ 75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL mov hwndButton, eax invoke ShowWindow, hwndButton, SW_SHOW invoke LoadCursor,hwndButton,901 .ENDIF имеет смысл заменить следующим кодом: Код (Text): LOCAL wc:WNDCLASSEX ;----------------------------------------------------------------------------------------------------------------- .IF uMsg==WM_CREATE mov wc.cbSize,sizeof WNDCLASSEX invoke GetClassInfoEx,NULL,ADDR ButtonClassName,ADDR wc push hInstance pop wc.hInstance invoke LoadCursor,hInstance,901 mov wc.hCursor,eax mov wc.lpszClassName,OFFSET MyButtonClassName invoke RegisterClassEx,ADDR wc invoke CreateWindowEx, NULL, ADDR MyButtonClassName, ADDR OK,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\ 75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL mov hwndButton, eax invoke ShowWindow, hwndButton, SW_SHOW .ENDIF , добавив в секцию данных определение MyButtonClassName db "mybutton",0
Vitaly747_007, а по колёсам стучал, стёкла протирал? В LoadCursor вместо hwndButton нужно давать hInstance. Ну ето ,наверное, просто невнимательность. Не слушайте l_incа, можно сделать проще: Код (Text): .IF uMsg==WM_CREATE invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR OK,\ WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\ 75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL mov hwndButton, eax invoke ShowWindow, hwndButton, SW_SHOW invoke LoadCursor,hInstance,901 invoke SetClassLong, [hwndButton], GCL_HCURSOR, eax .ENDIF
l_inc Спасибо! Как я понимаю это была регистрация индивидуального класса для кнопки. Тоже пытался, но с ошибками, теперь ясно что за ошибки. извини БАТником пока нет нужды пользоваться, в редакторе qeditor можно без него. litrovith я всегда знал что всё гениальное просто! Спасибо за гениальный вариант! hInstance ставил, но не использовал SetClassLong.
Vitaly747_007 Прототипы нужно смотреть, прежде чем юзать. Какая есчо гениальность, это скорее предельная тупость. http://msdn.microsoft.com/en-us/library/ms648391(v=vs.85).aspx читали ?