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

Вниз

Рисовать в ячейках 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 вся ветка

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

Наверх





Память: 0.48 MB
Время: 0.044 c
2-1194089436
timekiller
2007-11-03 14:30
2007.11.25
Делим строку на символы, практически..


2-1193900960
Darvin
2007-11-01 10:09
2007.11.25
Перехват OnMouseWheel в DrawGrid


2-1193735286
Первокласник Вася
2007-10-30 12:08
2007.11.25
Не получается с SQL


2-1193749164
Quart
2007-10-30 15:59
2007.11.25
DBGridDrawColumnCell


2-1194269229
Свой
2007-11-05 16:27
2007.11.25
Как загрузить файл из интернета





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