Переделка BmpButton

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

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Пытаюсь переделать функцию BmpButton (masm32) так, чтобы при наведении курсора на кнопку менялась картинка и наоборот, также как в оригинале при WM_LBUTTONDOWN - WM_LBUTTONUP (см. 1.rar). Пробовал через WM_MOUSEMOVE - WM_MOUSELEAVE, но ничего не выходит. С другими сообщениями также ничего не получается.
    Может, кто знает как правильно?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    поиграйся с SetCapture и ReleaseCapture при обработке WM_MOUSEMOVE
    например:
    Код (Text):
    1.  //x,y - координаты курсора
    2.  //Width, Height - ширина и высота кнопки
    3.  int fIns;
    4.  If (x < 0) || (x > Width) || (y < 0) || (y > Height){
    5.   fIns=0;
    6.   ReleaseCapture();
    7.   //здесь: перерисовать кнопку в исходном положении
    8.  }
    9.  Else{
    10.   If (fIns == 0){
    11.    fIns=1;
    12.    SetCapture (hButton);
    13.    //здесь:перерисовать кнопку в положении "под курсором"
    14.  }
    15. }
     
  3. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Играюсь, но что-то не получается
    Нужно на masm32
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    неужели так сложно перевести приведённый мной код на masm?
    показывай, что натворил.
    тут телепатов, кажется, нет :)
     
  5. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Натворил. Не работает. Удалил.
    И хотел бы увидеть как надо.
     
  6. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Как надо - не покажу, готового кода нет.
    Показывай свой, я поищу ошибки
     
  7. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    Поиск по сайту рулит: http://www.wasm.ru/src/1/buttonspgm.zip
    Если хочешь с WM_MOUSEMOVE и WM_MOUSELEAVE, то поищи XXButton.asm из XXControls by Chib, amdtm
     
  8. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Можно через сабклассинг окна

    Делай раз:
    Код (Text):
    1.     invoke  GetDlgItem,[hWnd],IDC_BUTTON
    2.     invoke  SetWindowLong,eax,GWL_WNDPROC,ADDR NewButtonProc
    3.     mov     [OldButtonProc], eax
    Делай два: (Тут был косячок. Убрал, чтобы не моргало, текст выводится только один раз при навидении на кнопку и уходе)
    Код (Text):
    1. NewButtonProc proc hCtl   :DWORD,
    2.               uMsg   :DWORD,
    3.               wParam :DWORD,
    4.               lParam :DWORD
    5. LOCAL   Rect    :RECT
    6. LOCAL   PCapt   :DWORD
    7.     .if [uMsg]==WM_MOUSEMOVE
    8.         invoke  GetCapture
    9.         .if     eax!=[hCtl]
    10.             invoke  SetCapture,[hCtl]
    11.             mov     [PCapt],eax
    12.  
    13.         invoke  SetWindowText,[hCtl],$TA0('xxx')
    14.  
    15.         .endif
    16.         mov     eax,    [lParam]
    17.         mov     ebx,    eax
    18.         and     eax,    0FFFFh  ;X
    19.         shr     ebx,    16      ;Y
    20.         push    eax
    21.         invoke  GetWindowRect,[hCtl],ADDR Rect
    22.         mov     eax,    [Rect].left
    23.         sub     [Rect].right,   eax
    24.         mov     eax,    [Rect].top
    25.         sub     [Rect].bottom,  eax
    26.         pop     eax
    27.         .if (ebx>Rect.bottom)||(eax>Rect.right)
    28.  
    29.             invoke  SetWindowText,[hCtl],$TA0('...')
    30.  
    31.             invoke  ReleaseCapture
    32.         .endif
    33.     .else
    34.         invoke CallWindowProc,[OldButtonProc],[hCtl],[uMsg],[wParam],[lParam]
    35.         ret
    36.     .endif
    37.     xor eax,eax
    38.     ret
    39. NewButtonProc endp
    Ну, а на картинки, ..., сам уж как-нибудь.
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    vg
    Попробуй это
     
  10. sxd

    sxd Виталий

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    56
    Адрес:
    Москва
    Ребят доброй ночи всем!
    Помогите не в падLу...:dntknw: Пытаюсь, аналогично, переписать функцию с MASM32 на С++ так, чтобы при наведении курсора на кнопку менялась картинка и наоборот.
    Никак отладить не могу :dntknw: а надо срочно на С++, а не на WASM32...
    http://www.wasm.ru/src/1/buttonspgm.zip - очень хороший пример, но не мог кто-нибудь аналогичное на С++ скинуть. PLEASE!!!
     
  11. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Добавил к коду сообщение WM_MOUSEMOVE в процедуре BmpButnProc

    Код (Text):
    1.     .elseif uMsg == WM_MOUSEMOVE
    2. invoke  GetCapture
    3.  .if        eax!=hWin
    4. invoke  SetCapture,hWin
    5.  .endif
    6. invoke GetWindowLong,hWin,4
    7. mov hBmpD, eax
    8. invoke GetWindowLong,hWin,8
    9. mov hImage, eax
    10. invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpD
    11.  
    12.         mov eax, lParam
    13.         cwde
    14.  
    15.         mov ptX, eax
    16.         mov eax, lParam
    17.         rol eax, 16
    18.         cwde
    19.         mov ptY, eax
    20.  
    21.         invoke GetWindowRect,hWin,ADDR Rct
    22.  
    23.         mov eax, Rct.right
    24.         mov edx, Rct.left
    25.         sub eax, edx
    26.         mov bWid, eax
    27.  
    28.         mov eax, Rct.bottom
    29.         mov edx, Rct.top
    30.         sub eax, edx
    31.         mov bHgt, eax
    32.  
    33.  
    34.         cmp ptX, 0
    35.         jle @F
    36.         cmp ptY, 0
    37.         jle @F
    38.  
    39.  
    40.         mov eax, bWid
    41.         cmp ptX, eax
    42.         jge @F
    43.  
    44.         mov eax, bHgt
    45.  
    46.         cmp ptY, eax
    47.         jge @F
    48.  
    49. invoke GetWindowLong,hWin,0
    50. mov hBmpU,eax
    51. invoke GetWindowLong,hWin,8
    52. mov hImage,eax
    53. invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU
    54. invoke ReleaseCapture
    55.  @@:
    Теперь при наведении курсора картинка меняется, но постоянно моргает.
    Кто-нибудь знает как исправить?
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    :) Забить на WM_MOUSEMOVE и сравнивать координаты курсора с границами кнопки по таймеру. Если курсор попадает в границы кнопки, то выставлять себе какой-нибудь флаг и не менять картинку назад, пока этот флаг установлен. Когда курсор выходит за границу сбрасывать флаг.
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Что ж так сложно-то?

    Обычное и достаточно корректное решение: по WM_MOUSEMOVE перерисовать с подсветкой (highlight) и зарегистрировать WM_MOUSELEAVE с помощью TrackMouseEvent. По WM_MOUSELEAVE подсветку кнопки убрать.
     
  14. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Мне кажется, что тут нужно писать BM_SETIMAGE, а не STM_SETIMAGE это же для STATIC
     
  15. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    IceStudent
    Зато моим способом будет работать даже тогда, когда кнопка закрыта другим окном. :)
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Может есть пример? А то не очень понятно на счёт WM_MOUSELEAVE с помощью TrackMouseEvent.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    l_inc
    Понятно, но в данном случае это скорее из пушки по воробьям

    vg
    codeproject.com - море примеров. Да и поиск по rsdn.ru в помощь.
     
  18. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Всем спасибо за ответы. Кнопку сделал, но появилась другая проблема.

    К процедуре кнопки добавил

    Код (Text):
    1.     .elseif uMsg == WM_MOUSEMOVE
    2.  
    3. mov eax,lParam
    4. cwdemov ptX,eax
    5. mov eax,lParam
    6. rol eax,16
    7. cwde
    8. mov ptY,eax
    9.  
    10. invoke GetWindowRect,hWin,ADDR Rct
    11.  
    12. mov eax, Rct.right
    13. mov edx, Rct.left
    14. sub eax, edx
    15. mov bWid, eax
    16.  
    17. mov eax, Rct.bottom
    18. mov edx, Rct.top
    19. sub eax, edx
    20.  
    21. mov edx,bWid
    22. .if ptX<0 || ptX>edx || ptY<0 || ptY>eax ; <-- Warning
    23. mov btnflag,0
    24. invoke ReleaseCapture
    25. invoke GetWindowLong,hWin,0
    26. mov hBmpU, eax
    27. invoke GetWindowLong,hWin,8
    28. mov hImage, eax
    29. invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpU
    30. .elseif btnflag!=1
    31. mov btnflag,1
    32. invoke SetCapture,hWin
    33. invoke GetWindowLong,hWin,4
    34. mov hBmpD, eax
    35. invoke GetWindowLong,hWin,8
    36. mov hImage, eax
    37. invoke SendMessage,hImage,STM_SETIMAGE,IMAGE_BITMAP,hBmpD
    38. .endif
    На одном из окон проги имеется SysListView32 c CHECKBOXES
    Код (Text):
    1. invoke CreateWindowEx,
    2. WS_EX_CLIENTEDGE,addr ListViewClass,
    3. NULL,
    4. WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHAREIMAGELISTS,
    5. 75,40,350,250,
    6. hWnd,
    7. NULL,
    8. hInstance,
    9. NULL
    10. mov hList, eax
    11. invoke SendMessage,hList,LVM_SETEXTENDEDLISTVIEWSTYLE,0,LVS_EX_CHECKBOXES
    12. mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
    13. mov lvc.pszText,offset Heading1
    14. mov lvc.lx,300
    15. invoke SendMessage,hList,LVM_INSERTCOLUMN,0,addr lvc
    16. mov lvs.imask,LVIF_TEXT or LVIF_STATE
    17. mov lvs.state,8192
    18. mov lvs.stateMask,LVIS_STATEIMAGEMASK
    19.  
    20. mov lvs.pszText,OFFSET CHECKBOXE1
    21. mov lvs.iItem,0
    22. invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs
    23. .
    24. .
    25. .
    26. mov lvs.pszText,OFFSET CHECKBOXEN
    27. mov lvs.iItem,1
    28. invoke SendMessage,hList,LVM_INSERTITEM,0,ADDR lvs
    и моя кнопка.

    Без кнопки всё нормально. При добавлении кнопки исчезают итемы в SysListView32.
    Других проблем с кнопкой нет.

    Опыты показали, что проблема в строке
    .if ptX<0 || ptX>edx || ptY<0 || ptY>eax ; <-- Warning
    Если, например, написать
    .if ptX<0 || ptX>eax || ptY<0 || ptY>eax
    то итемы появляются.
    Что за хрень!
    Есть идеи?
     
  19. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Попробуй взять БУБЕН и совершить старый ритуал по заклинанию оконной процеДУРЫ.
    А по-конкретней нетрож EDX.
    Бывает, что некоторые API не очень любят когда его меняют.
    Иеще ECX тоже не очень часто празнуют.
    Сам не раз латался.
    Попробуй, но БУБЕН - это объязательно.
    Удачи.
    Вот еще вспомнил.
    Такая конструкция в MASM не работает.
    Ну по крайней мере у меня.
    Дело в том, что компилятор вставляет код бесзнакового сравнения а -1 в таком случае больше 0.
    Может где нужно указать что-бы было сравнение с знаком, кокой-то директивой или параметром.
    Но я не знаю как.
    Кто знает? Подскажите.
     
  20. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431