Всем доброго....
Есть 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, чтобы отправить под кат (он же спойлер)?