Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
ВнизDisable Form DC Найти похожие ветки
← →
Dmk (2002-07-24 00:27) [0]1. Как полностью отключить перерисовку клиентской части формы?
Что бы даже при скроллинге не происходило перемещение DC формы?
2. Я посмотрел как сделано в классе TWinControl. Если включена двойная буферизация, то PaintHandler делает так:
а.Создает временный DC.
б.Рисует туда Control"ы.
в.Вызывает сообщение WM_PAINT, т.е. рисует MemDC на экран.
Можно ли сделать так, чтобы у окна постоянно был "мой" MemDC?
Или как получить тот DC который возвращяет BeginPaint. А может его не существует? Может он всегда заново создается? Хотя такого быть не может. Перерисовка контролов занимает некоторое время. Мне кажется изображение дергалось бы.
Етот вопрос но еще проще. Я хочу использовать двойной буфер формы для своих прорисовок. Что бы при вызове WM_Paint прорисовывалось мое изображение. Если использовать свой DBufferDC, то происходит вместо 2 прорисовок формы - целых 4 (еще 2 мои), а это сильные "тормоза".
Ведь все классы переписывать это самоубийство! :(
Помогите плз.
← →
Dmk (2002-07-24 02:51) [1]На первый вопрос я нашел ответ:
LockWindowUpdate(Handle);
...Рисуем
LockWindowUpdate(0);
Работает проверил. А вот со 2-ым пока просветов нет.
← →
Dmk (2002-07-24 21:46) [2]Хоть сказали бы что-нибудь ...
← →
Dmk (2002-07-24 21:53) [3]Ну коль не знаете скажите плз. наиболее быстрый способ перемещения или сдвига региона в DC? Естественно с копированием данных. BitBlt не подходит.
← →
KilkennyCat (2002-07-25 01:16) [4]наиболее быстро - попиксельно. пикселсканлайн, например.
← →
Dmk (2002-07-25 02:54) [5]BitBlt во много раз быстрее ScanLin"a.
А вообще я уже нашел.
Функции называются ScrollDC(), ScrollWindow()
Только вот как отключить Scroll процесс в форме не знаю.
Посмотрел исходники, там ClientArea двигается функцией ScrollBy(DeltaX,DeltaY), но при условии что Handle <> 0 или окно видимо.
Т.е. разработчики не захотели, чтобы ClientArea могла не двигаться. :(
← →
Dmk (2002-07-25 20:51) [6]Yes! It IS.. Сделал короче :)
правда обработку скроллинга пришлось переписывать заново. Зато свой ScrollDC + WM_PAINT, а форма не реагирует на Scroll"инг. Скорость прорисовки - чудо.
Adobe PhotoShop must die ... :) Это шутка. А VCL это не для всех.
Пока разобрался - упарился.
← →
TTCustomDelphiMaster (2002-07-25 21:16) [7]Поделись знаниями :)
← →
Dmk (2002-07-25 21:53) [8]Вопросы по почте :)
← →
Dmk (2002-07-25 22:57) [9]2 TTCustomDelphiMaster © (25.07.02 21:16)
И не издевайтесь господа профессионалы. Между прочим я на Delphi вснго 1 год. И то от времени к времени. В неделю 5-6 часов.
И если что получилось, то очень радуюсь. Я не программист. Занимаюсь и работаю в полиграфической отрасли. Просто на работе наши программисты одолели. Не хотят нормальные фичи к программам делать. Вот я решил проверить легко ли это сделать или нет. Оказалось, что они просто не хотят перегружаться. :(
← →
TTCustomDelphiMaster (2002-07-25 23:51) [10]Dmk © (25.07.02 22:57)
Я не издеваюсь, а вполне серьезно спрашиваю с помощью чего добился такой скорости (хотя бы в двух словах в какую сторону копать). У меня есть программка в которой нужна быстрая скорость прорисовки, пока там стоит copyrect (и всех устраивает кроме меня). Хотелось бы ее доделать, да руки не доходят.
← →
Dmk (2002-07-26 02:58) [11]1. Canvas.Handle := 0; Не очень хорошо. Приходится все на API делать. Но скорость выше.
2. WM_HSCroll перехват и не дать родительской процедуре его обработать. Тоже самое на WM_VScroll.
3. Создать свой DC Равный размеру экрана.
4. Перехват сообщения WM_NCPaint. Рисуем window сами только без очистки клиентской области. Тоже очень накладно. Но можно передрать из исходников классов, что я и сделал.
5. Перехватываем сообщение WM_PAINT. не позволяем родителю ничего сделать. Если надо, то вызываем Перерисовку ClientArea.
я делаю с помощью SetDIBitsToDevice. Она немного быстрее чем BitBlt. Нужно только в том случае, если форма перекрыта чем нибудь. Тоже самое с WM_ERASEBKGND.
6. Все что надо, рисуем на нашем DC. При надобности WM_PAINT - чтобы обновить содержимое. В TCanvas еще генерится событие OnChange. Если надо определи свою переменную.
7. Скорость достигается за счет простого сдвига участка, который не нужно перерисовывать. Делаем это с помощью ScrollDC. Потом дорисовываем недорисованные области.
Просто Windows скрывает от пользователя низкоуровневые функции перемещения битовых массивов.
8. Вроде все. В итоге всего 2 прорисовки вместо 4 как делается в VCL.
Кстати VCL все рисует на Desktop"e.
Самое неудобное - это перерисовка областей перекрытых другими формами.
Если у тебя(извиняюсь за вольность) есть Photoshop внимательно посмотри как происходит перерисовка изображении при движении лапкой. если форма не перекрыта, и лапкой двигать изображение медленно то происходит скроллинг окна. С краев идет дорисовка недостающего изображения. Особенно хорошо видно на гигантских файлах т.е. больше > MemSize в твоем компьютере.
Если дернешь так, что мышка пересечет всю ClientArea окна прорисовки, увидишь полную перерисовку изображения. По кубикам.
Тоже при масштабировании. Все это сделано ради нелинейных цветовых преобразований. Например CMYK преобразования достаточно сложны, чтобы их делать в реальном времени во весь экран. Происходит конвертация в LAB модель а потом в RGB для отображения на экране. Маленькими полосками дорисовки это сделать легче и быстрее.
Если у тебя идет постоянная перерисовка экрана, то делай так
в событии WM_PAINT
var PS:TPaintSruct;
MyDC := BeginPaint(MyForm.Handle,PS);
Рисуешь на MyDC
EndPaint(MyForm.Handle,PaintSruct);
BitBlt(MyFormDC,,,,,,MyDC,,,); //во весь клиентский регион
Только отключай WM_ERASEBKGND. Сам чисть где надо
Уфф.. Теперь тоже вроде все.
Допишу движок окна, а-ля Photoshop, выложу в кладовку sources.
← →
TTCustomDelphiMaster (2002-07-26 06:45) [12]Спасибо. Пока не буду ковыряться. Подожду пару недель может в кладовке появиться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.08;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c