![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 есть реагизм? Просто и правда, у вас и так уже организована "ловля", только не видно от кого пришла мессага
|