Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-24204
Billy
2002-07-14 05:01
2002.08.08
Потомки TObject


3-23930
Ag2002
2002-07-18 14:56
2002.08.08
Grid


3-23857
kserg@ukr.net
2002-07-19 13:46
2002.08.08
Хочу узнать мнение в подходах решения след.задачи


1-24043
MaxSit
2002-07-25 17:58
2002.08.08
Связь с COM-портом по локальной сети.


7-24241
Megadeth
2002-05-24 19:21
2002.08.08
Как узнать S.M.A.R.T у HDD ??





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский