Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26151
Рейтинг: 2127
#106: 2008-01-29 22:01:51 ЛС | профиль | цитата
Galkov, да моргает оно и по WM_PAINT, да еще неплохо моргает, сильно заметно при перерисовке больших полей. Читал (но не проверял), что DubleBuffer применять надо, но Кладов пишит, что метод медленный.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#107: 2008-01-29 22:07:24 ЛС | профиль | цитата
На слово-то я особо не верю...
Как проверял
карма: 9

0
Ответов: 2058
Рейтинг: 28
#108: 2008-01-29 22:11:04 ЛС | профиль | цитата
Я не знаю нужно это вам или нет, но если в компоненте Image установить ViewStyle=Stretch и выводить в нём картинки, то моргания в этом компоненте проподают.
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#109: 2008-01-29 22:13:38 ЛС | профиль | цитата
Galkov писал(а):
Как проверял

nesco писал(а):
Читал (но не проверял)

Не успел еще проверить.

карма: 22

0
Ответов: 9906
Рейтинг: 351
#110: 2008-01-29 22:16:39 ЛС | профиль | цитата
Эдик писал(а):
то моргания в этом компоненте пропадают

А они, что - ЕСТЬ
Доказательства давай.
карма: 9

1
Голосовали:Валерий
Ответов: 2058
Рейтинг: 28
#111: 2008-01-30 00:20:15 ЛС | профиль | цитата
Galkov, http://www.hiasm.com/forum.html?q=3&p=77904#p77904

------------ Дoбавленo:


Эдик, вообще то Артём использует b160, на b167 может всё подправили, но если у себя замечу то выложу схему.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#112: 2008-01-30 00:29:59 ЛС | профиль | цитата
Эдик, ты мне предлагаешь прошерстить весь топик, чтобы найти то, чего не работало у некого Артем-а, поставить элемент avitobmp, и фиг его знает чего еще
Для того, чтобы посмотреть, как у кого-то что-то замигало, и выяснить, не виноват ли здесь элемент Image

Пардон, но ответь пожалуйста на вопрос: у тебя ЕСТЬ проблемы с Image, или ты просто так - мимо проходил
карма: 9

0
Ответов: 2058
Рейтинг: 28
#113: 2008-01-30 00:41:43 ЛС | профиль | цитата
Galkov писал(а):
ответь пожалуйста на вопрос: у тебя ЕСТЬ проблемы с Image, или ты просто так - мимо проходил

Сейчас нет. Но раньше были такие же как и Артёма.
Нельзя уже рядом, мимо пройти.
карма: 1

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#114: 2008-01-30 11:52:19 ЛС | профиль | цитата
Galkov, вот, я нашел, как применять DoubleBuffer, показано на примере режима Stretch



procedure THiImageLoader.Stretch;
var memDC: HDC;
bm: HBITMAP;
begin

memDC := CreateCompatibleDC(DC);
bm := CreateCompatibleBitmap(DC, w1-x1, h1-y1);
SelectObject(memDC, bm);
FImgCtx.StretchBlt(memDC, 0,0,w1-x1,h1-y1,x3,y3,w3,h3, SRCCOPY);
BitBlt(DC, x1, y1, w1-x1, h1-y1, memDC, 0,0, SRCCOPY);
DeleteDC(memDC);
DeleteObject(bm);

// FImgCtx.StretchBlt(DC, x1,y1,w1,h1,x3,y3,w3,h3, SRCCOPY);
end;

А вот пример для проверки



