Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.012 c
3-89121
Rule
2003-10-07 23:05
2003.10.27
Не могу работать с полями, почему всегда только первая запись


14-89530
cgt
2003-09-29 20:34
2003.10.27
НАРОД!!!ОБЪЕДИНЯЕМСЯ


14-89471
PHPAsker
2003-10-06 19:36
2003.10.27
Кто тут крут в PHP ?


14-89478
Lu
2003-10-02 21:01
2003.10.27
HDD какой фирмы посоветуете?


6-89414
DNT
2003-09-01 12:03
2003.10.27
Помогите начать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский