Вниз
Скачать: CL | DM;

Глюк при перерисовке   Найти похожие ветки 

 
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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.016 c
3-89111
Term
2003-10-08 11:21
2003.10.27
Народ помогите прицениться


1-89219
Петрович
2003-10-15 12:25
2003.10.27
Как создаетя пауза, например между выполнением операторов


7-89591
luckygluck
2003-08-10 17:19
2003.10.27
Включение компьютера


7-89605
ossa
2003-08-12 13:46
2003.10.27
Как организовать(за программировать) дозвон по телефону(код,


7-89627
Евгыш
2003-08-15 17:32
2003.10.27
Работа с сенсорным экраном




   Наверх