глюк LoadCursor ?

Discussion in 'WASM.BEGINNERS' started by Vitaly747_007, Jun 3, 2011.

  1. Vitaly747_007

    Vitaly747_007 New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2011
    Messages:
    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

    Blog Posts:
    0
    Joined:
    Sep 29, 2005
    Messages:
    2,566
    Vitaly747_007
    1) Для выкладывания кода форум поддерживает тег code.
    2) С исходниками к этому с позволения сказать "компилятору" желательно выкладывать bat-файл, позволяющий их скомпилировать.
    3)
    Примерно то же самое мне рассказывают люди, чьи навыки работы с компьютером, как максимум, ограничиваются проверкой почты: "Я нажала все кнопки, и ничего не помогло". Так вот перед тем, как начать пробовать варианты, имеет смысл пройти всю теорию.
    4) В общем, отвечаю с условием, что теория впредь будет читаться перед написанием программы или по крайней мере перед созданием темы на форуме. Вот эту чушь:
    Code (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
    имеет смысл заменить следующим кодом:
    Code (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

    Blog Posts:
    0
    Joined:
    Jun 20, 2007
    Messages:
    509
    Vitaly747_007, а по колёсам стучал, стёкла протирал?
    В LoadCursor вместо hwndButton нужно давать hInstance. Ну ето ,наверное, просто невнимательность. Не слушайте l_incа, можно сделать проще:
    Code (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

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


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

    klzlk New Member

    Blog Posts:
    0
    Joined:
    Jun 2, 2011
    Messages:
    449
  6. Vitaly747_007

    Vitaly747_007 New Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2011
    Messages:
    14
    Тупость- это то, что Вы написали, уважаемый.