#sha
Add(Button,16323980,329,364)
{
Left=315
Top=385
Width=70
Height=25
TabOrder=-1
Caption="Draw"
Data=String()
link(onClick,16422065:doWork3,[(431,370)])
}
Add(MainForm,11367671,476,231)
{
Left=20
Top=105
Width=416
Height=452
Ctl3D=0
Caption="ImageLoader -- BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF"
BorderStyle=4
Position=1
Point(onResize)
}
Add(Button,12242450,161,315)
{
Left=315
Top=355
Width=70
Height=25
TabOrder=-1
Caption="Load File"
link(onClick,1527495:doEvent1,[])
}
Add(ODialog,6607378,273,322)
{
Filter="BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF files (*.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg)|.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg|All files (*.*)|*.*"
StartDir=""
FileName=""
link(onExecute,3684329:doEvent1,[])
}
Add(Image,5070384,476,273)
{
@Hint=#2:10|
Left=5
Top=5
Width=400
Height=300
Color=16777215
TabOrder=-1
ViewStyle=1
Point(Handle)
Point(Width)
Point(Height)
Point(doRefresh)
}
Add(ImageLoader,1836674,476,329)
{
ScaleMode=1
DrawSource=1
Point2AsOffset=0
Point(Point3)
Point(Point4)
link(onLoad,16422065:doWork2,[(522,335)(522,313)(415,313)(415,342)])
link(Bitmap,5070384:Handle,[])
link(Point4,10680386:Point,[(503,317)(524,317)])
}
Add(Repeat,5895942,476,378)
{
Op1=Integer(1)
link(onRepeat,5295562:doProcessMessages,[])
link(Op1,1836674:Busy,[])
}
Add(Application,5295562,539,378)
{
Wait=1
}
Add(Hub,1527495,217,315)
{
link(onEvent1,5070384:doClear,[(272,321)(272,286)])
link(onEvent2,6607378:doExecute,[])
}
Add(Hub,3684329,329,322)
{
link(onEvent1,1836674:doLoad,[(383,328)(383,335)])
link(onEvent2,5895942:doRepeat,[(383,335)(383,384)])
}
Add(PointXY,10680386,518,273)
{
X=639
Y=479
}
Add(HubEx,16422065,427,329)
{
link(onEvent,1836674:doDraw,[])
}


Если загрузить картинку до исправления и понажимать подряд несколько раз на кнопку Draw, то будут заметны мерцания. После исправления, у меня мерцания исчезли напрочь, сколько не жал. Но есть один недостаток -- такой метод сильно порожорлив до памяти.
карма: 22

0
Ответов: 9906
Рейтинг: 351
#115: 2008-01-30 13:07:59 ЛС | профиль | цитата
1) Какова цель этих плясок с бубном
Двойной буфер - это bitmap. Зачем приделывать велосипеду еще два колеса сверху и ездить уже вверх ногами - непонятно совершенно. У него уже есть два колеса, можно ездить нормально

2) Зачем тебе обработчик очереди в схеме

3) Не надо ни искать, как применить двойной буфер, ни применять его




карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#116: 2008-01-30 13:18:38 ЛС | профиль | цитата
Galkov писал(а):
Двойной буфер - это bitmap
Да это bitmap, но отрисовывается он в памяти с последующим копировании. Да везде написано, что такой метод отрисовки, намного лучше, чем рисовать на прямом контексте.

Galkov писал(а):
Зачем тебе обработчик очереди в схеме
У меня не хочет без нее грузить картинку. Ты можешь на моей схеме показать, как его не применять, я буду очень рад этому.

Galkov писал(а):
3) Не надо ни искать, как применить двойной буфер, ни применять его
Ты мне скажи, при многократном нажатии кнопки Draw у тебя мерцает экран "до" и "после" применения буфера. Тот код, который написан, это как раз то, что рекомендовал tsdima?

Я не могу тебя понять, ты оспариваешь все, что только можно оспорить.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#117: 2008-01-30 14:04:11 ЛС | профиль | цитата
В споре рождается истина
карма: 1

1
Голосовали:Астрамак
Ответов: 9906
Рейтинг: 351
#118: 2008-01-30 14:04:45 ЛС | профиль | цитата
nesco писал(а):
Ты можешь на моей схеме показать, как его не применять, я буду очень рад этому

На здоровье

