Проблема с вызовом стандартых диалогов:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы, несмотря на то что в MSDNе обещано показавать стандартные диалоги поверх всех окон, как и положено модальным окнам.
Второй и все последующие вызовы GetOpenFileName() отрабатывают правильно и отображают диалог поверх основного окна программы.
Вопрос: как это лечить?
P.S. я и сам конечно еще покапаю, но вдруг есть тут Знатоки? Не может не быть...
Неактивен
ASBer написал:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы...
Код, где происходит вызов, в студию. Скорее всего, в твоей программе сразу после вызова диалога устанавливается фокус на консоль.
Неактивен
HANDLE WindowH, InputH, OutputH; _CONSOLE_SCREEN_BUFFER_INFO Info; OPENFILENAME ofn; char input[1024]; char buf[1024]; ... WindowH=GetConsoleWindow(); ... ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=WindowH; ofn.lpstrFilter=NULL; ofn.lpstrFile = input; ofn.nMaxFile = sizeof(input); ofn.lpstrFilter = "Text Quest\0*.TQE\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; ... char*Str=0; input[0]=0; //ShowWindow(WindowH,SW_HIDE);//неудачная попытка обойти баг if(GetOpenFileName(&ofn)) { Restart(); Str=RunFile(input); } //ShowWindow(WindowH,SW_RESTORE);//неудачная попытка обойти баг ...
вот тут текст целиком
Фокус не устанавливаю, но даже если бы это было, все что после GetOpenFileName(&ofn) сработает после закрытия диалога.
Отредактировано ASBer (08.04.2008 08:56)
Неактивен
Nex написал:
ShowWindow(WindowH,SW_HIDE);
прямо перед вызовом диалога. Зачем? Закомментируй HIDE и RESTORE.
угу, это просто неуклюжая попытка исправить вышеописанный баг.
без HIDE и RESTORE работает именно так как я описал.
Неактивен
А, ну если это не тот самый бажный код, то убери обе строки и где-нибудь в начале программы, например, после строк
//грузим файл игры (или help)
PutStr(RunFile((argc==2)?argv[1]:"help.txt"));
напиши
ShowWindow(WindowH,SW_SHOW);
Неактивен
ASBer написал:
Проблема с вызовом стандартых диалогов:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы, несмотря на то что в MSDNе обещано показавать стандартные диалоги поверх всех окон, как и положено модальным окнам.
Второй и все последующие вызовы GetOpenFileName() отрабатывают правильно и отображают диалог поверх основного окна программы.
Вопрос: как это лечить?
P.S. я и сам конечно еще покапаю, но вдруг есть тут Знатоки? Не может не быть...
Я бы это лечить не стал, а принудительно открыл, потом закрыл окно и ждал когда его вызовут второй раз.
Отредактировано Korwin (08.04.2008 15:33)
Неактивен
К сожалению закрыть модальный диалог из того-же процесса нельзя, его должен закрыть юзер.
Можно при старте выводить какое-либо сообщение через MessageBox() с флагом MB_SYSTEMMODAL. После этого все диалоги открываются правильно. Кстати MessageBox() без MB_SYSTEMMODAL также первый раз прячется под окно...
Вот только для юзера это лишний бессмысленный клик при каждом открытии программы...
Вот если бы в GetOpenFileName() можно было бы подсунуть MB_SYSTEMMODAL, да некуда
Неактивен
НУ ВСТАВЬ ПОКА ПОМОЩЬ ПО ПРОГРАММЕ В ЭТО ОКНО СНАЧАЛА. ИЛИ НАЗВАНИЕ ПРОГРАММЫ.
Кстати, как будет называться платформа? RusBear? или "Mышка"?
Неактивен
Korwin написал:
Кстати, как будет называться платформа? RusBear? или "Mышка"?
А вот с названием все тяжко постараюсь определиться к бете.
А может быть конкурс провести на название для русской ИЛ-платформы??
Неактивен
Nex написал:
Предлагаю "Велосипед 1.0"
До 1.0 еще ой как далеко
А по багу никаких мыслей больше нет?
Неактивен
пока ещё рано самодельные парсеры велосипедами называть
в РТАДС-е хотя и можно всё, но некоторые возможности реализуются неочевидным для атора образом
взять хотя бы тот же глюк 'дай водку бомжу' = 'дай водке бомжа'
и комментарий к этому GrAnda- я понимаю, что парсер это может, но какие неочевидные вещи должен был учеть автор! не удивительно, что вышел глюк. кроме того, что именно в этом случае не надо дублировать некоторые падежи через # ещё и надо учесть нестандартную работу с бутылкой водки в связи с тем что в РТАДС не предусмотрена возможность реализовать торговлю по-нормальному. и приходится автору изхищряться.
так что- флаг в руки платформостроителям!
побольше платформ хороших и разных!
даёшь русккую платформу!
ASBeR - так держать!
Неактивен
Торговля для ИЛ нетипична. И при желании, на РТАДС реализуема. Как и многие эксцентричные вещи. Стандартная библиотека поддерживает стандартные объекты, которые широко используются. Писать библиотеку на все случаи жизни -- задаче нетривиальная и неблагодарная.
Неактивен
noname написал:
так что- флаг в руки платформостроителям!
побольше платформ хороших и разных!
даёшь русккую платформу!
По-моему, уже не раз говорили, что платформ у нас хватает. Я не возражаю, против еще одной хорошей платформы, и больше всего мне нравится в работе ASBer'a то, что он ее делал молча, героически удерживаясь от рекламы и обсуждений. Тем не менее, я резко против лозунга побольше платформ хороших и разных!! И начинающих платформостроителей мне хочется лупить трубой от крейсера, пока они не отступятся от своей задумки или не доведут ее до конца. На кладбище платформ и так хватает надгробий!
Неактивен
Торговля не так уж и редка, и трудностей больших не вызывает, если не связываться с купюрами и сдачей. Например, есть в "окопном дне".
Нестандартна торговля тем, что может обращаться не напрямую к конечным покупаемым объектам (как в случае Любви, там автор обозвал полки водкой. Кстати, Миш, попробуй набрать "купить" в магазине:) ). Однако в стандартной библиотеке есть подобный глагол - "спросить об". Также на форуме ТАДСа где-то пылится пример "создать воздушный замок". Тоже похоже.
Неактивен
По-моему, уже не раз говорили, что платформ у нас хватает.
Так говорят многие, но пока не появятся профессиональные платформы ориентированные на русский язык изначально, врятли народ перестанет создавать новые.
Korwin, а какие у нас платформы не только хорошие, но профессиональные?
Неактивен
Eten написал:
По-моему, уже не раз говорили, что платформ у нас хватает.
Так говорят многие, но пока не появятся профессиональные платформы ориентированные на русский язык изначально, врятли народ перестанет создавать новые.
Korwin, а какие у нас платформы не только хорошие, но профессиональные?
Eten, можно узнать, что ты имеешь в виду под термином "профессиональная платформа"? Если та, которой можно профессионально зарабатывать себе на жизнь, то боюсь, увы, нет таких, но не потому, что инструменты плохи... а потому что то, для чего они служат, не является профессией в наше время.
Ловчая яма была профессиональным средством охоты на мамонтов... но нет сейчас такой профессии - охотник на мамонтов, и инструмент уже - не профессиональный, хотя рыть ее можно с применением экскаваторов, С4, лазерных дальномеров, спутникового наведения и прочих технических наворотов.
Отредактировано Korwin (09.04.2008 19:16)
Неактивен
Мной проффесиональность в простом и нашем IF-ом понимании подразумевается, как минимум на уровне западных для английского языка, а это к примеру: Inform, TADS. Наши сущевствующие и популярные платформы, всего лишь улучшают некоторые стороны реализации, но при этом ущемляются другие аспекты.
К примеру в урке легко создать простой квест, но хороший и в длительности сюжета и посложности - это уже архитруд. ТКР - можно также создать квест, но из-за сокращений его трудно читать в исходнике. И так можно перечислять дальше, иначе говоря, каждый из нас делает ставку на определенные особенности и получает определенные минусы. Так, что на мой взгляд проффесиональная платформа - это та платформа, которая может совместить в себе все плюсы выше описанных и т.д. и минимизировать все минусы.
Это можно даже назвать идеалом всех платформ, т.к. все к этому стремятся. Так, вот и возникает вопрос, а есть ли действительно проффесионально (а может даже искуссно) написаные платформы с ориентацией на русский язык?
Неактивен
Попробую ответить, Eten. IMHO, любую платформу можно постепенно довести до ума, если автор ей занимается, постоянно совершенствуя и оттачивая ее возможности. В свое время Гор сказал, что платформа это сообщество, и я с этим согласен. На URQ сейчас нет разработчика, но пока они были, успел сложиться коллектив авторов и игроков. В результате, думаю, появление новых энтузиастов это вопрос времени - Милена и разработка на J2me это подтверждают. QSP практически самая профессиональная платформа из менюшек. RTADS из парсерных, потому что есть активное сообщество, которое ее развивает. TKP2 имел свое сообщество, но автор прекратил им заниматься, а исходники закрыты. RINFORM жив благодаря усилиям Всеволода Зубарева. И Денис вроде вернулся. 6дней также позволяет сделать хорошую игру и может найти еще сторонников. Так вот, для ASBer'a, начавшего тему, сейчас самое главное терпеливо делать и делать свою платформу, пока на ней не напишут игры три независимых от разработчика автора. Если это случится - платформа имеет шанс
Неактивен
Korwin написал:
Кстати, как будет называться платформа? RusBear? или "Mышка"?
Text Quest Engine прижилось как рабочее название.
TQE в сокращении.
Неактивен
Nex написал:
ASBer написал:
TQE в сокращении.
Будут путать с TGE.
Это точно. Может, учитывая, что под квестами обычно понимают менюшки, сменить название на Text Adventure Russian Engine или Text Adventure Russian Kit?
Отредактировано Korwin (11.04.2008 17:35)
Неактивен
Это точно. Может, учитывая, что под квестами обычно понимают менюшки, сменить название на Text Adventure Russian Engine или Text Adventure Russian Kit?
Вообще есть что-то глубоко символичное в том, чтобы давать Исконно Русской Платформе (тм) английское название...
Неактивен
Text Adventure Russian System тогда может быть? (TARS)
А к русским названиям софта существует устоявшееся негативное отношение.
Да и неудобно это - расширения и имена файлов должны вытекать из названия системы, а делать их русскими у меня рука никогда не подвернется.
А так:
tars_con.exe - консольный проигрыватель
tars.dll - двигатель
xxx.trs - файлы игр
Неактивен
Тогда пусть будет просто РА!
Язык Ра,
файлы:
ra_con.exe
ra.dll
xxx.ra
p.s. РКД очень на РКПб смахивает...
Неактивен
Неактивен
А без названия система будет страдать и плакать "штука без названия", "noname system" долго выговаривать и как-то несолидно.
"Как Вы яхту назовете, так она и поплывет!" - в общем, к названию следует относиться серьезно. Пока мне больше всего понравились Сирин, ТАРС и Ра. Причем без аббревиатур - просто по звучанию. Можно ведь никак не расшифровывать.
а теперь извините за начатый мною же оффтопик но мы отклонились от темы. Как там проблема, решена?
Неактивен
Korwin написал:
Как там проблема, решена?
Временно добавил сообщение при старте, но это нельзя считать хорошим решением, нужно копать в глубь...
Проблема, как мне кажется, где-то в атрибутах консольного окна.
И еще один вопрос из той-же области: переключение раскладки на русский язык при старте.
LoadKeyboardLayout("00000419",KLF_ACTIVATE); для консольного окна почему-то не работает...
Неактивен
fireton написал:
СИстема Реализации Интерактивного Нарратива, сокращенно СИРИН.
Простенько и со вкусом.
Неактивен
Сходство в названии на четыре буквы. Как у кинолога и киноактера, демиурга и демикотона. Не страшно , а зато название Сирин действительно очень русское. И имеет отношение и мифу, сказке, а значит и литературе. Впрочем, как и Ра - которое короче. Надо покопаться, может и ТАРС что-то в языке значит.
Неактивен
ASBer написал:
Проблема с вызовом стандартых диалогов:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы, несмотря на то что в MSDNе обещано показавать стандартные диалоги поверх всех окон, как и положено модальным окнам.
Второй и все последующие вызовы GetOpenFileName() отрабатывают правильно и отображают диалог поверх основного окна программы.
Вопрос: как это лечить?
P.S. я и сам конечно еще покапаю, но вдруг есть тут Знатоки? Не может не быть...
Привет, ASBer!
Проблему твою повторить не удалось - создал консольное приложение и сразу вызвал там диалог выбора файла по твоему коду. Окно диалога выскакивает поверх консольного окна! Вывод - либо ты что-то нехорошее делаешь до вызова диалога ввода окна, либо у тебя проблема с виндозой. Сделай такой же тест, по результатам будет понятно, с чем бороться - с твоим кодом или виндозой. Кстати, у тебя там ошибка - строка фильтров должна заканчиваться двумя нулевыми символами, а не одним.
ЗЫ. На звонки ты не отвечаешь, в асе тебя нет, поэтому написал сюда.
Неактивен
Привет, awa!
awa написал:
Проблему твою повторить не удалось - создал консольное приложение и сразу вызвал там диалог выбора файла по твоему коду. Окно диалога выскакивает поверх консольного окна!
Вот минимальный код, в котором проявляется ошибка:
#include <windows.h> #pragma hdrstop //--------------------------------------------------------------------------- //переменные для консоли HANDLE WindowH, InputH; _CONSOLE_SCREEN_BUFFER_INFO Info; OPENFILENAME ofn; char input[1024]; //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { //получаем дескрипторы консоли InputH =GetStdHandle(STD_INPUT_HANDLE); WindowH=GetConsoleWindow(); //инициализируем структуры для диалогов save/load ofn.lStructSize=sizeof(OPENFILENAME); ofn.hwndOwner=WindowH; ofn.lpstrFilter=NULL; ofn.lpstrFile = input; ofn.nMaxFile = sizeof(input); ofn.lpstrFilter = "Text Quest\0*.TQE\0Text\0*.TXT\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY; DWORD r; //------------------------------------------------------- if(ReadConsole(InputH,input,160,&r,NULL)) input[r]=0; else input[0]=0; input[0]=0;//обнуляем буфер if(GetOpenFileName(&ofn))//здесь диалог ПОД консолью MessageBox(WindowH,input,"Hello World!",MB_SYSTEMMODAL); //------------------------------------------------------- if(ReadConsole(InputH,input,160,&r,NULL)) input[r]=0; else input[0]=0; input[0]=0;//обнуляем буфер if(GetOpenFileName(&ofn))//здесь диалог НАД консолью MessageBox(WindowH,input,"Hello World!",MB_SYSTEMMODAL); //------------------------------------------------------- return 0; } //---------------------------------------------------------------------------
Диалог прячется под консоль только после первого вызова ReadConsole(). Если ввод с консоли не читать - все ок.
awa написал:
Кстати, у тебя там ошибка - строка фильтров должна заканчиваться двумя нулевыми символами, а не одним.
ofn.lpstrFilter = "Text Quest\0*.TQE\0Text\0*.TXT\0"; //2й нулевой символ поставляет компилятор
Отредактировано ASBer (12.05.2008 09:31)
Неактивен