WM_SETCURSOR

Тема в разделе "WASM.BEGINNERS", создана пользователем assorted, 17 июл 2007.

  1. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Требуется менять курсор при наведении на статик.
    Как обрабатывая WM_SETCURSOR, проверить для какого из дочерних окон (у меня нескольк статиков) произошло событие? Пробовал и сравнивать hWnd который передается в процедуру обработки сообщений и hWnd нужного мне окна(статик) не работает.

    Есть рабочий пример для диалогового окна
    .elseif uMsg==WM_SETCURSOR && ebx!=hWnd
    invoke GetWindowLong,ebx,GWL_ID
    invoke LoadCursor,0,eax
    push eax
    invoke SetClassLong,ebx,GCL_HCURSOR,eax
    pop eax

    а вот мой вариант - не работает
    .wmsetcursor:
    mov eax, [myhWnd]
    cmp [hWnd],eax
    jne .finish
    invoke LoadCursor,0,IDC_HAND
    invoke SetClassLong,[hWnd],GCL_HCURSOR,eax

    Вообще как я понимаю сообщение обрабатывать вовсе не обязательно а можно вызвать

    invoke LoadCursor,0,IDC_HAND
    invoke SetClassLong,[hWnd],GCL_HCURSOR,eax

    в любой момент. Для родительского окна - работает. Но мне нужно поменять курсор когда он находися над статиком.
     
  2. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Посмотри в разделе Исходники–>Интерфейс там есть пример: HyperLink Test
     
  3. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    GMax скачал 3 примера - везде окна диалоговые. не помогло
     
  4. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Думаю разницы не должно быть. Покажи свой код.
     
  5. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    2 варианта. Оба работают если менять курсор для главного окна.
    А мне нужно для окна статик.

    invoke CreateWindowEx,0,StaticClassName,StaticTextN,WS_CHILD or WS_VISIBLE,\
    30,120,140,16,[hWnd],IDC_STATICWWW,[hInstance],0
    push eax
    invoke LoadCursor,0,IDC_HAND
    pop ebx
    invoke SetClassLong,ebx,GCL_HCURSOR,eax

    или так пробую

    proc MainWindowProc hWnd,uMsg,wparam,lparam
    push ebx esi edi
    mov eax,[uMsg]
    cmp eax,WM_CREATE
    je .wmcreate тут создаю статики
    cmp eax,WM_SETCURSOR
    je .wmsetcursor
    .defwndproc:
    invoke DefWindowProc, [hWnd],[uMsg],[wparam],[lparam]
    jmp .finish
    .wmsetcursor:
    mov eax, [hWnd]
    cmp [myhWnd],eax ;myhWnd - hWnd нужного статика
    jne .defwndproc
    invoke LoadCursor,0,IDC_HAND
    invoke SetClassLong,[hWnd],GCL_HCURSOR,eax
    jmp .defwndproc
     
  6. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    В wParam должен быть HWND окна, над которым висит курсор....
    Вобщем я сделал такую проверку

    .wmsetcursor:
    nop
    mov eax, [hWnd]
    cmp [wparam],eax
    je .defwndproc

    и выяснил что wmsetcursor вызывается только для главного окна hWnd = wparam

    как же быть со статиками?
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Сабклассировать их?
     
  8. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    IceStudent именно это я и делаю invoke SetClassLong,[hWnd],GCL_HCURSOR,eax
     
  9. assorted

    assorted New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    227
    Проблема решена! Нужно было добавить свойство SS_NOTIFY в окно статик
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    assorted

    1) "invoke SetClassLong,[hWnd],GCL_HCURSOR,eax" - это не значит "сабклассировать" :)

    2) SS_NOTIFY для статика - само собой: без этого у статика HTTRANSPARENT вместо HTCLIENT, так что из мышиных ловит только WM_NCHITTEST.

    Однако заметьте, что назначать свой курсор можно любым областям окна, а не только его контролам:
    просто на WM_SETCURSOR проверять, над какой областью навис курсор, например, путем GetCursorPos + PtInRect / PtInRegion.

    Так что в принципе достаточно и GetWindowRect для этого статика.