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

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

11.09.2011, 14:50. Показов 1652. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru