Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Переделка 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.054 c
4-1183195853
x3m
2007-06-30 13:30
2008.02.10
Программное определение ip адресса


2-1200383851
asdf
2008-01-15 10:57
2008.02.10
Раскрасить строку главного меню


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


2-1200652142
asdf
2008-01-18 13:29
2008.02.10
Как заменить строку в MySQL


15-1199980335
anton773
2008-01-10 18:52
2008.02.10
поиск файлов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский