Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.10;
Скачать: CL | DM;

Вниз

Переделка ListView.   Найти похожие ветки 

 
Black_Tomcat   (2008-01-18 14:22) [0]

Здравствуйте.
У меня возникла мысль сделать ListView, который может отображать один элемент TListItem, на двух строках, но вот как это сделать я не могу догнать. Вроде все просто надо увеличить Rect TListItem и потом TextOut в половину Rect, но вот как ее увеличить?


 
sniknik ©   (2008-01-18 14:28) [1]

> но вот как это сделать я не могу догнать.
посмотри код в ЕValueListEditor


 
Black_Tomcat   (2008-01-18 14:41) [2]

А где его взять?
Точно не TValueListEditor?


 
clickmaker ©   (2008-01-18 14:51) [3]


> как ее увеличить?

высота строки листвью определяется высотой прицепленного imagelist


 
Black_Tomcat   (2008-01-18 14:58) [4]

Вот это уже классно.
Спасибо clickmaker сейчас попоробую.


 
Black_Tomcat   (2008-01-18 15:08) [5]

Есть одна проблемка, текст находится по центру рисунка, как его сделать по верхнему краю?


 
sniknik ©   (2008-01-18 15:16) [6]

> Точно не TValueListEditor?
точно он, раскладку неудачно переключил русская Е вместо английской T

так тебе две строки в каком порядке нужно? 2 строки подряд, или 2 рядом (столбцы)?


 
Black_Tomcat   (2008-01-18 15:24) [7]

Всмысле две строки друг под другом.  У первой должно быть два столбца а у второй один, но шириной как два у пердыдущей.

 |Caption    |SubItem[0]  |
 -------------------------
 |SubItem[1]                 |

Жаль что я не умею рисовать в текстовом режиме :-)


 
sniknik ©   (2008-01-18 16:14) [8]

так, имхо, ничего и не надо менять (высоту строки), просто берешь на себя отрисовку строки, и если есть в ней какой символ разделитель (сам решишь какой)  рисуешь строки с разделителем | на определенном растоянии, если нет то можно стандартно отрисовать.
вид будет как раз такой.


 
Black_Tomcat   (2008-01-18 20:38) [9]

Нет мне это надо в одном TListItem т.е., когда я выбираю первую или вторую строку они обе выбираются.
Код я написал только вот одна неприятность пришлось кинуть пустой ImageList с размером 60x32. :-) Ну и не пустой что бы значки были. В качестве образца, исходника короче предка. Взят код с Королевтва Delphi "Ответ на вопрос № 50413".
Вот что получилось:

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
 var DefaultDraw: Boolean);
var ElemRect: TRect;
   PaintRect:TRect;
   IconRect:TRect;
begin
 if item = nil then
   Exit;
With ListView1.Canvas do
 begin
   Try
   //подготовка областей
     ListView1.Columns.BeginUpdate;
     ElemRect := Item.DisplayRect(drBounds);
     IconRect := ElemRect;
     PaintRect := ElemRect;
     with IconRect do
       begin
         Left:=Left + 3;
         Right:=Left + ListViewImageList.Width;
         Top:=Top+Round(((Bottom-Top) / 2) - 16);
         Bottom:=Top + ListViewImageList.Width;
       end;
     ElemRect.Left := ElemRect.Left + ListViewImageList.Width+6;
     
     //Рисуем элементы списка
       if Item.Selected then
         Brush.Color := clBtnFace
       else
         Brush.Color := ListView1.Color;
       Brush.Style := bsSolid;
       FillRect( PaintRect );
     
       //Рисуем иконку
         NormalListViewImageList.Draw(ListView1.Canvas,
                                        IconRect.Left,
                                        IconRect.Top,
                                        Item.ImageIndex);

       //Выводим Caption
         TextOut(ElemRect.Left, ElemRect.Top + 1, item.Caption);

       //Выводим SubItems
         if Item.Selected then
           SetTextColor(ListView1.Canvas.Handle,$0)
         else
           SetTextColor(ListView1.Canvas.Handle,$828282);
         TextOutA(ListView1.Canvas.Handle,
                 ElemRect.Left,
                 (Round((ElemRect.Bottom - ElemRect.Top)/3)*2+ElemRect.Top)+2,
                 PChar(item.SubItems[1]),
                 Length(item.SubItems[1]));
         TextOutA(ListView1.Canvas.Handle,
                 ElemRect.Left,
                 Round((ElemRect.Bottom - ElemRect.Top)/3+ElemRect.Top)+2,
                 PChar(item.SubItems[0]),
                 Length(item.SubItems[0]));

       //Рисуем линии
         if Item.Selected then
           Pen.Color := RGB(249,177,25)
         else
           Pen.Color := RGB(20,152,181);
         Pen.Width := 2;
         Pen.Style := psSolid;
         MoveTo(IconRect.Left - 3,ElemRect.Bottom - 2);
         LineTo(ElemRect.Right,ElemRect.Bottom - 2);
     DefaultDraw := false;
     ListView1.Columns.EndUpdate;
   Finally
   End;
 end;//With ListView1.Canvas do
end;

Если, я в чем-то не прав, то подскажите в чем. Код работает правда быстротой не блещет.



Страницы: 1 вся ветка

Текущий архив: 2008.02.10;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
1-1194005184
davinchi
2007-11-02 15:06
2008.02.10
Клиент-серверное приложение, подскажите как лучше реализовать?


2-1200297813
dumka
2008-01-14 11:03
2008.02.10
Проигрыватель


3-1191002264
Dik59
2007-09-28 21:57
2008.02.10
Коды завершения


15-1199300008
@!!ex
2008-01-02 21:53
2008.02.10
Защита данных. Virtual Box


2-1200243231
_Shuler_
2008-01-13 19:53
2008.02.10
MS Word и буфер обмена