![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Самодельная отрисовка мигает
Kolan © (2009-11-10 15:35:00)Есть самодельный элемент управления — наследник
TCustomControl.
По смыслу он похож на выдачу «Яндекс.Картинок». Внизу скролл и квадратики.
Я про него уже спрашивал. Только пост не могу найти. Игорь Шевченко мне еще тогда помог.
Скриншот:
http://www.ksoftware.ru/xlam/Control.jpg
Отрисовка происходит следующим образом:
procedure TCalibrationsListWidget.Paint;
var
P: TPoint;
Image: TCalibrationIcon;
R, Clipper: TRect;
ImageWidth, ImageHeight: Integer;
ImagesStartPoint: TPoint;
begin
inherited;
Canvas.Brush.Color := clWhite;
Canvas.FillRect(Self.ClientRect);
{Нарисовать квадраты для разных блоков контрола.}
Canvas.Brush.Color := $eeeeee;
Canvas.FrameRect(ListRect);
Canvas.FrameRect(InfoScrollRect);
//Canvas.FillRect(Rect(10, 10, 20, 20));
Clipper := ListRect;
IntersectClipRect(Canvas.Handle, Clipper.Left, Clipper.Top, Clipper.Right,
Clipper.Bottom);
if FCalibrationsIconsList.Count > 0 then
begin
ImageWidth := FCalibrationsIconsList[0].Width;
ImageHeight := FCalibrationsIconsList[0].Height;
{Вычислить координаты точки начала рисования картинок.}
ImagesStartPoint.Y := ListRectMiddle - (FCalibrationsIconsList[0].Height div 2);
ImagesStartPoint.X := ImagesStartPoint.Y + (FImagesPos);
P := ImagesStartPoint;
for Image in FCalibrationsIconsList do
begin
Image.Left := P.X;
Image.Top := P.Y;
{Сами картинки}
Image.Repaint;
Inc(P.X, ImageWidth + ImagesStartPoint.Y);
end;
FScroller.Top := InfoScrollRect.Top;
FScroller.Width := EvalScrollWidth;
FScroller.Left := Round((Abs(FImagesPos)*FScroller.Width)/Width);
FScroller.Height := InfoScrollRectHeight;
FScroller.Repaint;
end;
end;
Так вот. Вы не поверите, мигает, когда таскаешь за скролл. Как сделать, чтобы не мигал?
Kolan (2009-11-11 20:58:00) [1]А какой там код? Я настроил свойства, подключил картинки и в цикле создаю Items. Собственной отрисовки не делал.
Простите, не хотел выказать не уважение.
Игорь Шевченко (2009-11-11 17:34:00) [2]Kolan © (11.11.09 16:47) [32]
Кода с listview не даешь, вопросы задаешь, не уважаешь
Kolan (2009-11-11 16:47:00) [3]Я, вроде, уважаю. Что не так?
Игорь Шевченко (2009-11-11 16:41:00) [4]Kolan © (11.11.09 15:37) [18]
> Как с ним быть?
Уважать отвечающих для начала
Kolan (2009-11-11 16:39:00) [5]Помигивает лейбл лежащий на пейдж контроле и корешки закладок. ДаблБуфферд пейджконтролу сделал лучше, но окончательно не помог.
Кажется это уже ловля блох. Благодарю. Полезная ветка вышла.
DVM (2009-11-11 16:35:00) [6]
> Kolan © (11.11.09 16:32) [28]
> Мигает, все равно, конечно
скорее всего мигает уже содержимое. DoubleBuffered не забудь. У меня вообще мигать перестало.
Kolan (2009-11-11 16:32:00) [7]Круто! Мигает, все равно, конечно, но почти незаметно.
DVM (2009-11-11 16:27:00) [8]
> Kolan © (11.11.09 16:25) [26]
> Ух, страшновато патчить VCL, пусть мигает
Не надо ничего патчить. Просто модуль подключи и все. Там к PageControl относится строк 50, остальное можно выкинуть.
Kolan (2009-11-11 16:25:00) [9]Ух, страшновато патчить VCL, пусть мигает. Но за ссылку благодарю.
DVM (2009-11-11 16:19:00) [10]да точно есть: QC #56252: TPageControl flickers a lot with active theming
DVM (2009-11-11 16:16:00) [11]
> Kolan © (11.11.09 16:07) [23]
> Вот стандартный PageControl тоже при резайзе жутко мигает.
> Это как-нибудь лечится?
Вот тут посмотри http://andy.jgknet.de/blog/?page_id=288
Тебе надо искать что-то типа Flicker Reduce там есть.
Kolan (2009-11-11 16:07:00) [12]Кстати, раз уж про мигание ветка.
Вот стандартный PageControl тоже при резайзе жутко мигает. Это как-нибудь лечится?
Kolan (2009-11-11 16:06:00) [13]Понял. Я просто хотел инфоскроллер там сделать, поэтому и затеялся со своей отрисовкой.
DVM (2009-11-11 16:01:00) [14]
> Kolan ©
Кстати, если у тебя там планируется много элементов то самое правильное перевести ListView в виртуальный режим. Виртуальный режим + собственная отрисовка элементов позволяют сделать практически все что угодно.
Kolan (2009-11-11 15:59:00) [15]Ладненько, понял.
DVM (2009-11-11 15:57:00) [16]
> Kolan © (11.11.09 15:32) [16]
> Еще вопросик. Как отодвинуть рисунки от верха компонента.
>
Ты отрисовывай итемы сам, и задавай размер с запасом. При рисовании просто отступишь. Готового макроса или сообщения для увеличения отступа я не знаю, хотя не исключено что есть.
Kolan (2009-11-11 15:37:00) [17]Не, Игорь, я решил попробовать, по советам DVM, ListView. Как с ним быть?
Игорь Шевченко (2009-11-11 15:33:00) [18]
> Как отодвинуть рисунки от верха компонента
> ImagesStartPoint.Y := ListRectMiddle - (FCalibrationsIconsList[0].
> Height div 2);
изменить значение ? :)
Kolan (2009-11-11 15:32:00) [19]Еще вопросик. Как отодвинуть рисунки от верха компонента. Слишком близко прижимаются. На скриншоте расстояние, которое хочется увеличить показано красным.
http://img-fotki.yandex.ru/get/4001/ksoftware.f/0_36421_fd047bc7_orig
Kolan (2009-11-11 15:13:00) [20]Понял.
ShowScrollBar(CalibrationsListView.Handle, SB_HORZ, True);
ShowScrollBar(CalibrationsListView.Handle, SB_VERT, False);
Такой вариант, совмещенный с моей кривизной рук, глючит меньше.