глюк LoadCursor ?

Тема в разделе "WASM.BEGINNERS", создана пользователем Vitaly747_007, 3 июн 2011.

  1. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    Всем Здравия желаю!
    Возникла проблема с установкой своего курсора, при наведении его на кнопку.
    Перепробовал массу вариантов но ничто не катит, в чем проблема неясно.
    ниже исходник 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 :lol: WORD,:lol: WORD,:lol: WORD,:lol: 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, CmdShow:lol: WORD
    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 не помогает.
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Vitaly747_007
    1) Для выкладывания кода форум поддерживает тег code.
    2) С исходниками к этому с позволения сказать "компилятору" желательно выкладывать bat-файл, позволяющий их скомпилировать.
    3)
    Примерно то же самое мне рассказывают люди, чьи навыки работы с компьютером, как максимум, ограничиваются проверкой почты: "Я нажала все кнопки, и ничего не помогло". Так вот перед тем, как начать пробовать варианты, имеет смысл пройти всю теорию.
    4) В общем, отвечаю с условием, что теория впредь будет читаться перед написанием программы или по крайней мере перед созданием темы на форуме. Вот эту чушь:
    Код (Text):
    1. ;-----------------------------------------------------------------------------------------------------------------     
    2. .IF uMsg==WM_CREATE
    3.                 invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR OK,\
    4.                         WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
    5.                         75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL
    6.         mov  hwndButton, eax
    7. invoke ShowWindow, hwndButton, SW_SHOW
    8. invoke LoadCursor,hwndButton,901        
    9. .ENDIF
    имеет смысл заменить следующим кодом:
    Код (Text):
    1.     LOCAL wc:WNDCLASSEX
    2.     ;-----------------------------------------------------------------------------------------------------------------     
    3.     .IF uMsg==WM_CREATE
    4.             mov wc.cbSize,sizeof WNDCLASSEX
    5.             invoke GetClassInfoEx,NULL,ADDR ButtonClassName,ADDR wc
    6.             push hInstance
    7.             pop wc.hInstance
    8.             invoke LoadCursor,hInstance,901        
    9.             mov wc.hCursor,eax
    10.             mov wc.lpszClassName,OFFSET MyButtonClassName
    11.             invoke RegisterClassEx,ADDR wc
    12.             invoke CreateWindowEx, NULL, ADDR MyButtonClassName, ADDR OK,\
    13.                 WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
    14.                 75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL
    15.             mov  hwndButton, eax
    16.             invoke ShowWindow, hwndButton, SW_SHOW  
    17.     .ENDIF
    , добавив в секцию данных определение
    MyButtonClassName db "mybutton",0
     
  3. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Vitaly747_007, а по колёсам стучал, стёкла протирал?
    В LoadCursor вместо hwndButton нужно давать hInstance. Ну ето ,наверное, просто невнимательность. Не слушайте l_incа, можно сделать проще:
    Код (Text):
    1. .IF uMsg==WM_CREATE
    2.                 invoke CreateWindowEx, NULL, ADDR ButtonClassName, ADDR OK,\
    3.                         WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
    4.                         75, 70, 140, 25, hWnd, ButtonID, hInstance, NULL
    5.         mov  hwndButton, eax
    6. invoke ShowWindow, hwndButton, SW_SHOW
    7. invoke LoadCursor,hInstance,901        
    8. invoke SetClassLong, [hwndButton], GCL_HCURSOR, eax        
    9. .ENDIF
     
  4. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    l_inc
    Спасибо! Как я понимаю это была регистрация индивидуального класса для кнопки.
    Тоже пытался, но с ошибками, теперь ясно что за ошибки.
    извини БАТником пока нет нужды пользоваться, в редакторе qeditor можно без него.


    litrovith
    я всегда знал что всё гениальное просто! Спасибо за гениальный вариант!
    hInstance ставил, но не использовал SetClassLong.
     
  5. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
  6. Vitaly747_007

    Vitaly747_007 New Member

    Публикаций:
    0
    Регистрация:
    3 июн 2011
    Сообщения:
    14
    Тупость- это то, что Вы написали, уважаемый.