Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2012, 20:38
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию TTrackBar VS NM_CUSTOMDRAW

Всем доброго....
Есть TTrackBar в котором переопределяю его рисование, все работает, но с глюками, переопределяю, как гласит MSDN, обработку WM_NOTIFY со всеми вытекающими.
Проблема в следующем: если медленно двигать ползунок, то все нормально (см. скрин)

а если быстро изменять положение ползунка или кликнуть по полоске (чтобы ползунок переместился) получается следующее (см. скрин)

однако при снятии фокуса с формы все дорисовывается обработку сообщения провожу в самом TTrackBar'e.
привожу код
Код:
procedure TMouseTrackBar.CNNotify(var Message: TWMNotifyTRB);
var
  Info:PNMCustomDraw;
  SelectRect,
  UnselectRect:HRGN;
  tmp:integer;
begin
  with Message do
    if (NMHdr.code=NM_CUSTOMDRAW) and
       (NMHdr.hwndFrom=Handle) then
    begin
      Info:=Pointer(NMHdr);
      case Info.dwDrawStage of
        CDDS_PREPAINT: Result:=CDRF_NOTIFYITEMDRAW;
        CDDS_ITEMPREPAINT:
        begin
          if Info.dwItemSpec=TBCD_CHANNEL then
          begin
            tmp:=info.rc.Left+PosToPixel;
            SelectRect:=CreateRoundRectRgn(info.rc.Left+2,info.rc.Top+2,
                                           tmp,info.rc.Bottom-2,
                                           2,2);
            UnselectRect:=CreateRoundRectRgn(tmp,info.rc.Top+2,
                                             info.rc.Right-2,info.rc.Bottom-2,
                                             2,2);

            FillRgn(Info.hdc,SelectRect,CreateSolidBrush($FF));
            FillRgn(Info.hdc,UnselectRect,CreateSolidBrush($00FFFF));
            DeleteObject(SelectRect);
            DeleteObject(UnselectRect);
            Result:=CDRF_SKIPDEFAULT;
          end;
          if Info.dwItemSpec=TBCD_THUMB then
          begin
            tmp:=(info.rc.Right-info.rc.Left);
            SelectRect:=CreateRoundRectRgn(info.rc.Left-tmp,info.rc.Top+2,
                                           info.rc.Right+tmp,info.rc.Bottom-2,
                                           4,4);

            FillRgn(Info.hdc,SelectRect,CreateSolidBrush($C6C6C6));
            DeleteObject(SelectRect);
            Result:=CDRF_SKIPDEFAULT;
          end;
        end;
      end;
    end else inherited;
end;

function TMouseTrackBar.PosToPixel: integer;
begin
  Result:=Round((SendMessage(Handle,TBM_GETPOS,0,0)*
                (Width-Left))/(Max-Min))+Left;
end;

В чем может быть причина такого поведения?


PS: как офтоп.... какой тут BBcode, чтобы отправить под кат (он же спойлер)?

Последний раз редактировалось cotseec, 23.03.2012 в 20:44.
Ответить с цитированием
  #2  
Старый 29.03.2012, 19:03
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Up.....7even UP
есть у кого хоть какие-то соображения?
на данный момент победил повторной перерисовкой при скроллировании, но сдается это не совсем правильное решение (хотя работает и мерцания не видно)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter