Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Самодельная отрисовка мигает


Страницы:   1 2

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);


Такой вариант, совмещенный с моей кривизной рук, глючит меньше.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо