Текущий архив: 2003.09.04;
Скачать: CL | DM;
Вниз
проблема с перерисовкой контрола Найти похожие ветки
← →
Rel_ (2003-08-21 16:34) [0]Мастера, помогите, пол дня вожусь.
Есть код события WM_PAINT, в котором учитывется позиции вертикального и горизонтального скроллеров.
(Пишу под билдером - наскоро переделал на делфи - главное, чтоб смысл был ясен).
var
paint : PAINTSTRUCT;
DC, mdc :HDC;
paintWidth, paintHeight : Integer;
saveBitmap : HBITMAP;
begin
//начинаю рисовать
DC :=BeginPaint(Handle,@paint);
mdc=0;
paintWidth=paint.rcPaint.right-paint.rcPaint.left;
paintHeight=paint.rcPaint.bottom-paint.rcPaint.top;
//определяюсь с размерами и пересоздаю битмап для отрисовки
if ((bitmapWidth<paintWidth)or(bitmapHeight<paintHeight)or(not tmpBM))
then begin
bitmapWidth:=max(paintWidth,bitmapWidth);
bitmapHeight:=max(paintHeight,bitmapHeight);
//предполагается, что bitmapWidth и bitmapHeight уже известны - это размеры скроллируемого битмапа; они могут быть больше клиентской части - для энтого и используется скроллер.
if( tmpBM ) DeleteObject(tmpBM);
tmpBM:=CreateDiscardableBitmap(hdc,bitmapWidth,bitmapHeight);
end
//далее просто рисую
if ( tmpBM and (mdc:=CreateCompatibleDC(hdc)) )
then begin
saveBitmap:=SelectObject(mdc,tmpBM);
FillRect(mdc,&TRect(0,0,bitmapWidth,bitmapHeight),brush);
int dx=GetScrollPos(Handle,SB_HORZ)+paint.rcPaint.left,
dy=GetScrollPos(Handle,SB_VERT)+paint.rcPaint.top;
//обратите внимание глюк здесь - эффект должен быть таким, чтобы при скроллировании отрисованная линия оставалась на месте
TRect r;
r.Left=2+dx; r.Top=25+dy; r.Right=25+dx; r.Bottom=paintWidth-2+dy;
MoveToEx(mdc, 10+r.Left,10+r.Top,0);
LineTo(mdc, 10+r.Left,200+r.Top);
// а вот так глюк исчезается, т.е. когда не использую dx,dy
r.Left=2; r.Top=55; r.Right=25; r.Bottom=paintWidth-2;
MoveToEx(mdc, 10+r.Left,10+r.Top,0);
LineTo(mdc, 10+r.Left,200+r.Top);
// теперь просто копирую изображение
BitBlt(hdc, paint.rcPaint.left, paint.rcPaint.top, paintWidth, paintHeight, mdc, dx, dy, SRCCOPY) ;
SelectObject(mdc,saveBitmap);
end;
DeleteDC(mdc);
EndPaint(Handle,&paint) ;
end;
Так вот глюк в следующем. Всё скроллируется отлично. Вот только все окна передвигаемые , например сверху (над контролос) вниз оставляют за собой след в виде отрисовываемого мной изображения ( в приведённом примере - горизонтальную линию ), причём ту, которая зависит от положения скроллера dx, dy. Со 2-ой линией всё отлично.
← →
Rel_ (2003-08-21 16:40) [1]Мастера, глюк возникает даже тогда, когда
dx:=0;
dy:=0;
Страницы: 1 вся ветка
Текущий архив: 2003.09.04;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.032 c