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

Вниз

Рисовать в ячейках KOLecmListEdit   Найти похожие ветки 

 
Rusya   (2007-04-26 16:57) [0]

В одном столбце KOLecmListEdit в каждой ячейке вместе с текстом надо отрисовать значок (битма из ресурса). Назначаю обработчик OnDrawCell, и в нем пишу:
function TForm1.ListEditDrawCell(Sender: PObj; DC: HDC; const Rect: TRect;
 ACol, ARow: Integer; DrawAction: TDrawAction; ItemState: TDrawState): Boolean;
var
 R: TRect;  Glyph: PBitmap;
begin
 Result := false;
 if (ACol = 2 { столбец с рисунками } ) and (odaEntire in DrawAction) then
 begin
  if ((ARow = ListEdit.LVCurItem) and ( lvoRowSelect in ListEdit.LVOptions) ) then
   ListEdit.Canvas.Brush.Color := $F3E6CD // Hilight ECMListEdit color
  else
   ListEdit.Canvas.Brush.Color := clWindow;

   ListEdit.Canvas.FillRect( Rect );
   Glyph:= NewDIBBitmap( 16, 16, pf24bit );
   with Glyph^ do
   begin
    LoadFromResourceName( hInstance, "#100" );
    DrawTransparent(DC, Rect.Left + 2, Rect.Top + 2, clFuchsia);
    Free;
   end;

   R := Rect;
   Inc(R.Left, 24);
   Inc(R.Top, 2);
   ListEdit.Canvas.DrawText( ListEdit.LVItems[ARow, ACol], R, 0 );
   ListEdit.Canvas.Brush.Color := clWindow;
   Result := true;
 end;
end;

Отрисовывается сначала нормально, но при прокрутке списка или при щелчке на элементах списка появляются артефакты на уже отрисованных картинках в ячейках. Как победить эту проблему? Ведь список должен сам перерисовываться и при прокрутке, и при смене текущего элемента?


 
Dimaxx ©   (2007-04-26 17:51) [1]

Нет, все нужно делать самому. Я не работал с данным компонентом, но, например, нарисовав на панели рисунок в событии OnPaint приходилось всегда его перерисовывать. Скорее всего также и тут.


 
Rusya   (2007-04-28 09:41) [2]

Ну как бы перерисовка есть (см. выше) и работает, но работает шероховато - в некоторых случаях подглючивает?? Не могу понять, почему.


 
Dimaxx ©   (2007-04-28 11:29) [3]

Вполне возможно не совсем правильно вычисляется Rect после прокрутки. Попробуй вычислять его из ACol & ARow самостоятельно.

Хотя Rect и так вычисляется через свою процедуру... А какого характера артефакты? Смещенная иконка, неправильные цвета, наложенные изображения?

Попробуй еще вместо DC везде использовать ListEdit.Canvas.Handle - помню была трабла с отрисовкой именно из-за этого. Применил хэндл канвы - все стало ок.


 
Dimaxx ©   (2007-04-28 11:32) [4]

Да, вот еще что. Поскольку иконка одна на все (я так понял), попробуй ничего не меняя загрузить ее при старте приложения (а не внутри OnDrawCell) и удалять только при закрытии приложения. Возможно из-за этого могут вылезать артефакты...


 
Dimaxx ©   (2007-04-28 11:34) [5]

Мысли приходят не сразу... :) Попробуй еще создавать битмар с нулевыми размерами, а не 16х16.


 
Rusya   (2007-04-28 22:03) [6]


> Dimaxx ©   (28.04.07 11:29) [3]
> Вполне возможно не совсем правильно вычисляется Rect после
> прокрутки. Попробуй вычислять его из ACol & ARow самостоятельно.
> Хотя Rect и так вычисляется через свою процедуру... А какого
> характера артефакты? Смещенная иконка, неправильные цвета,
>  наложенные изображения?

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

