Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > ListView с фильтром как в explorer'е в Win7?


Автор: Mr_Devil 30.10.2012, 11:00
Подскажите как сделать такой фильтр?
Листаю MSDN, но пока безрезультатно.

Автор: DarkProg 30.10.2012, 12:43
Я бы посоветовал посмотреть в сторону DevExpress или TMS у них возможно есть готовые решения.

По сути это похоже на PopupMenu с нарисованными на ней элементами.

Автор: Mr_Devil 30.10.2012, 13:00
Что-то я сомневаюсь, что Explorer писали на сторонних компонентах.
Хотелось бы всетаки решение на WinAPI.

Автор: DarkProg 30.10.2012, 16:50
Цитата(Mr_Devil @  30.10.2012,  14:00 Найти цитируемый пост)
Что-то я сомневаюсь, что Explorer писали на сторонних компонентах.

Не ну никто не запрещает допиливать имеющиеся под конкретные задачи, вот ребята в микрософте и допилили то что было.


Цитата(Mr_Devil @  30.10.2012,  14:00 Найти цитируемый пост)
Хотелось бы всетаки решение на WinAPI

С этим, к сожалению, не помогу.

Автор: Ne1tr1n0 31.10.2012, 12:08
А это и не ListView в Explorer'e. Это нечто под названием DirectUIHWND. Что это такое, и как реализовано, хз, не копался во внутренностях, но вроде статьи какие-то видел на том же СodeProject'e или где-то ещё. Тебе нужен точно такой же список (отображающий файлы на диске, с возможностью фильтрации)? Посмотри компоненты JamShellBrowser, там есть компонент JamSystemShellView, делает то, что тебе надо. Ну и другие компоненты можно посмотреть. Если всё же надо сделать это с помощью ListView, то придется вручную отрисовывать Header у ListView, рисовать DropDown-кнопку (по всей видимости используя темы), отслеживать клики в нужных областях (если в районе DropDown'a то показывать соответствующую менюшку (её наверное придется делать отдельной формой), после нее сортировать итемы, или какие-то скрывать. В общем достаточно много работы.

Автор: Mr_Devil 31.10.2012, 14:29
В общем так, господа. Стрелочку (SplitButton), при нажатии на которую должно появляться выпадающее меню, мне получить удалось. Она нажимается, но пока ничего не происходит smile
SplitButton можно увидеть только в Win Vista и выше.
Делается это так:
Код

var
  lvHeader: HWND;
  iHDItem: HD_ITEM;
begin
  lvHeader := SendMessage(lvTable.Handle, LVM_GETHEADER, 0, 0); // получаем HWND Хэдера нашего ListView
  iHDItem.Mask := HDI_FORMAT;
  iHDItem.fmt := HDF_STRING OR HDF_SPLITBUTTON;
  SendMessage(lvHeader, HDM_SETITEM, 0, LPARAM(@iHDItem));
end;

lvTable - это самый обычный ListView. ViewStyle должен быть vsReport.
HD_ITEM - Содержит информацию для айтема хэдера. http://msdn.microsoft.com/en-us/library/windows/desktop/bb775247%28v=vs.85%29.aspx написано что там есть и для чего.
WPARAM (у нас он 0) - это номер айтема в хэдере, к которому нужно "применить" параметры из HD_ITEM.

Про Header Control написано вот http://msdn.microsoft.com/en-us/library/windows/desktop/bb775239%28v=vs.85%29.aspx. И в частности про HDM_SETITEM вот http://msdn.microsoft.com/en-us/library/windows/desktop/bb775367%28v=vs.85%29.aspx.

При установке флага HDF_SPLITBUTTON - The item displays a split button. The HDN_DROPDOWN notification is sent when the split button is clicked. HDN_DROPDOWN notification sent by a header control to its parent (т.е. нашему ListView) when the drop-down arrow on the header control is clicked.
В ListView есть такой http://msdn.microsoft.com/en-us/library/windows/desktop/bb774806%28v=vs.85%29.aspx.

Буду копать дальше smile


Автор: Mr_Devil 23.11.2012, 09:10
Попробовал я получать этот LVN_COLUMNDROPDOWN

Код

    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;

....

procedure TForm1.WMNotify(var Message: TWMNotify);
var
  iRect: TRect;
begin
  inherited;
  if Message.NMHdr.code = LVN_COLUMNDROPDOWN then
  begin
    SendMessage(lvHeader, HDM_GETITEMRECT, PNMListView(Message.NMHdr).iSubItem, LPARAM(@iRect));
    Dec(iRect.Right, 16);
    Winapi.Windows.ClientToScreen(lvHeader, iRect.BottomRight);
    PopupMenu1.Popup(iRect.Right, iRect.Bottom);
  end;
end;


Меню вываливается где надо, но есть один очень неприятный недостаток. ListView из Delphi VCL (Delphi XE2) не знает ничего про флаг HDF_SPLITBUTTON и при любых манипуляциях с хедером (например, изменение размера колонки), он его сбрасывает :(
Как вариант, можно создать ListView в рантайме на WinAPI, без использования VCL, но так не интересно smile

Автор: Mr_Devil 23.11.2012, 17:00
Установка атрибутов колонкам хэдера.
Код

procedure TForm1.SetUpColumns;
var
  iHDItem: _HD_ITEMW;
  i: Integer;
begin
  iHDItem.Mask := HDI_FORMAT;
  iHDItem.fmt :=  HDF_SPLITBUTTON;
  for i := 0 to ListView1.Columns.Count - 1 do
    SendMessage(lvHeader, HDM_SETITEM, i, LPARAM(@iHDItem));
end;

Получилось как-то так:
http://s2.ipicture.ru/Gallery/Viewfull/18136037.html
http://s2.ipicture.ru/Gallery/Viewfull/18136506.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)