ListView. Реагирование на нажатие правой кнопки мыши. как?

Тема в разделе "WASM.BEGINNERS", создана пользователем 01478520, 12 сен 2007.

  1. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    Вобщем надо скопировать содержимое итема в буфер. кликаем по нему правой кнопкой мыши, и должно появится попап меню. но вот только как задать чтоб отслеживался клик? WM_RBUTTONDOWN не доходят до ListView.
     
  2. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    NM_RCLICK
     
  3. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    спасибо, а то я завис...
     
  4. OFFSIDE

    OFFSIDE New Member

    Публикаций:
    0
    Регистрация:
    23 сен 2006
    Сообщения:
    106
    01478520
    Есть хорошие исходники. Юзай поиск по сайту, изучай.
     
  5. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    OFFSIDE
    канеша искал, нашёл но и только. у меня задачка списать интерфейс пассворд про,.. там вот, нажимая правой кнопкой мыши на итеме (хеш полученный), выскакивает попап - жмёш получаеш хеш в clipboard.
    мой код:
    Код (Text):
    1. 1     .elseif eax == WM_NOTIFY
    2. 2       mov ebx, lParam
    3. 3           assume ebx:ptr NMHDR
    4. 4           mov eax,[ebx].hwndFrom
    5. 5               .if eax == g_hwndReportListView
    6. 6                   mov eax,[ebx].code
    7. 7                       .if eax==LVN_ITEMCHANGED;NM_RCLICK;LVN_ITEMCHANGED ;WM_RBUTTONDOWN
    8. 8                       mov ebx, lParam
    9. 9                       assume ebx: ptr NMLISTVIEW
    10. 10                          .if [ebx].uNewState == 3
    11. 11                              invoke GetCursorPos,addr pt
    12. 12                              invoke SetForegroundWindow,hDlg
    13. 13                              invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN or TPM_LEFTBUTTON,pt.x,pt.y,NULL,hDlg,NULL
    14. 14                                  invoke PostMessage,hDlg,WM_NULL,0,0
    15. 15                          .endif
    16. 16                      .endif
    17. 17              .endif
    18.     .else
    Вобщем в строке 7: если LVN_ITEMCHANGED, то отслеживает изменеие итема вообще (лев,прав клики).
    если NM_RCLICK, то правый клик где угодно, то есть уже неотслеживает на ком кликнули

    Так вот как это обЪеденить?
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Для каждого NMHDR.code своя обработка, и все передаваемые через lParam структуры организованы так, что первым идет NMHDR, а последующая часть зависит от NMHDR.code. Соответственно, для разных кодов приходят разные структуры, в частности при NM_RCLICK приходит NMITEMACTIVATE, из которого можно получить, на каком итеме был клик (или индекс итема, или -1, если в пустом месте).
    Надо просто сделать нужный assume ebx, в твоём случае после assume ebx:ptr NMHDR и опеределения, что код = NM_RCLICK, нужно сделать assume ebx:ptr NMITEMACTIVATE и смотреть в [ebx].iItem
    Или вот альтернативная форма записи (без assume):

    Код (Text):
    1.             mov ebx, lParam
    2.             .if [ebx.NMHDR].code==NM_RCLICK
    3.                 lea     esi,[ebx.NMITEMACTIVATE]
    4.                 PrintDec [esi.NMITEMACTIVATE].iItem
    5.                 .if     [esi.NMITEMACTIVATE].iItem != -1
    6.                     invoke  ShowLVPopup, [esi.NMITEMACTIVATE].iItem
    7.                 .endif
    8.             .endif
    Правда с такой формой записи нужно помнить все члены структуры, т.к. Radasm не показывает всплывающих подсказок с именами членов структуры.
     
  7. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    хм... а что это за ф. ShowLVPopup? У меня синтакс масм
    спасибо, работает!
    Ну вот попап вылез, теперь надо взять содержимое итема и поместить в буфер
    это как? Тоесть как получить доступ к колонке. если так
    Код (Text):
    1.  ListView_GetItemText g_hwndReportListView, LV_iItem, 0, addr LV_Buf, sizeof LV_Buf
    то получаем именно название итема: /1/

    колонка1 колонка2

    /1/ ТЕКСТ1
    2 ТЕКСТ2
    3 ТЕКСТ3
    а как получить ТЕКСТ1 ?
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Это код из моей проги, там тоже показывается попап меню по правому клику.

    Содержимое итема можно взять, послав листу сообщение LVM_GETITEM с заполненой структурой LVITEM. В структуре указать флаг LVIF_TEXT, номер итема, номер субитема , адрес приёмного буфера и размер приёмного буфера.
    Чтобы поместить полученый текст в clipboard юзай OpenClipboard/SetClipboardData/CloseClipboard
     
  9. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    У тебя третий параметр ListView_GetItemText установлен в ноль, поэтому получаешь текст первой колонки. Установи в 1 - будет текст второй колонки.

    Или используй такую функцию:

    Код (Text):
    1. lv_GetItemText proc hLV:DWORD, iItem:DWORD, iSubItem:DWORD, lpOut:DWORD, cbOut:DWORD
    2.     LOCAL lvi   :LVITEM
    3.  
    4.     mov     lvi.imask, LVIF_TEXT
    5.     mov     eax,lpOut
    6.     mov     lvi.pszText, eax
    7.     mov     eax, cbOut
    8.     mov     lvi.cchTextMax, eax
    9.     mov     eax,iItem
    10.     mov     lvi.iItem, eax
    11.     mov     eax,iSubItem
    12.     mov     lvi.iSubItem, eax
    13.     invoke  SendMessage, hLV, LVM_GETITEM, iItem, addr lvi
    14.     ret
    15.  
    16. lv_GetItemText endp
    hLV - хэндл листвью, iItem - номер итема, iSubItem - номер колонки (0-первая колонка, 1-вторая, 2-третья и т.д.), lpOut -адрес буфера, куда будет получен текст, cbOut - размер этого буфера.
     
  10. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    Да, с iSubItme запорол. я вот хотел зайти и отредактировать месседж.
    не, я просто после NM_RCLICK забил iItem и iSubItem в переменные, а потом при обработке комманд получил текст iSubItema//
    спасиба cresta за напутствия...

    ЗЫ: удобная функция
     
  11. 01478520

    01478520 New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2007
    Сообщения:
    39
    Кстати,
    .data
    String0 db "TEXT",0
    .data?
    String1 db 4 dup (?)
    .code
    ;чем отличается:
    invoke MessageBox,0, addr String0, 0, 0
    ;от
    invoke MessageBox,0, offset String0, 0, 0

    invoke MessageBox,0, addr String1, 0, 0
    ;от
    invoke MessageBox,0, offset String1, 0, 0
    ?