![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Здравствуйте.
Как обработать 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: у него вроде всё такое же как и обычного ЛВ, т.е. сохранены все свойства и процедуры, а кода будет меньше |