|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
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
|
||||
|
||||
Up.....7even UP
есть у кого хоть какие-то соображения? на данный момент победил повторной перерисовкой при скроллировании, но сдается это не совсем правильное решение (хотя работает и мерцания не видно) |