|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как обработать Click и DblClick по ListView (WinAPi)
Здравствуйте.
Как обработать Click и DblClick по ListView(WinAPi). как и куда писать и как изенить цвет текста выделенной строки? Если не затруднит, дайте рабочий пример. Спасибо. Последний раз редактировалось Stalker2-42, 16.08.2014 в 21:44. |
#2
|
||||
|
||||
А что значит ListView(WinAPi), на чистом что-ли? Тогда покажите, как вы его создете - если окажется что примерно вот так
Код:
... with TListView.Create(self) do begin parent:= Form1; Items.Add.Caption:= 'Item 1'; items.Add.Caption:= 'Item 2'; // etc. end; ... З.Ы. Другими словами - для ответа маловато исходной инфы Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
||||
|
||||
Приветствую!!!
Вот так: Код:
var WndClassEx : TWndClassEx; // Класс окна - несёт инфу об окне (запись) Form, LV, {AddForm, }button, Btn2 : hwnd; //переменные для хендлов созданных объектов MMsg: Msg; // Входящие мессаги ..... Case Msg Of WM_CREATE: begin DragAcceptFiles(Forma, True); GetClientRect(Forma, Rect); button := CreateWindowEx (0, 'BUTTON', 'Изменить путь', WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON, 5, Rect.Bottom - 35, Rect.Right div 2 - 2, 35, Forma, ButtonID, HInstance, NIL); Btn2 := CreateWindowEx (0, 'BUTTON', 'Изменить путь2', WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON, Rect.Right div 2 + 5, Rect.Bottom - 35, Rect.Right div 2 - 10, 35, Forma, BtnID, HInstance, NIL); LV :=CreateWindowEx(WS_EX_CLIENTEDGE,'SysListView32', '1', WS_CHILD or WS_VISIBLE or LVS_REPORT or WS_BORDER or WS_TABSTOP or LVS_SINGLESEL or LVS_SHOWSELALWAYS, 5, 5, Rect.Right-10 ,Rect.Bottom - 40,Forma, LVID, HInstance,nil); // SendMessage(LV, WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), 1); SendMessage(lv, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_INFOTIP); // SendMessage(LV, LB_ADDSTRING, 1 , 0) lvc.fmt := LVCFMT_CENTER; lvc.mask := LVCF_TEXT + LVCF_WIDTH; lvc.pszText := 'Имя'; lvc.cx := 250; ListView_InsertColumn(lv, 0, lvc); lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM; lvc.pszText := 'ууу'; lvc.cx := 60; lvc.iSubItem := 1; ListView_InsertColumn(LV, 1, lvc); // lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM; lvc.pszText := 'ааа'; lvc.cx := 50; lvc.iSubItem := 1; ListView_InsertColumn(LV, 2, lvc); lvc.fmt := LVCFMT_LEFT; //lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM; lvc.pszText := 'Путь к файлу'; lvc.cx := LVSCW_AUTOSIZE_USEHEADER;//250; lvc.iSubItem := 1; ListView_InsertColumn(LV, 3, lvc); end; // WM_SHOWWINDOW: ShowWindow (AddForm, SW_SHOW{NORMAL}); // Показывем окно WM_LBUTTONDBLCLK: // if HWND(WPARAM) = LVid then MessageBox(0,'','',0); WM_DROPFILES: WMDropFiles( MMsg); WM_COMMAND: // Через это сообщение определяем нажатие на кнопку begin //Если мессага пришла от кнопки // If LoWord (WParam) = ButtonID Then //И если это было нажатие If HiWord (WParam) = BN_CLICKED then case hwnd(WParam) of// Buttonid: begin // ListView_SetSelectionMark(LV,1); // ListView_SetItemState(LV, 11 , LVIS_SELECTED or LVIS_FOCUSED, LVIS_SELECTED or LVIS_FOCUSED); // я выделяю строку i := ListView_getSelectionMark(LV); //выделенная строка // ListView_GetItemText(LV, 0, 7, filename, SizeOf(filename)) ; //получение содержимого колонки путь SetWindowText(Form, {filename} PChar(IntToStr(i)) ); // ListView_SetItemCountEx(LV, 1, lv); end; BtnID: MessageBox(0, '','',0); end; end; WM_SIZE: // Посылается после изменения размеров окна (формы) Begin GetClientRect(Form, Rect); SetWindowPos(LV, 0, 5, 5, Rect.Right-10, Rect.Bottom - 40, SWP_NOZORDER); SendMessage(LV,LVM_SETCOLUMNWIDTH, 3, LVSCW_AUTOSIZE_USEHEADER); SetWindowPos(button, 0, 5, Rect.Bottom - 35, Rect.Right div 2 - 2, 35, SWP_NOZORDER); SetWindowPos(Btn2, 0, Rect.Right div 2 + 5, Rect.Bottom - 35, Rect.Right div 2 - 10, 35, SWP_NOZORDER); // setwindowpos End; WM_DESTROY: begin DragAcceptFiles(Forma, False); PostQuitMessage(0); end; Else // Если пришедщее сообщение мы не определили: Result := DefWindowProc(Forma, Msg, WParam, LParam); // Эта функция обрабатывает ВСЕ ОСТАЛЬНЫЕ сообщения по умолчанию End; // Конец блока Case Умудрилс DragNDrop воткнут--работает. А вот клик и двоной клик ну ни как. Последний раз редактировалось Stalker2-42, 17.08.2014 в 16:54. |
#4
|
||||
|
||||
И вам не хворать!
Похоже тогда придётся вам ещё свою калбек-функцию подключать типа Код:
function NewListProc(wnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM):integer; stdcall; begin result:=CallWindowProc(Pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd, uMsg,wParam,lParam); if uMsg=WM_NOTIFY then if lParam^.hdr.code=WM_NCLBUTTONDBLCLK then begin // вот здесь обработка события end; end; Код:
SetWindowLong(LV,GWL_USERDATA,SetWindowLong(LV, GWL_WNDPROC, LPARAM(@NewListProc))); Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
||||
|
||||
Ругается на if lParam^.hdr.code.
А проще нельзя сделать? Уже руки к низу. По моей логике, если прошел dbclick, то по какому HWND: Код:
WM_LBUTTONDBLCLK: if HWND = LV then begin //чтото делаем end; Последний раз редактировалось Stalker2-42, 17.08.2014 в 17:37. |
#6
|
||||
|
||||
Неужели нкто незнает не работал с ListView ?
|
#7
|
||||
|
||||
А сообщения отлавливаются, на WM_LBUTTONDBLCLK есть реагизм? Просто и правда, у вас и так уже организована "ловля", только не видно от кого пришла мессага
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#8
|
||||
|
||||
Скажем так. я нигде не видел примеров с Listbox и Listviev(инет и книги).
Следовательно я мало что понимаю. Клик по самому окну проходит(MessageBox). А как отловить сообщение от LV,ума не приложу. Последний раз редактировалось Stalker2-42, 17.08.2014 в 20:42. |
#9
|
||||
|
||||
Цитата:
фА если делать так== Код:
WM_LBUTTONDBLCLK: if HWND(WPARAM) = LVid then MessageBox(0,'','',0); Может надо еще что-то и где-то было указать? ЕСТЬ КТО ЖИВОЙ? Последний раз редактировалось Stalker2-42, 17.08.2014 в 20:44. |
#10
|
||||
|
||||
Оффтоп:
Цитата:
Вообще ифзен на время уберите (два слеша на вторую строчку) - будет ли реагировать на даблклик? В смысле ловится ли он Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#11
|
||||
|
||||
пьяные - счастливые
Код:
WM_LBUTTONDBLCLK: //if HWND(WPARAM) = LVid then MessageBox(0,'','',0); Код:
WM_LBUTTONUP://WM_LBUTTONDOWN // if HWND(WPARAM) = LVid then MessageBox(0,'','',0); Может мне весь код выложить? он не большой. хаааа. 143 просмотра темы - реакция...... Последний раз редактировалось Stalker2-42, 17.08.2014 в 22:11. |
#12
|
||||
|
||||
Значит нет посылки - необходимо смотреть что приходит, вероятно нужно другие константы использовать, всё может быть
З.Ы. и Оффтоп в одном флаконе (забыл как яркость у шрифта убрать без явы, шоб в глаза это не кидалось, простите): Выкладывайте на-здоровье, может кто подскажет, лично я доберусь до нормального компа лишь в сентябре, не раньше, извнт, хороший вы человек Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Stalker2-42 (17.08.2014)
|
#13
|
||||
|
||||
Alegun - в отпуке?
Вот мое творение. Выкладываю как есть,с моими эксперементами. Код:
program Project1; uses Windows, Messages, CommCtrl, SysUtils, ShellAPI, Classes; Const ButtonID = 100; BtnID = 101; LVID = 13; var WndClassEx : TWndClassEx; Form, LV, button, Btn2 : hwnd; MMsg: Msg; item : tLVITEM; {$R *.res} Function WinProc(Forma: hwnd; Msg: Cardinal;wparam: WParam;LParam: Cardinal): lresult; Stdcall; Var Rect: TRect; lvc : TLVCOLUMN; I : Integer; filename : array [0..2000] of Char; Begin Result := 0; // Чтобы в случае сбоя программы до последней строки функции Windows правильно определила ошибку Case Msg Of WM_CREATE: begin DragAcceptFiles(Forma, True); GetClientRect(Forma, Rect); button := CreateWindowEx (0, 'BUTTON', 'Изменить путь', WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON, 5, Rect.Bottom - 35, Rect.Right div 2 - 2, 35, Forma, ButtonID, HInstance, nil); Btn2 := CreateWindowEx (0, 'BUTTON', 'Изменить путь2', WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON, Rect.Right div 2 + 5, Rect.Bottom - 35, Rect.Right div 2 - 10, 35, Forma, BtnID, HInstance, NIL); LV :=CreateWindowEx(WS_EX_CLIENTEDGE,'SysListView32', '1', WS_CHILD or WS_VISIBLE or LVS_REPORT or LVS_SHOWSELALWAYS or LVS_EX_TWOCLICKACTIVATE or LVS_EX_ONECLICKACTIVATE or WM_LBUTTONDOWN , 5, 5, Rect.Right -10 ,Rect.Bottom - 40,Forma, LVID, HInstance,nil); SendMessage(lv, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT or LVS_EX_GRIDLINES or LVS_EX_INFOTIP); lvc.fmt := LVCFMT_CENTER; lvc.mask := LVCF_TEXT + LVCF_WIDTH; lvc.pszText := '0'; lvc.cx := 250; ListView_InsertColumn(lv, 0, lvc); lvc.mask := lvc.mask or LVCF_FMT or LVCF_SUBITEM; lvc.pszText := '1'; lvc.cx := 60; lvc.iSubItem := 1; ListView_InsertColumn(LV, 1, lvc); lvc.pszText := '2'; lvc.cx := 50; lvc.iSubItem := 1; ListView_InsertColumn(LV, 2, lvc); lvc.pszText := '3'; lvc.cx := 100; lvc.iSubItem := 1; ListView_InsertColumn(LV, 3, lvc); lvc.pszText := '4'; lvc.cx := 100; lvc.iSubItem := 1; ListView_InsertColumn(LV, 4, lvc); lvc.pszText := '5'; lvc.cx := 100; lvc.iSubItem := 1; ListView_InsertColumn(LV, 5, lvc); lvc.pszText := '6'; lvc.cx := 100; lvc.iSubItem := 1; ListView_InsertColumn(LV, 6, lvc); lvc.fmt := LVCFMT_LEFT; lvc.pszText := 'Путь к файлу'; lvc.cx := LVSCW_AUTOSIZE_USEHEADER;//250; lvc.iSubItem := 1; ListView_InsertColumn(LV, 7, lvc); // EnableWindow(button,False); // FormAdd; { // for I := 0 to 10 do // begin FillChar( item, sizeof(item), 0 ); item.mask := LVIF_TEXT; //item.iItem := 0; item.pszText := ('СЕРГЕЙ СЕРГЕЕВ'); ListView_InsertItem(LV, Item); // end; // SendMessage(lv, LVM_INSERTCOLUMN, 2, LongInt(@Item)); //LVM_INSERTITEM; // item.mask := LVIF_TEXT or LVIF_IMAGE; // item.iItem := Item; item.iSubItem := 1; item.pszText := '123456789'; // listview_seti ListView_SetItem(LV, item); } end; {WM_NOTIFY: If HiWord (WParam) = WM_LBUTTONDOWN then // if HWND(WPARAM) = LVID then // SetWindowLong(LV,GWL_USERDATA,SetWindowLong(LV, GWL_WNDPROC, LPARAM(@NewListProc))); MessageBox(0,'','',0); } WM_rBUTTONDOWN: // if HWND(WPARAM) = LVid then MessageBox(0,'','',0); WM_COMMAND: begin // If LoWord (WParam) = ButtonID Then //И если это было нажатие { If HiWord (wParam) = WM_LBUTTONDOWN then // if HWND(WPARAM) = LVID then case hwnd(WParam) of// // SetWindowLong(LV,GWL_USERDATA,SetWindowLong(LV, GWL_WNDPROC, LPARAM(@NewListProc))); LVID: MessageBox(0,'','',0); end; } // If HiWord (WParam) = BN_CLICKED then case {hwnd(WParam)}LOWORD(wParam) of// Buttonid: begin // ListView_SetSelectionMark(LV,1); // ListView_SetItemState(LV, 11 , LVIS_SELECTED or LVIS_FOCUSED, LVIS_SELECTED or LVIS_FOCUSED); // я выделяю строку i := ListView_getSelectionMark(LV); //выделенная строка ListView_GetItemText(LV, {0}i, {7}1, filename, SizeOf(filename)) ; //получение содержимого колонки путь SetWindowText(Form, PChar(IntToStr(i)+ ' - ' + filename) ); // ListView_SetItemCountEx(LV, 1, lv); end; BtnID:// MessageBox(0, '','',0); begin FillChar( item, sizeof(item), 0 ); item.mask := LVIF_TEXT; item.pszText := PChar('aaaa'); ListView_InsertItem(LV, Item); item.iSubItem := 1; item.pszText := PChar('fff'); ListView_SetItem(LV, item); item.iSubItem := 2; item.pszText := PChar('kkk'); ListView_SetItem(LV, item); end; // LVID: MessageBox(0,'yaaaa','Сообщение',MB_OK); end; end; WM_SIZE: // Посылается после изменения размеров окна (формы) Begin GetClientRect(Form, Rect); SetWindowPos(LV, 0, 5, 5, Rect.Right-10, Rect.Bottom - 40, SWP_NOZORDER); SendMessage(LV,LVM_SETCOLUMNWIDTH, 7, LVSCW_AUTOSIZE_USEHEADER); SetWindowPos(button, 0, 5, Rect.Bottom - 35, Rect.Right div 2 - 2, 35, SWP_NOZORDER); SetWindowPos(Btn2, 0, Rect.Right div 2 + 5, Rect.Bottom - 35, Rect.Right div 2 - 10, 35, SWP_NOZORDER); // setwindowpos End; WM_DESTROY: begin DragAcceptFiles(Forma, False); PostQuitMessage(0); end; Else // Если пришедщее сообщение мы не определили: Result := DefWindowProc(Forma, Msg, WParam, LParam); End; End; Procedure WinMain; Begin // Заполняем запись информацией: FillChar(WndClassEx, SizeOf(TWndClassEx), 0); WndClassEx.cbSize := SizeOf(TWndClassEx); // Размер структуры WndClassEx.lpszClassName := 'APIWindow'; // Имя класса окна (для примера - второй параметр функции FindWindow) // WndClassEx.hbrBackGround := GetSysColorBrush(COLOR_BTNFACE); WndClassEx.style := CS_HREDRAW Or CS_VREDRAW; // Стили окна - в данном случае окно будет перерисовываться при изменении как горизонтальных, так и вертикальных размеров WndClassEx.hInstance := HInstance; // Ищи описание выше WndClassEx.lpfnWndProc := @WinProc; // адрес окнной процедуры WndClassEx.cbClsExtra := 0; WndClassEx.cbWndExtra := 0; WndClassEx.hIcon := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Икнока окна WndClassEx.hIconSm := LoadIcon(HInstance, MakeIntResource('MAINICON')); // Тоже иконка (но маленькая :) WndClassEx.hCursor := LoadCursor(0, IDC_ARROW); // Курсор мыши для окна (у нас - стрелка) WndClassEx.hbrBackground := COLOR_BTNFACE + 1; // Фон окна WndClassEx.lpszMenuName := NIL; // Указатель на меню (у нас меню нет) //registerclassex(WndClassEx);// регистрируем в системе новый класс окна // Теперь регистрируем класс окна в системе If RegisterClassEx(WndClassEx) = 0 Then MessageBox(0, 'Невозможно зарегистрировать класс окна1', 'Ошибка', MB_OK Or MB_ICONHAND) Else Begin // Создаём окно Form := CreateWindowEx( 0, WndClassEx.lpszClassName, 'mp3player', WS_OVERLAPPEDWINDOW {or ws_ex_appwindow {or ws_ex_acceptfiles} {WS_SYSMENU} , 500,100, //CW_USEDEFAULT, 0, // Позиция относительно экрана (CW_USEDEFAULT означает, что размеры будут определяться Windows) 420, 400, 0, 0, HInstance, NIL); // Дополнительные параметры If Form = 0 Then // Если окно не создалось: MessageBox (0, 'Окно1 не создалось!', 'Ошибка', MB_OK Or MB_ICONHAND) Else Begin ShowWindow (Form, SW_SHOWNORMAL); // Показывем окно While GetMessage(MMsg, 0, 0, 0) Do // Эта функция извлекает очередное сообщение из очереди сообщений, Begin TranslateMessage(MMsg); // Переводит нажатия клавиш, чтобы их можно было обработать оконной процедуре DispatchMessage(MMsg); // Отправляем мессагу оконной процедуре End; Halt(MMsg.WParam); // Завершение работы при получении мессаги WM_QUIT (при выходе из цикла жизни программы) End; End; End; Begin WinMain; End. Почему не могу отловить клик по ListView, где ошибка? Последний раз редактировалось Stalker2-42, 17.08.2014 в 23:49. |
#14
|
||||
|
||||
Стоит ли мне ждать помощь здесь?
|
#15
|
||||
|
||||
Оффтоп:
Цитата:
Как понимаю, все ухищрения для снижения веса сборки, кстати, а вы не пробовали задействовать готовый "лёгонький" компонент KOLListView: у него вроде всё такое же как и обычного ЛВ, т.е. сохранены все свойства и процедуры, а кода будет меньше Я не понял Вашего вопроса, но всё же Вам на него отвечу! |