Форум: "WinAPI";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
ВнизГлюк при перерисовке Найти похожие ветки
← →
Rel_ (2003-08-21 16:19) [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-ой линией всё отлично.
← →
HolACost! (2003-08-22 13:35) [1]Удалено модератором
Примечание: Offtopic. Если нечего сказать - промолчи
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c