Can't create autoredraw image

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Can't create autoredraw image

Сообщение Gena » 05.02.2004 (Чт) 12:06

Подскажите как обойти ошибку "Can't create autoredraw image"!!!
Суть задачи такова:
Имеется два PictureBox'а (1-й и 2-й). 1-й является контейнером для 2-го. В ходе выполнения программы 2-й скролится и меняет свои размеры (посредством .top, .left, .width, .height). Изображение во 2-м строится программно из точек, линий, полигонов и надписей (триангуляционная цифровая модель рельефа) .AutoRedraw=True.
Естественно при изменении размеров 2-го (масшабировании) памяти выделеной на Autoredraw не хватает, перерисовка Paint (.AutoRedraw=False) работает медленно. Подскажите возможно ли сохранять в памяти такие изображения и их потом восстанавливать???

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.02.2004 (Чт) 17:56

Держишь в памяти базовые спрайти (точки, линии, полигоны) и в _Paint рисуешь их BitBlt. Тексты рисуются через DrawText.
Lasciate ogni speranza, voi ch'entrate.

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 06.02.2004 (Пт) 9:40

Дело в том, что линии и тем более полигоны имеют произвольную ориентацию и длину поэтому использование спрайтов проблематично. Возможно ли ускорить прорисовку или хранить и восстанавливать изображение.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 06.02.2004 (Пт) 10:11

А чем тебя CreateCompatibleBitmap не устараивает? Сохранить образ проше всего с помощью него..

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 06.02.2004 (Пт) 11:31

Переходи на API, это ускорит перерисовку.
Lasciate ogni speranza, voi ch'entrate.

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 06.02.2004 (Пт) 12:36

CreateCompatibleBitmap устраивает. Подскажите как грамотно организовать.

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 10.02.2004 (Вт) 4:16

Can't create autoredraw image у меня обычно вылетает, когда многократно используешь какую-то операцию графического вывода, но не совсем корректно написанную. Обычно ошибка заключается в том, что не удален какой-то объект GDI. Проверь эти моменты.

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 10.02.2004 (Вт) 9:05

В данном случае ошибка возникает из за недостатка памяти выделяемой системой на редрав (вроде 2Мб). И по поводу выше сказаного - оказывается CreateCompatibleBitmap не работает с картинами больше 1000 пикселей по высоте !!!!???? Спасибо.

BOO
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 126
Зарегистрирован: 06.09.2003 (Сб) 14:23
Откуда: Саратовская обл. г.Энгельс

все хорошо

Сообщение BOO » 10.02.2004 (Вт) 22:43

Все это конечно хорошо, но я в своё время :lol: поднимал эту тему, мало того она даже называется также :twisted:
К стате Генадий из кокого ты города???
Слушайте рок!

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 10.02.2004 (Вт) 23:19

Я думаю что тебе нужно сначала определится с основными этапами вывода изображения.
Для твоих задач я выбрал такой путь:
1. Создание буферного растра в памяти. Размеры постоянные, то есть потом новый растр не создается.
2. Прорисовка в нем изображения с помощью API-функций графического вывода.
3. Вывод изображения на форму или граф. поле - используется BitBlt или StretchBlt, если нужно менять масштаб.
4. Удаление всех вспомогательных объектов, когда надобность в них отпадает.
Если такой алгоритм тебе подойдет, и ты не будешь знать как реализовать конкретный этап напиши где возникат проблемы, я попробую конкретный пример привести.

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 11.02.2004 (Ср) 10:40

Видимо спешил поэтому тему эту на форуме не нашел. :oops:

Рисовать на буферном растре думаю то, что надо! Сергей, если есть готовый код, выложи пожалуйста. Кстати буферный растр не имеет ли ограничений в размере?

Всем спасибо! :D

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 11.02.2004 (Ср) 19:15

Создание растра в памяти
hbmBuffer& = CreateCompatibleBitmap(picSource.hdc, YourW&, YourH&)
hdcBuffer& = CreateCompatibleDC(picSource.hdc)
hbmBufferOld& = SelectObject(hbmBuffer& , hbmBuffer&)
Насчет ограничений в размере - не знаю, никогда не сталкивался.
Прорисовка
В hdcBuffer& ты рисуешь, все что тебе нужно.
Вывод на экран.
используется BitBlt или StretchBlt
StretchBlt работает также как и BitBlt, только ты указываешь размеры и исходного и прорисовываемого.
Если хочешь улучишить качество при StretchBlt можно задать параметр сжатия
SetStretchBltMode hdcBuffer& , 4
но это приведет к замедлению прорисовки.
Удаление объектов.
Если ты используешь кисти, регионы и тп. удаляешь манипуляторы объектов функцией DeleteObject
Растр в памяти удаляется так
SelectObject hbmBufferOld& , hbmBuffer&
DeleteObject hbmBuffer&
DeleteDC hdcBuffer&

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 11.02.2004 (Ср) 19:18

В одной строчке ошибочка вышла
hbmBufferOld& = SelectObject(hdcBuffer& , hbmBuffer&)

Gena
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 05.02.2004 (Чт) 9:20
Откуда: Кременчуг

Сообщение Gena » 12.02.2004 (Чт) 9:02

Спасибо за пример! :D :D :D

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 23.03.2005 (Ср) 5:40

Подскажите как при повороте картинки на n градусов, улучшить качество картинки (как при растяжении с SetStretchBltMode hdc,halftone)
заранее шпасибо


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

    TopList