Как мне выполнить мою собственную перерисовку в событии Paint на VB6 PictureBox? - PullRequest
1 голос
/ 31 января 2009

Сотрудник сталкивается с ошибкой при попытке запустить приложение VB6, над которым мы работаем. Ошибка: «480: Невозможно создать изображение AutoRedraw». В документации Microsoft говорится, что это происходит потому, что «Недостаточно свободной памяти для свойства AutoRedraw, чтобы установить значение True. Установите для свойства AutoRedraw значение False и выполните собственное перерисовывание в процедуре события Paint или уменьшите элемент управления PictureBox или объект Form. .. "

Уменьшение PictureBox меньше не вариант. Я был бы рад "... выполнить мою собственную перерисовку в процедуре события Paint ...", но я не уверен, как это сделать. Может кто-нибудь показать мне путь?

Ответы [ 4 ]

1 голос
/ 06 февраля 2009

Если вы не возражаете переписать свой графический код для использования GDI API - это может быть довольно большой задачей - я нашел этот поток из 2006 в группе обсуждения VB6, где Майк Саттон сказал в ответ на похожую проблему:

В реализации обратного буфера VB используется Зависящее от устройства растровое изображение (DDB) для хранения данные изображения, которые довольно ограничены насколько большой это может быть сделано. На старших OS 'это раньше было ~ 16мб несжатого размер данных, на более поздних ОС это было расширен, но все еще довольно ограничительный.

Обходной путь для этого заключается в использовании Независимое от устройства растровое изображение (DIB) и управлять ресурсами GDI самостоятельно, взгляните на статью DIB на моем сайт для примера того, как работать с ними.

Я сам не пробовал.

1 голос
/ 04 февраля 2009

Уменьшение PictureBox меньше не вариант. Я был бы рад "... выполнить мою собственную перерисовку в процедуре события Paint ...", но я не уверен, как это сделать. Может кто-нибудь показать мне путь?

Это легко. Вы просто реализуете _Paint () - Event вашей формы или PictureBox и рисуете.

Поскольку вы спрашиваете, я думаю, я должен уточнить, что делает AutoRedraw-Propeprty. Если для него установлено значение true, вы можете «просто нарисовать изображение» любым удобным для вас способом. В несколько шагов. Без разницы. Если его нужно перерисовать, например, потому что поверх него были другие окна, это будет сделано волшебным образом. Это медленный сайт для рисовальной части.

Если AutoRedraw имеет значение false, никакой магии не произойдет. Событие Paint () - будет запущено, и вы несете ответственность за повторное изображение. Это будет намного быстрее, если ваше окно не будет «недействительным» (например, «закрыто») часто. Или вы много рисуете.

Или вам не хватает памяти для "магического пространства"; -)

1 голос
/ 02 февраля 2009

Без подробностей это будет упрощенный ответ. В целом, большинство начинающих программистов на VB6 используют AutoRedraw = True draw в ответ на некоторый ввод. Заполните некоторые данные, нажмите «Рисовать», и они появятся в графическом окне.

Событие щелчка в кнопке рисования связано с вашим кодом рисования. Первый шаг - переместить вызов в код рисования в событие рисования изображения. Второй шаг - заменить все вызовы кода рисования на MyPictureBox.Refresh. Обновить заставляет событие рисования этой графической коробки сработать.

Основная проблема, с которой вам придется столкнуться, заключается в том, что событие рисования будет запускаться при каждом обновлении формы. Как если бы окно было закрыто. Это означает, что любая проблема со скоростью в вашем коде чертежа будет выявлена. AutoRedraw = True берет то, что вы нарисовали, и вставляет скрытое растровое изображение, которое PictureBox использует для отображения того, что вы нарисовали.

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

0 голосов
/ 04 февраля 2009

В окне кода формы обычно есть выпадающий список событий для вашего контроля. Вам нужно выбрать событие рисования:

Private Sub object_Paint()

и введите свой код для рисования в PictureBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...