| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Direct3D в диалоге |
| Автор: toxx 16.12.2009, 23:06 | ||
| Решил сделать интересное диалоговое меню "О программе" с использованием directX, всё выводит при нажатии клавиши, всё красиво, только выйти из него нельзя.Подскажите пожалуйста как можно выйти из просмотра?Окно не двигается, при попытке закрыть не закрывается, а выход из всей программы только с помощью ctrl+alt+del Код окна диалога Само окно сделано через ресурс файл.
|
| Автор: Alca 16.12.2009, 23:31 | ||
Добавлено через 2 минуты http://msdn.microsoft.com/en-us/library/aa383690(VS.85).aspx |
| Автор: smoke_man 16.12.2009, 23:37 | ||
Здесь:
у тебя начинается бесконечный цикл. |
| Автор: toxx 17.12.2009, 13:40 | ||||
Да я понимаю что так нужно, только у меня нет кнопки когда идёт RenderingDirect3D(); и при попытке нажать на завершение( на крестик) всё виснет вот скрин http://www.valar.ru/upload/jpg/1209/1261046358_.htm ![]()
Да я знаю, чтобы RenderingDirect3D(); нужно чтоб был цикл, а вот как из него выйти я никак не пойму. Потомучто если без цикла, то попросту один раз вызовется и исчезнет directX. А мне нужно чтобы по требованию пользователя прекратилось проигрывание сцены.Но не могу найти условие для выхода.Что и прошу я, посоветовать как выйти из этого положения |
| Автор: mekhanikus 17.12.2009, 13:50 |
| А если в условие цикла поставить глобальную переменную. Пока она ture цикл крутится. В case IDOK: делать переменную FALSE - цикл заканчивается. |
| Автор: toxx 17.12.2009, 16:48 | ||||||
Нет, так не получится.Потомучто изображение занимает всё окно и кнопки ОК попросту не видно) Другое дело может быть сделать чтобы изображение было не во всё окно,и чтобы было видно кнопку ОК Тогда дело наверно вот в этой функции
Попробовал изменять настройки
Это ни к чему не привело.Подскажите пожалуйста, как правильно сделать, очень интресно исполнение это в winamp там сделаны кнопки сверху а понизу расположено окно где показывает( не знаю как это сделать). |
| Автор: Alca 17.12.2009, 16:53 | ||
Добавлено через 1 минуту и 22 секунды Надо нажать на "Х" |
| Автор: toxx 17.12.2009, 17:02 | ||
Нет, не помогает я пробовал так...Также при нажатии на Х появляется завершить задачу. |
| Автор: toxx 17.12.2009, 18:14 | ||||||||
Скорее это название более подходит, когда создавал тему думал, что перенесете в соответствующий раздел это. Проблема просто в wipapi )
Я выбрал вот такой способ реализации(через контрол, но дела с ними еще не имел только CTEXT,ICON,DEFPUSHBUTTON) в общих чертах прочитал вот http://dims.karelia.ru/win32/(но не нашел как это вызвать в прграмме) Вот это не совсем подходит
Как я понимаю вы мне предлагаете сделать вот это?
Но у меня тогда возникает вопрос: Откуда взять хэндл или ID_ чтобы направить туда мой Direct3D? |
| Автор: toxx 17.12.2009, 19:16 | ||
| Попробовал вот так,по 2му способу предложенному правда опять неудачно(окно просто зависает). Окно статика не перекрывает кнопки, но при нажатии воспроизвести DX3D оно виснет, не сделав ничего.
http://img.pixs.ru/storage/8/9/8/ttjpg_2904809_383898.jpg |
| Автор: GremlinProg 17.12.2009, 19:24 | ||||||||
не понял, зачем это?
да, это ID этого контрола ID_DRAW, а дескриптор можно получить, вызвав GetDlgItem с этим ID'ом |
| Автор: toxx 17.12.2009, 20:09 | ||||
| Всё сделал, все показывает, только опять виснет, кнопки видны,но они также виснут. Всё вродебы правильно, только не понимаю почему всё окно виснет, когда только в статике показывает...
Скрин http://pixs.ru/showimage/1234jpg_4780951_383979.jpg |
| Автор: xvr 17.12.2009, 20:35 | ||
Вам уже писали - пока крутится это
Нужно добавить в цикл связку PeekMessage/IsDialogMessage/TranslateMessage/DispatchMessage. Кроме того, надо взводить флаг когда пользователь захотел закончить диалог (нажал esc, попробовал закрыть диалог или еще как), и проверять его в цикле. При взведенном флаге - завершать цикл |
| Автор: toxx 17.12.2009, 22:07 | ||||||
Вы имели ввиду чтото на подобии этого?
Блин чтото не так опять, опять пол дня убил на непонятно что |
| Автор: xvr 17.12.2009, 22:20 | ||||
|
| Автор: toxx 17.12.2009, 23:08 | ||||||||
АААААА сделал чето
Это чето ест 1гб оперативной памяти и причем её потребление растет с каждой секундой...что делать не понятно... Хотя работает как надо |
| Автор: TGrey 17.12.2009, 23:38 |
| А ему обязательно инициализировать буферы в цикле? Возможно оно и есть память? Один раз инициализировать перед циклом, а потом выводить. |
| Автор: toxx 17.12.2009, 23:47 | ||
Да это и есть весь этот 1 гб) Только если это всё убирать из цикла, то ничего не работает(хотя программа в любом случае не работает). Я уже разные комбинации перепробовал все впустую Короче я уже не знаю чего делать с этой проблемой, сижу с 5 часов в компиляторе уже,не в радость это всё уже |
| Автор: xvr 18.12.2009, 10:09 | ||
Попробуй так:
|
| Автор: toxx 18.12.2009, 11:29 | ||
Щас возможности откомпилировать нет, но думаю не прокатит т.к. в диалоге iMsg//UINT а получается обрабатывает сообщения msg//MSG Мб я не прав, приду сделаю=) |
| Автор: xvr 18.12.2009, 17:35 | ||
Прокатит - IsDialogMessage и DispatchMessage преобразую что надо куда надо |
| Автор: toxx 18.12.2009, 18:08 | ||||||||
Хммм спасибо большое, на деле всё просто. Только меня ввело в заблуждение то, что я думал что
Действует только в WinMain, вот в этом и все проблемы. Спасибо еще раз, надолкнули на правильный путь. Блин а память все так и жрёт....1гб стабильно( Это ###
В свете этого поедания памяти проверил и пример c DX там тоже жрёт память пока работает 1гб++ и увеличивается, что за фигня не понятно, неужели кто писал книгу совсем?)Или я где тупанул... |
| Автор: toxx 18.12.2009, 19:05 |
| На всякий случай проверил код функций, всё как в книге( |
| Автор: xvr 18.12.2009, 19:42 | ||
Видимо проблема в RenderingDirect3D. Можно на ее код глянуть? |
| Автор: toxx 18.12.2009, 19:51 | ||||||
Да конечно, я сам сижу её проверяю, пока ничего криминального и паралельно сравниваю с туториалами и ищу ошибки.
|
| Автор: xvr 18.12.2009, 19:57 |
| Тоже ничего криминального не вижу. А как насчет функций LightMaterial, Matrix и DrawMyText? |
| Автор: toxx 18.12.2009, 20:00 | ||||
Тоже смотрю... ничего тоже пока не нашел. Вот они
|
| Автор: xvr 19.12.2009, 11:55 |
| Есть подозрение (все в функции DrawMyText) 1) Зачем там строка hFont=CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH|FF_MODERN,"Arial");? hFont более нигде не используется (и не удаляется!) 2) D3D фонт, созданный через D3DXCreateFont не удаляется (надо позвать pFont->Release() перед выходом, или использовать smart указатель для pFont). Кстати, создавать и удалять фонт на каждом кадре мне кажется несколько расточительным - почему бы его не создать в начале и не удалить в самом конце (один раз)? И последнее - если не поможет рекомендую задать этот вопрос http://forum.vingrad.ru/forum/c-c++multimedia-OpenGL-DirectX.html |
| Автор: toxx 19.12.2009, 13:21 | ||
Да я тоже сегодня методом исключения функций из цикла добился тогоже результата, что и вы посмотрев функции. Вычислил что эта функция непомерно ест память...Только вот проблема, пример в книге был нерабочий. D3DXCreateFont устарела(в книге где она использовалась принималось 3 параметра, а в версии DX9 SDK march 2009 она уже принимает 6 параметров, как ей пользоваться я так и не нашел в интернете...Но понял что DirectX развивается не по дням , а по часам...)) Спасибо, что посмотрели код.Теперь я практически завершил свой калькулятор.Осталось текст добавить только в DX и будет готово. |