>Попробуй еще вместо DC везде использовать
> ListEdit.Canvas.Handle - помню была трабла с отрисовкой
> именно из-за этого. Применил хэндл канвы - все стало ок.

Сейчас попробую.


 
Rusya   (2007-04-28 22:07) [7]


> Dimaxx ©   (28.04.07 11:32) [4]
> Да, вот еще что. Поскольку иконка одна на все (я так понял),
>  попробуй ничего не меняя загрузить ее при старте приложения
> (а не внутри OnDrawCell) и удалять только при закрытии приложения.
>  Возможно из-за этого могут вылезать артефакты...

Это ничего не меняет, по моим наблюдениям - разницы нет никакой. Притом, в дальнейшем мне понадобится грузить здесь разные битмапы и отрисовывать их, в зависимости от ячейки.


 
Rusya   (2007-04-28 22:22) [8]


> > Dimaxx ©   (28.04.07 11:29) [3]> Попробуй еще вместо DC везде
> > использовать ListEdit.Canvas.Handle - помню была трабла с отрисовкой
> > именно из-за этого. Применил хэндл канвы - все стало ок.

> Сейчас попробую.

Все стало на свои места. Вместо DC написал ListEdit.Canvas.Handle,
т.е. вместо DrawTransparent(DC, Rect.Left + 2, Rect.Top + 2, clFuchsia); получилось DrawTransparent(ListEdit.Canvas.Handle, Rect.Left + 2, Rect.Top + 2, clFuchsia);Спасибо, Dimaxx. Вроде работает без глюков втаком варианте, вот только не понятно, - почему не работает с DC.


 
Dimaxx ©   (2007-04-30 12:04) [9]

Я тоже не понимаю почему работает вариант ListEdit.Canvas.Handle, а не работает DC. Ведь по идее DC берется из ListEdit.Canvas.Handle.


 
Dimaxx ©   (2007-04-30 12:06) [10]

Возможно на время обработки события создается копия канвы и именно ее хэндл передается в обработчик. Это-то и приводит к глюкам...


 
Vladimir Kladov   (2007-04-30 16:55) [11]

Если используется DC, то не надо использовать Canvas.Handle и другие функции канвы. Потому что это может испортить дескриптор и DC уже не будет соответствовать тому, что передан при входе в обработчик. DC только для случае, когда кроме самого DC ничего не нужно.


 
Rusya   (2007-04-30 19:03) [12]


> Vladimir Kladov   (30.04.07 16:55) [11]
> Если используется DC, то не надо использовать Canvas.Handle
> и другие функции канвы. Потому что это может испортить дескриптор
> и DC уже не будет соответствовать тому, что передан при
> входе в обработчик. DC только для случае, когда кроме самого
> DC ничего не нужно.

Я так понимаю - в обработчике "или-или",- можно использовать или только DC, или только Canvas.Handle?

И в процедуру DC передается, чтобы с него читать можно было только?
Если так, то почему на него и писать нельзя?


 
Vladimir Kladov   (2007-04-30 22:05) [13]

Чего читать? DC - это дескриптор устройства для рисования. Можно рисовать функциями только API и не заводить объект канвы, сокращая размер кода.


 
Rusya   (2007-04-30 22:48) [14]

Все понятно, разобрался.



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

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

Наверх




Память: 0.5 MB
Время: 0.013 c
15-1193056466
Антон Шестаков
2007-10-22 16:34
2007.11.25
Создание справки


15-1192876882
SerJaNT
2007-10-20 14:41
2007.11.25
Опять HTML


15-1192464844
oxffff
2007-10-15 20:14
2007.11.25
Yield средствами Delphi. За и против.


2-1193743945
timekiller
2007-10-30 14:32
2007.11.25
XML, поиск конкретных Атрибутов


3-1184307277
ambhtr
2007-07-13 10:14
2007.11.25
DBGrid -> OnTitleClick