С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149

Automation Error при сворачивании окна с DirectDraw

11.09.2011, 14:50. Показов 1680. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Люди, помогите избавится от ошибки. Использую DirectDraw, все работает, но только лишь я сворачиваю окно, так сразу выскакивает Automation Error. Пытаюсь не прорисовывать, когда WindowState=Minimized, но ошибка появляется в любом случае, когда я разворачиваю окно обратно.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2011, 14:50
Ответы с готовыми решениями:

При создании дистрибутива приложения (написанного на VB) возникает ошибка: - Unexpected error number 80010108 has occurred : Automation error.
Уважаемые эксперты VB-ка , помогите разрешить следующую проблему: При создании дистрибутива приложения (написанного на VB) возникает...

Runtime Error 5 при вызове BltFast (DirectDraw)
Добрый день. Выдает ошибку "Invalid procedure call or argument" на строке ddsBack.BltFast CartToIsoX(dx, dy, W), CartToIsoY(dx, dy, H),...

[WPF] Зависает при сворачивании окна
Здравствуйте, странная ситуация, даже не знаю куда копать. Есть wpf форма с datagrid в таблицу которого выводится информация с 500...

8
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
12.09.2011, 19:23
Я не уверен, но мне кажется, что после разворачивания окна надо перегрузить Primary Surface, т.е. создать его заново.
Может и не прав, давно дело было.

И еще, сколько потоков у тебя в программе ? Если их несколько, которые параллельно готовят картинку к прорисовке, то скорее всего проблема в синхронизации. Т.е. основной поток может определить или окно свернуто/развернуто, а вот побочные об этом ничего не знают и продолжают работу (у меня такое было), в этом случае 100% будет ошибка.
0
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149
14.09.2011, 20:51  [ТС]
Незнаю. Дописал такой код:
Visual Basic
1
2
3
4
5
6
7
8
Private Sub Form_Resize()
If frmCBForm.WindowState = 1 Then
    ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
    ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
    ddsd.lBackBufferCount = 1
    Set ddsPrimary = dd.CreateSurface(ddsd)
End If
End Sub
Да и еще если WindowState=1 у меня не прорисовывается, но в любом случае ошибка.
0
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149
17.09.2011, 11:17  [ТС]
Вроде немного разобрался. Когда окно разворачивается, я пересоздаю объект DirectDraw, Primary и Back поверхности. Да. Ошибку уже не выдает, но у меня теперь черный экран.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
17.09.2011, 11:50
А каким образом ты рисуешь на back поверхности и сколько их у тебя?
Поскольку ты создаешь back заново, то тебе надо подготовить его заново (перерисовать заново).
0
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149
17.09.2011, 12:16  [ТС]
У меня есть специальная процедура, которая рисует на заднюю поверхность, с поверхностей, на которых хранятся изображения.
DDS1 as DirectDrawSurface7
А с нее уже в процедуре рисования, перерисовывается на задний буффе, а снего уже делается Flip на передний.
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
17.09.2011, 12:27
Проверь, что у тебя с этими поверхностями, на которых ты хранишь изображения, очень может быть, что после создания новых передней и задней поверхности на них не остается изображений.
(Я не спец по DirectDraw, поэтому мои советы только предположения.)
Проверь каким образом ты создаешь эти дополнительные поверхности и каким образом они связаны с передними, может надо делать Detach(Attach) пред удалением primary и созданием его заново ?
0
3 / 3 / 0
Регистрация: 02.01.2011
Сообщений: 149
17.09.2011, 12:59  [ТС]
Поверхности на которых я храню изображения объявляю так:
Visual Basic
1
Dim DDS1 as DirectDrawSurface7
Картинку туда загружаю следующим образом:
Visual Basic
1
Set DDS1=mdlDirectDraw7.CreateDDSFromFile (filename,...)
Модуль взят из учений Antiloop'a (http://www.vbdx.chat.ru/)
А прорисовываю я из них методом BltFast (0,0,DDS1,RECT,DDBLTFAST_SRCCOLORKEY Or DDBLTFAST_WAIT)
Вроде все как должно быть. Оно все прекрасно работает до тех пор, пока я не сверну окно.
У меня такие подозрения что он очищает эти поверхности при пересоздании DX. Но как этого избежать, т.к. подгружать все заново при каждом разворачивании окна - очень долго. Да самое что удивительное, что эти поверхности никак не связаны с Primary и Back.
Деактивацию DX, я провожу тоже по учениям Antiloop
Visual Basic
1
2
3
4
5
6
7
8
9
Public Sub DestroyDD()
 
    Call dd.RestoreDisplayMode
    Call dd.SetCooperativeLevel(0, DDSCL_NORMAL)
    
    Set ddsBack = Nothing
    Set ddsPrimary = Nothing
    Set dd = Nothing
End Sub
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
17.09.2011, 13:59
Цитата из Antiloop:
Потеря поверхностей
По многим причинам память, отведенная объектам DirectDrawSurface может быть освобождена без участия программы. Это может происходить, если изменился режим экрана, или другое приложение получило эксклюзивный доступ к видеокарте и очистило всю память, выделенную предыдущим приложениям.
Такая непредусмотренная очистка памяти называется потерей поверхности. Когда происходит потеря поверхности, многие методы заместо работы выдают код ошибки DDERR_SURFACELOST.
Метод IDirectDrawSurface7::Restore (DirectDrawSurface7.Restore) может пересоздать эти потерянные поверхности повторно соединяет их с объектом DirectDraw. При восстановлении поверхности не происходит перезагрузка графических изображений, так что, если вы потеряли поверхность, а затем восстановили ее, вы должны перезагрузить всю графику, которая была в памяти.
Освобождение поверхностей
После того, как вы больше не нуждаетесь в поверхности, например при завершении программы, вы должны освободить память, занимаемую поверхностью с помощью метода Release.
Если вы создавали комплексную поверхность одним вызовом метода CreateSurface, например flipping chain, вы можете освободить только переднюю поверхность. После этого, вы не можете больше использовать другие компоненты цепи флиппинга - задний буфер и т. д. (Для инфо о flipping chain см. Создание поверхностей)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2011, 13:59
Помогаю со студенческими работами здесь

При сворачивании окна, пропадает графика
Привет форумчане. ;) Сразу хочу извиниться если я пишу уж слишком очевидные вещи, но у меня тут проблемка. Вот изучаю paintCompont()...

Исчезание символа при сворачивании/разворачивании окна
Как сделать так, чтобы при сворачивании-разворачивании окна, символ "b" исчезал? Символ "b" с вывода тех слов, которые...

При сворачивании окна программа перестает работать
Доброе время суток. Моя программа перестает выполнять свою работу если скрыть/свернуть окно или даже поверх формы вылезет какой-нибудь...

Текст на PictureBox стирается при сворачивании-разворачивании окна
Здравствуйте! У меня создается динамически несколько Picturebox. PictureBox vichisl = new PictureBox; private void...

Пропадает рисунок, сделанный мышкой, при сворачивании окна
как пофиксить это? вот код #include "stdafx.h" #include "Win32Project1.h" #include <windowsx.h> #include <thread> #pragma...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru