Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
Время: 1.194 c
1-1123021095
АскЮ
2005-08-03 02:18
2005.08.21
Как правильно расчленить большой проект на классы и модули ?


14-1122647124
oldman
2005-07-29 18:25
2005.08.21
Проблемы с несчастным SP2.


14-1122370251
rea
2005-07-26 13:30
2005.08.21
Затормозить комп


14-1122788688
geidarka
2005-07-31 09:44
2005.08.21
вопрос по combobox (option) и MySQL


14-1122704592
Kerk
2005-07-30 10:23
2005.08.21
Ненавижу MLM. Ненавижу GoldenStream.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский