Проблема с вызовом стандартых диалогов:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы, несмотря на то что в MSDNе обещано показавать стандартные диалоги поверх всех окон, как и положено модальным окнам.
Второй и все последующие вызовы GetOpenFileName() отрабатывают правильно и отображают диалог поверх основного окна программы.
Вопрос: как это лечить? ![]()
P.S. я и сам конечно еще покапаю, но вдруг есть тут Знатоки? Не может не быть...
Неактивен
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 работает именно так как я описал. ![]()
Неактивен
fireton написал:
попробуй
Код:
ofn.hwndOwner = NULL
уже пробовал, не помогает ![]()
Неактивен
2Nex нет, не помогло ![]()
Неактивен
К сожалению закрыть модальный диалог из того-же процесса нельзя, его должен закрыть юзер.
Можно при старте выводить какое-либо сообщение через MessageBox() с флагом MB_SYSTEMMODAL. После этого все диалоги открываются правильно. Кстати MessageBox() без MB_SYSTEMMODAL также первый раз прячется под окно...
Вот только для юзера это лишний бессмысленный клик при каждом открытии программы...
Вот если бы в GetOpenFileName() можно было бы подсунуть MB_SYSTEMMODAL, да некуда ![]()
Неактивен
Korwin написал:
Кстати, как будет называться платформа? RusBear? или "Mышка"?
А вот с названием все тяжко
постараюсь определиться к бете.
А может быть конкурс провести на название для русской ИЛ-платформы?? ![]()
![]()
![]()
Неактивен
Nex написал:
Предлагаю "Велосипед 1.0"
До 1.0 еще ой как далеко ![]()
А по багу никаких мыслей больше нет?
Неактивен
Korwin написал:
Кстати, как будет называться платформа? RusBear? или "Mышка"?
Text Quest Engine прижилось как рабочее название. ![]()
TQE в сокращении.
Неактивен
Text Adventure Russian System тогда может быть? (TARS)
А к русским названиям софта существует устоявшееся негативное отношение.
Да и неудобно это - расширения и имена файлов должны вытекать из названия системы, а делать их русскими у меня рука никогда не подвернется.
А так:
tars_con.exe - консольный проигрыватель
tars.dll - двигатель
xxx.trs - файлы игр
Неактивен
Тогда пусть будет просто РА!
Язык Ра,
файлы:
ra_con.exe
ra.dll
xxx.ra
p.s. РКД очень на РКПб смахивает...
Неактивен
Nex ![]()
![]()
![]()
Неактивен
Korwin написал:
Как там проблема, решена?
Временно добавил сообщение при старте, но это нельзя считать хорошим решением, нужно копать в глубь...
Проблема, как мне кажется, где-то в атрибутах консольного окна.
И еще один вопрос из той-же области: переключение раскладки на русский язык при старте.
LoadKeyboardLayout("00000419",KLF_ACTIVATE); для консольного окна почему-то не работает...
Неактивен
fireton написал:
СИстема Реализации Интерактивного Нарратива, сокращенно СИРИН.
Простенько и со вкусом.
Неактивен
Привет, 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)
Неактивен