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

Вниз

OwnerDraw для ListView   Найти похожие ветки 

 
Maloric   (2008-08-27 16:00) [0]

Можно примерчик, как изменить у некоторых ячеек цвет шрифта, не нашел по OwnerDraw на форуме ничего... =(


 
mdw ©   (2008-08-27 16:02) [1]

В качестве примера можно посмотреть компонент ECMListEdit


 
Maloric   (2008-08-27 20:41) [2]

Да смотрел я его, что то не вкуриваю я в эту систему, буду пробовать раз трудно показать самый простой пример


 
Compiler ©   (2008-08-28 00:28) [3]

Примеры на форуме есть!!!

Вот, разбирайся:

OwnerDrawFixed:=True
Колонок - 3
Style=lvsDetail;

function TForm1.ListView1DrawItem(Sender: PObj; DC: HDC; const Rect: TRect;
 ItemIdx: Integer; DrawAction: TDrawAction;
 ItemState: TDrawState): Boolean;
var
 br:HBRUSH;
 iR:Trect; iCol:Integer;
 s:string;
begin
Result := TRUE;
iR:=Rect;

if (odsSelected in ItemState) then begin
  br := GetSysColorBrush(COLOR_HIGHLIGHT);
  SetTextColor(DC,GetSysColor(COLOR_HIGHLIGHTTEXT));
end else begin  //Отрисовка фона
  br := GetSysColorBrush(COLOR_WINDOW);
//  SetTextColor(DC,clBlack);
end;
 FillRect(DC,iR,br);

 for iCol:=0 to Pcontrol(Sender).LVColCount-1 do
 begin
 if (iCol in [1,3]) and (ItemIdx in [2,4,5,7])  then
    SetTextColor(DC,clRed)
 else
    SetTextColor(DC,clBlack);
   
 iR:=Pcontrol(Sender).LVSubItemRect(ItemIdx,iCol);
 if iCol=0 then begin
   iR.Right:=Pcontrol(Sender).LVColWidth[iCol];
   iR.Left:=iR.Left;
  end;
 Inc(iR.Left, 5);
 S:=Pcontrol(Sender).LVItems[ItemIdx,iCol];
 DrawText(DC,@S[1], Length(s),iR,
      DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_WORD_ELLIPSIS);
 end;
end;


 
andreil   (2008-08-28 08:02) [4]

Хм, раз тут пошло такое дело, не подскажет ли кто, как можно перехватить рисование заголовка ListView"а (Style = lvsDetail)? А то это единственная деталь в программе, которая рисуется не моим кодом :(


 
Maloric   (2008-08-28 08:50) [5]

[b]Compiler[/b],

> Вот, разбирайся

Спасибо огромное, наконец-то получилось


 
mdw ©   (2008-08-28 12:22) [6]


> Хм, раз тут пошло такое дело, не подскажет ли кто, как можно
> перехватить рисование заголовка ListView"а (Style = lvsDetail)?
>  А то это единственная деталь в программе, которая рисуется
> не моим кодом :(

Смотри TKOLmdvHeaderControl. Там есть пользовательская отрисовка заголовка. А в ListView используется тот же SysHeader32.


 
Sapersky   (2008-08-28 13:18) [7]

Можно примерчик, как изменить у некоторых ячеек цвет шрифта, не нашел по OwnerDraw на форуме ничего...

Есть ещё вариант для Listview без ownerdraw. Удобен в тех случаях, когда не нужно всё рисовать по-своему, а только подправить цвет (я изменял цвет фона, но вроде бы можно и шрифта).

FList.AttachProc( WndProcCustomDraw );

function WndProcCustomDraw( Sender: PControl; var Msg: TMsg;
                           var Rslt: Integer ): Boolean;
var NMCustDraw: PNMLVCustomDraw;
   NMHdr: PNMHdr;
   ItemIdx : Integer;
   ItemState: TDrawState;
begin
Result := FALSE;
If Msg.message = WM_NOTIFY then begin
 NMHdr := Pointer( Msg.lParam );
 if (NMHdr.code = NM_CUSTOMDRAW) then begin
   NMCustDraw := Pointer( Msg.lParam );
   ItemIdx := -1;
   If LongBool( NMCustDraw.nmcd.dwDrawStage and CDDS_ITEM ) then begin
     ItemIdx := NMCustDraw.nmcd.dwItemSpec;
     If (ItemIdx > 0) and (нужно выделить данный Item) then
       NMCustDraw.clrTextBk := SelColor; // или NMCustDraw.clrText
     Rslt := 0;
   end else
     Rslt := CDRF_NOTIFYITEMDRAW;
   Result := TRUE;
 end;
end;
end;


 
RGaysin ©   (2008-08-28 13:23) [8]

Как цвет менять я понял, а как стиль изменить шрифта?


 
Compiler ©   (2008-08-28 19:48) [9]

> RGaysin ©   (28.08.08 13:23) [8]

Listview1.Font.FontStyle:=[fsBold];
Listview1.Font.FontName:="Arial Black";
Listview1.Invalidate;


 
RGaysin ©   (2008-08-28 20:50) [10]


> Listview1.Font.FontStyle:=[fsBold];Listview1.Font.FontName:
> ="Arial Black";Listview1.Invalidate;

Дык я не про это, как DrawText-ом вывести жирный шрифт?
В примере который Вы выкладавали выше с изменением цвета


 
Compiler ©   (2008-08-29 00:09) [11]

> RGaysin ©   (28.08.08 20:50) [10]

А пример-то из [9] пробовали? Меняем у ListView FontStyle и будет жирный шрифт


 
L`Autour ©   (2008-08-29 06:15) [12]

А можно ли вручную рисовать в ListView элементы разной высоты? (нужно выводить многострочные тексты)


 
RGaysin ©   (2008-08-29 12:17) [13]

Да нет, он же меняет стиль всей таблицы, а я имел ввиду только в одной ячейке, извиняюсь, за неточность =)


 
L`Autour ©   (2008-08-29 13:23) [14]


> Да нет, он же меняет стиль всей таблицы, а я имел ввиду
> только в одной ячейке, извиняюсь, за неточность =)

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


 
RGaysin ©   (2008-08-29 15:23) [15]

Точно забывал убирать стиль.
А почему тогда все мигает в таблице:
 for iCol:=0 to PControl(Sender).LVColCount-1 do
 begin
   iR:=Pcontrol(Sender).LVSubItemRect(ItemIdx,iCol);
   if iCol=0 then begin
     iR.Right:=PControl(Sender).LVColWidth[iCol];
     iR.Left:=iR.Left;
   end;
   //Отступ в ячейки
   Inc(iR.Left, 8);
   //Обработка текста
   S:=PControl(Sender).LVItems[ItemIdx,iCol];
   SetTextColor(DC,clBlack);
   if (Str2Int(S)>49) then SetTextColor(DC,clRed);
   if (Str2Int(S)>55) then SetTextColor(DC,clGreen);
   if (iCol in [1]) then SetTextColor(DC,clBlue);
   if (Str2Int(S)>49) then PControl(Sender).Font.FontStyle:=[fsBold]
                      else PControl(Sender).Font.FontStyle:=[];
   DrawText(DC,@S[1], Length(s),iR,
   DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_WORD_ELLIPSIS);
 end;      


 
L`Autour ©   (2008-09-01 08:05) [16]

А зачем ручную отрисовывать все элементы через цикл? В обработчике нужно управлять прорисовкой только текущего элемента. Только DrawItem в отличии от CustomDraw, вызывается для всей строки, а не для каждого подъэлемента (при отрисовке вручную - не проблема).

Еще можно в включить двойную буферизацию отрисовки.


 
RGaysin ©   (2008-09-01 12:49) [17]

Ну я делаю через DrawItem как [b]Compiler[/b] научил. Я пока чайник в этих перехватах отрисовки


 
L`Autour ©   (2008-09-01 14:31) [18]

Вот мой пример (примерно так сейчас отрисовываю в своей проге):

function TForm1.ListView1DrawItem(Sender: PObj; DC: HDC;
 const Rect: TRect; ItemIdx: Integer; DrawAction: TDrawAction;
 ItemState: TDrawState): Boolean;
var
 TempStr: string;
 SolidBrush: HBRUSH;
 DefaultColor: COLORREF;
 R: TRect;
 TextSize: TSize;

 //вывод подъэлементов с формированием многоточия для длинных строк
 procedure SubItemTextOut;
 var
   i, l: Integer;
   d, iprev: Integer;
 begin
   l := Length(TempStr);
   iprev := 0;
   for i := 0 to l do
   begin
     GetTextExtentPoint32W(DC, PWideChar(TempStr), i, TextSize);
     d := (R.Right - R.Left - 4) - TextSize.cx;
     if (d < 0) then
     begin
       if (iprev = 0) then
         iprev := i;
       if (l - iprev <= 3) then
         SetLength(TempStr, l + 3);
       TempStr[iprev] := ".";
       TempStr[iprev + 1] := ".";
       TempStr[iprev + 2] := ".";
       l := iprev + 2;
       Break;
     end //if
     else if (d < 9)and(iprev = 0) then//if
       iprev := i;
   end; //for

   ExtTextOut(DC, R.Left + 4, R.Top, ETO_CLIPPED, @R,
     PWideChar(TempStr), l, nil);
 end;

begin
 Result := True;

 //смена цвета шрифта и фона для выделения текущего элемента
 DefaultColor := GetTextColor(DC);
 if (odsSelected in ItemState)and(odsFocused in ItemState) then
 begin
   SolidBrush := CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
   FillRect(DC, Rect, SolidBrush);
   DeleteObject(SolidBrush);
   SetTextColor(DC, $FFFFFF - DefaultColor);
 end;// else
   //FillRect(DC, Rect, CreateSolidBrush(GetSysColor(COLOR_WINDOW)));
 R := Rect;

 //вывод подъэлемента 1
 //--тут меняем шрифт--
 TempStr := ListView1.LVItems[ItemIdx, 0]
 R.Right := R.Left + PControl(Sender).LVColWidth[0] - 2;
 SubItemTextOut;

 //вывод подъэлемента 3
 //--тут меняем шрифт--
 TempStr := ListView1.LVItems[ItemIdx, 1]
 R.Left := R.Right + 2;
 R.Right := R.Left + PControl(Sender).LVColWidth[1] - 2;
 SubItemTextOut;

 //вывод подъэлемента 2
 //--тут меняем шрифт--
 TempStr := ListView1.LVItems[ItemIdx, 2]
 R.Left := R.Right + 2;
 R.Right := R.Left + PControl(Sender).LVColWidth[2] - 2;
 SubItemTextOut;

 //возврат цвета по муолчанию
 SetTextColor(DC, DefaultColor);
end;


 
L`Autour ©   (2008-09-01 14:38) [19]

С LVustomDraw можно делать вывод только со сменой шрифта и фона, без ручного вывода текста. Но по тех.причинам он мне не подошел и примера дать не могу. Сам находил хорошо расписанные примеры с LVCustomDraw на http://www.delphikingdom.com


 
RGaysin ©   (2008-09-01 15:58) [20]

Вместо

if (Str2Int(S)>49) then PControl(Sender).Font.FontStyle:=[fsBold]
else PControl(Sender).Font.FontStyle:=[];

вставил

Font: Cardinal;
LFont: LOGFONT;
FillChar( LFont, SizeOf( LFont ), 0 );
LFont.lfHeight := LV1.Font.FontHeight;
LFont.lfFaceName:="Verdana";
if (iCol in [1]) then LFont.lfWeight:=700
                  else LFont.lfWeight:=0;
Font := CreateFontIndirect(LFont);
SelectObject(DC,Font);
 
Перестало маргать =)


 
L`Autour ©   (2008-09-02 06:18) [21]

Я шрифты через CreateFontIndirect создаю при инициализации формы и уничтожаю при закрытии программы. Создавать и удалять шрифт в процессе вывода - не оптимально.


 
RGaysin ©   (2008-09-02 18:27) [22]

Эх, точно, это я не подумал! Спасибо за подсказку)



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

Форум: "KOL";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.056 c
2-1265626291
Petr
2010-02-08 13:51
2010.08.27
Работа с Вложенными циклами


2-1269596859
apic
2010-03-26 12:47
2010.08.27
Классический вид


15-1269551843
boa_kaa
2010-03-26 00:17
2010.08.27
Броузеры: очередное соревнование


15-1268515802
Юрий
2010-03-14 00:30
2010.08.27
С днем рождения ! 14 марта 2010 воскресенье


15-1273696195
Юрий
2010-05-13 00:29
2010.08.27
С днем рождения ! 13 мая 2010 четверг





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