#sha
Add(MainForm,11367671,49,56)
{
Left=20
Top=105
Width=416
Height=452
Caption="ImageLoader -- BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF"
BorderStyle=4
Position=1
}
Add(Button,16323980,49,161)
{
Left=315
Top=385
Width=70
Height=25
TabOrder=-1
Caption="Draw"
Data=String()
link(onClick,16422065:doWork3,[(165,167)])
}
Add(Button,12242450,49,119)
{
Left=315
Top=355
Width=70
Height=25
TabOrder=-1
Caption="Load File"
link(onClick,6607378:doExecute,[])
}
Add(ODialog,6607378,112,119)
{
Filter="BMP, GIF, JPG, JPEG, ICO, WMF, EMF, PNG, XBM, TIFF files (*.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg)|.bmp;*.gif;*.ico;*wmf;*.emf;*.xbm;*.tiff;*.png;*.jpg;*.jpeg|All files (*.*)|*.*"
StartDir=""
FileName=""
link(onExecute,1836674:doLoad,[])
}
Add(Image,5070384,182,56)
{
@Hint=#2:10|
Left=5
Top=5
Width=400
Height=300
ViewStyle=1
Point(Width)
Point(Height)
Point(doRefresh)
}
Add(ImageLoader,1836674,210,119)
{
ScaleMode=1
DrawSource=1
Point(Point3)
Point(Point4)
link(onLoad,16422065:doWork1,[(255,125)(255,111)(165,111)])
link(Bitmap,5070384:Handle,[(223,103)(195,103)])
link(Point4,10680386:Point,[])
}
Add(HubEx,16422065,161,119)
{
link(onEvent,1836674:doDraw,[])
}
Add(PointXY,10680386,231,56)
{
X=639
Y=479
}

nesco писал(а):
Ты мне скажи, при многократном нажатии кнопки Draw у тебя мерцает экран "до" и "после" применения буфера

Говорю:
1) не мигает с моими кодами, наверное в твоей терминологии - "до"
2) и не должна
3) применять твое "после" - даже мысли такой не возникнет.
Пока у плясок с бубном не возникнет адекватная причина
Ее - НЕТ.
карма: 9

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#119: 2008-01-30 14:13:53 ЛС | профиль | цитата
Galkov писал(а):
применять твое "после" - даже мысли такой не возникнет
Да я и не говорил, что надо применять, просто показал то, о чем писал tsdima

Да и ты, вроде, спрашивал:

Galkov писал(а):
На слово-то я особо не верю...
Как проверял

Вот и проверил, на свою голову
карма: 22

0
Ответов: 9906
Рейтинг: 351
#120: 2008-01-30 15:04:52 ЛС | профиль | цитата
nesco писал(а):
Да это bitmap, но отрисовывается он в памяти с последующим копировании

По русски, пожалуйста.
На всякий случай, к твоему сведению: рисование на битмапе, это рисование на совместимом с ним контексте, и больше ни на чем.
И не припомню там никаких копирований, чего-то.
Т.е., ровно тоже самое, что ты пытаешься изобрести.
Просто оно все уже давно сделано, коды пристегнуты и новых затрат не требуют.

PaintBox: дает внешнее событие по onPaint, ты рисуешь 143 раза на контексте совместимом с битмапом (который и есть двойной буфер), этот битмап выкидывается одним махом (без миганий) на контекст окна
Все

Если невмоготу, и шибко хочется порисовать именно на окне (хотя PaintBox и сделан как окно, на котором шибко хочется порисовать): ставь в схеме элемент Bitmap, по onPaint любимого окна, рисуй на Bitmap-е (а на самом деле, на совместимом с ним контексте) 143 раза, и выкидывай этот Bitmap на окно
Все то же самое
Чего людям голову морочить с какой-то двойной буферизацией

------------ Дoбавленo:

Про то, что говорил tsdima:
Мигание возникает, когда несколько раз, по разному, рисуют на контексте окна - одну и ту же область
Это - не твой пример, нет там такого.


Про проверку: мне смутно припоминается, что в кодах Image для 160-й (нет у меня сейчас этих кодов) обработчик onPaint пользовался именно контекстом из WM_PAINT, и мигал при этом

карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)