Показать сообщение отдельно
  #12  
Старый 13.06.2015, 12:46
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

cotseec, Спасибо. Ты прав. Отключил буферизацию, и полоса пропала. А вот обрабатывать WM_ERASEBKGND в моём случае будет не совсем к месту.
Но при отключении буферизации, немного мерцать начинать иногда..
Эта чёрная полоса - это background заднего буфера. Фокус в том, что везде пишут - в начале отрисовки ставится FillRect(ClientRect), т.е. закрашивают весь контрол фоном, а потом рисуют все итемы, а это кощунство. я не закрашиваю всю область фоном, а просто рисую итем. Таким образом, если сделать FillRect(ClientRect), то весь контрол будет белым, а нарисован только выделенный итем.
Вообщем придумал костыль =D
Код:
Var
...
backclear:integer;
Sinf:TScrollInfo;
maxPos:Integer;
begin
   Sinf.cbSize:= SizeOf(ScrollInfo);
   Sinf.fMask := SIF_POS + SIF_RANGE + SIF_PAGE;
   GetScrollInfo(Control.Handle, SB_VERT, Sinf);
   MaxPos:=Sinf.nMax - Round(Sinf.nPage) + 1;
   if Sinf.nPos = MaxPos then
      with (Control as TListBox).Canvas do begin
         Brush.Color:=ClWindow;
         BackRect:=ClientRect;
         backclear:=(Control as TListBox).Height mod (Control as TListBox).ItemHeight;
         BackRect.Top:=(Control as TListBox).Height-backclear;
         FillRect(BackRect);
      end;
...
Извлекаем информацию от скролла листбокса, если он находится внизу, - это сигнализирует о том, что там может нарисоваться эта черная полоса заднего буфера, Поэтому берём всю клиентскую область, смотрим сколько итемов может влезти, и забираем остаток области, и закрашиваем её =D
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием