Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизТреугольнички показывающие сортировку в ListView Найти похожие ветки
← →
MegaVolt © (2005-07-25 13:19) [0]Подскажите какая функция их рисует? Например кнопочки, чекбоксики DrawFrameControl. А треугольнички какая?
Заранее благодарен :)
← →
MegaVolt © (2005-07-25 16:21) [1]Ну как то их делают во всех программах одинаковыми? Неужели никто не отображает направление сортировки? Или сортировку никто не исспользует? Или ListView не используют?
Так подскажите что народ использует?
← →
Андрей Молчанов (2005-07-25 18:23) [2]ListView.Columns[0].imageindex
Мастера, подскажите пожалуйста, как сделать, чтобы картинка отображалась справа от текста в заголовке.
← →
MegaVolt © (2005-07-26 11:35) [3]>ListView.Columns[0].imageindex
Как их показывать я знаю а вот откуда брать треугольнички не выдирать же их со скриншетов программ? Есть же какие то стандартные методы. А чтобудет если пользователь цвет окна по умолчанию поменяет?
← →
MegaVolt © (2005-07-26 11:38) [4]>Мастера, подскажите пожалуйста, как сделать, чтобы картинка отображалась справа от текста в заголовке.
Посмотри вот этот компонент он наследник стандартного ListView но позволяет выводить треугольнички. Правда их он берёт с готовых картинок :(
http://home.hccnet.nl/p.zylstra/downloads/ListViewEx.zip
← →
Андрей Молчанов (2005-07-26 14:01) [5]Здравствуйте!
Вот, нашел как брать стандартные треугольнички, только что-то не работает :(. Пожалуйста, подскажите, где ошибка.
var
bmp: TBitmap;
details: TThemedElementDetails;
begin
if ThemeServices.ThemesEnabled then begin
bmp := TBitmap.Create;
bmp.Width := 9;
bmp.Height := 5;
details := ThemeServices.GetElementDetails(thHeaderSortArrowSortedUp);
ThemeServices.DrawElement(bmp.Canvas.Handle,details,Rect(0,0,9,5));
ilColumnHeaderImages.Add(bmp,nil);
bmp.Free;
end;
end;
для использования надо добавлять в uses Themes.
← →
MegaVolt © (2005-07-27 15:55) [6]Кстати оказывается что наконецто мелкомягкие добавили эту фичу в стандартный контрол только правда с версии comctrl 6.0
HDF_SORTDOWN
Version 6.00. Draws a down-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in descending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
HDF_SORTUP
Version 6.00. Draws an up-arrow on this item. This is typically used to indicate that information in the current window is sorted on this column in ascending order. This flag cannot be combined with HDF_IMAGE or HDF_BITMAP.
← →
Андрей Молчанов (2005-07-27 18:25) [7]Вот, сделал. Не наилучший вариант, конечно, но сойдет:
procedure TfrmPowerBackupMain.FormCreate(Sender: TObject);
procedure DrawArrow(Canvas: TCanvas; UpArrow: Boolean);
begin
Canvas.Brush.Color := clBlack;
Canvas.FillRect(Canvas.ClipRect);
Canvas.Brush.Color := clBtnShadow;
Canvas.Pen.Color := clBtnShadow;
if UpArrow then Canvas.Polygon([Point(4, 0), Point(0, 4), Point(8, 4)])
else Canvas.Polygon([Point(4, 4), Point(0, 0), Point(8, 0)]);
end;
var
wnd : HWND;
bmp: TBitmap;
begin
wnd := FindWindowEx(lstItems.Handle,0,"SysHeader32",nil);
if wnd <> 0 then Header_SetImageList(wnd, ilColumnHeaderImages.Handle);
bmp := TBitmap.Create;
bmp.Width := 9;
bmp.Height := 5;
DrawArrow(bmp.Canvas, True);
ilColumnHeaderImages.AddMasked(bmp,clBlack);
DrawArrow(bmp.Canvas, False);
ilColumnHeaderImages.AddMasked(bmp,clBlack);
bmp.Free;
end;
← →
Андрей Молчанов (2005-07-27 18:28) [8]А потом задаешь картинку через listview.column[0].imageindex
← →
MegaVolt © (2005-07-27 19:04) [9]Кстати оказывается можно исспользовать и то и другое :) Если винда понимает новые стили WinXp она выводит стандартные треугольнички. А если не понимает Win98 то рисованные :) Круть получилась жуткая :)
← →
Андрей Молчанов (2005-07-27 19:29) [10]Если можешь, пожалуйста, приведи получившийся код.
← →
MegaVolt © (2005-07-27 20:37) [11]В том ListViewEx на который я давал ссылку выше заменяйешь родную функцию на мою
procedure TListViewEx.SetColumnBitmap(Index: Integer; Order: TSortOption);
var
hdr: HWND;
Item: THDItem;
begin
hdr := Listview_GetHeader(Handle);
FillChar(Item, sizeof(Item), 0);
Item.Mask := HDI_FORMAT;
Header_GetItem(hdr, Index, Item);
if (Order <> soNone) and (Index = FSortColumn)
then
begin
Item.Mask := Item.Mask or HDI_BITMAP;
if Order = soAscending
then
begin
Item.fmt := (Item.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0200) and not($0400);
Item.hbm := FUpArrow.Handle
end
else
begin
Item.fmt := (Item.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0400) and not($0200);
Item.hbm := FDownArrow.Handle;
end;
end
else Item.fmt := Item.fmt and not(HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0600);
Header_SetItem(hdr, Index, Item);
end;
Я работаю под D5 поэтому дальше добавлял компоненты которые включают стили под WinXP.
Проверишь напиши работает или нет :)
← →
MegaVolt © (2005-07-27 20:37) [12]В том ListViewEx на который я давал ссылку выше заменяйешь родную функцию на мою
procedure TListViewEx.SetColumnBitmap(Index: Integer; Order: TSortOption);
var
hdr: HWND;
Item: THDItem;
begin
hdr := Listview_GetHeader(Handle);
FillChar(Item, sizeof(Item), 0);
Item.Mask := HDI_FORMAT;
Header_GetItem(hdr, Index, Item);
if (Order <> soNone) and (Index = FSortColumn)
then
begin
Item.Mask := Item.Mask or HDI_BITMAP;
if Order = soAscending
then
begin
Item.fmt := (Item.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0200) and not($0400);
Item.hbm := FUpArrow.Handle
end
else
begin
Item.fmt := (Item.fmt or HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0400) and not($0200);
Item.hbm := FDownArrow.Handle;
end;
end
else Item.fmt := Item.fmt and not(HDF_BITMAP or HDF_BITMAP_ON_RIGHT or $0600);
Header_SetItem(hdr, Index, Item);
end;
Я работаю под D5 поэтому дальше добавлял компоненты которые включают стили под WinXP.
Проверишь напиши работает или нет :)
← →
Андрей Молчанов (2005-07-27 21:17) [13]Ну во первых, TListViewEx я использовать не стал, ограничившись ImageIndex у Column. Картинки для него берутся не из SmallImages, а отдельного TImageList. А ListViewEx миает приизменении размера колонки.
Чтобы отображать стрелочку справа, поменял атрибут в исходника ComCtrls, но лучше, конечно, создать наследника.
Пожалуйста, приведи код, в котором ты генерируешь стрелочку для imagelist с использованием рисования и HDF_SORTDOWN.
← →
MegaVolt © (2005-07-27 21:25) [14]>А ListViewEx миает приизменении размера колонки.
Ага :) Убери в исходниках обработчик WM_SIZE он там не нужен и мерцание пропадёт.
>Пожалуйста, приведи код, в котором ты генерируешь стрелочку для imagelist с использованием рисования и HDF_SORTDOWN.
при исспользовании чистого рисования стрелочка грузится из ресурса лежащего в файле ListViewArrows.res посмотри его в ImageEditor там две рисованные стрелочки причём там только контуры сами стрелочки прозрачные что позволяет их лепить на любой фон.
При исспользовании HDF_SORTDOWN я не рисую стрелочки!!!! я просто меняю свойство итема и контрол сам отрисовывает стандартную стрелочку. Но отрисовывает только под WinXP если включишь поддержку стилей.
Не поленись сделай то что я написал в ListViewEx и сам увидишь что получается :) Для начала просто посмотри что вышло а потом замени процедурку на мою и посмотри как смотрится в WinXP.
Если что пиши пришлю тестовую прожку :)
← →
Андрей Молчанов (2005-07-27 21:41) [15]
> Ага :) Убери в исходниках обработчик WM_SIZE он там не нужен
> и мерцание пропадёт.
Не-а, у меня по условию первая колонка должна Autosize, так что, наверное, не выдет :(
> Не поленись сделай то что я написал в ListViewEx и сам увидишь
> что получается :) Для начала просто посмотри что вышло а
> потом замени процедурку на мою и посмотри как смотрится
> в WinXP.
Не поленился. Результат отличный. Наверное, это было бы самым лучшим вариантом если бы не AutoSize.
← →
MegaVolt © (2005-07-28 10:09) [16]>Наверное, это было бы самым лучшим вариантом если бы не AutoSize.
А что AutoSize не работает? Или работает но треугольнички пропадают?
← →
MegaVolt © (2005-07-28 10:19) [17]Похоже действительно не прорисовываются. И по большому счёту WM_Size тоже не помогает. Это похоже другое сообщение и нужно просто узнать что за оно :)
← →
имя (2005-07-28 10:37) [18]Удалено модератором
← →
Андрей Молчанов (2005-07-28 17:51) [19]Ну как?
← →
MegaVolt © (2005-07-29 10:17) [20]А тема ещё актуальна оказывается? :)))
Короче я сделал всё очень просто. Там где я вызываю изменение размеров колонок дописал строчку возвращающую картинки на родину :)
Например так :)
ListView1.SortColumn:=ListView1.SortColumn;
А изменения через AutoSize отловить не получилось :( НО!!! Это самое AutoSize можно вызвать ручками когда оно нужно и после него восстановить картинку :)
Вызывается оно выставлением Column[].Width в значение -1 или -2. НО!!! напрямую выставить неполучится. Дельфи отсекает отрицательные значения.
Поэтому нужно делать так:
ListView_SetColumnWidth(ListView1.Handle,ColIndex,Width);
Соответственно подключив commctrl модуль.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.036 c