Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.014 c
1-10834
Zheks
2003-08-21 16:04
2003.09.04
Переноска файлов с изменением имени файла


14-10875
Kost
2003-08-14 22:15
2003.09.04
Сайты


3-10617
Alexy
2003-08-13 12:09
2003.09.04
Пропадают записи в таблицах


3-10589
Sevish
2003-08-14 13:13
2003.09.04
Корретная работа с транзакциями, ХЕЛП!!!


1-10738
PsoFT
2003-08-20 10:09
2003.09.04
из string в pwidechar