Forum.iFiction.Ru

iFiction.Ru · ifHub · FAQ · IFWiki · QSP · URQ · INSTEAD · AXMA

форум об interactive fiction, текстовых приключенческих играх и всём таком...

Вы не зашли.

0    0    #1
07.04.2008 20:42

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Знатокам WinAPI, help!

Проблема с вызовом стандартых диалогов:
При первом вызове GetOpenFileName() диалог Open прячется ПОД консольное окно программы, несмотря на то что в MSDNе обещано показавать стандартные диалоги поверх всех окон, как и положено модальным окнам.
Второй и все последующие вызовы GetOpenFileName() отрабатывают правильно и отображают диалог поверх основного окна программы.

Вопрос: как это лечить? smile

P.S. я и сам конечно еще покапаю, но вдруг есть тут Знатоки? Не может не быть...

Неактивен

0    0    #2
07.04.2008 22:12

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Код:

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)

Неактивен

0    0    #3
08.04.2008 07:34

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Nex написал:

ShowWindow(WindowH,SW_HIDE);
прямо перед вызовом диалога. Зачем? Закомментируй HIDE и RESTORE.

угу, это просто неуклюжая попытка исправить вышеописанный баг.
без HIDE и RESTORE работает именно так как я описал. sad

Неактивен

0    0    #4
08.04.2008 11:54

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

fireton написал:

попробуй

Код:

ofn.hwndOwner = NULL

уже пробовал, не помогает sad

Неактивен

0    0    #5
08.04.2008 15:24

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

2Nex нет, не помогло sad

Неактивен

0    0    #6
08.04.2008 15:56

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

К сожалению закрыть модальный диалог из того-же процесса нельзя, его должен закрыть юзер.
Можно при старте выводить какое-либо сообщение через MessageBox() с флагом MB_SYSTEMMODAL. После этого все диалоги открываются правильно. Кстати MessageBox() без MB_SYSTEMMODAL также первый раз прячется под окно...
Вот только для юзера это лишний бессмысленный клик при каждом открытии программы...
Вот если бы в GetOpenFileName() можно было бы подсунуть MB_SYSTEMMODAL, да некуда sad

Неактивен

0    0    #7
08.04.2008 16:59

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Korwin написал:

Кстати, как будет называться платформа? RusBear? или "Mышка"?

А вот с названием все тяжко smile постараюсь определиться к бете.
А может быть конкурс провести на название для русской ИЛ-платформы?? smilesmilesmile

Неактивен

0    0    #8
09.04.2008 08:55

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Nex написал:

Предлагаю "Велосипед 1.0"

До 1.0 еще ой как далеко smile
А по багу никаких мыслей больше нет?

Неактивен

0    0    #9
11.04.2008 15:18

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Korwin написал:

Кстати, как будет называться платформа? RusBear? или "Mышка"?

Text Quest Engine прижилось как рабочее название. smile
TQE в сокращении.

Неактивен

0    0    #10
11.04.2008 18:40

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Text Adventure Russian System тогда может быть? (TARS)
А к русским названиям софта существует устоявшееся негативное отношение.
Да и неудобно это - расширения и имена файлов должны вытекать из названия системы, а делать их русскими у меня рука никогда не подвернется.
А так:
tars_con.exe - консольный проигрыватель
tars.dll - двигатель
xxx.trs - файлы игр

Неактивен

0    0    #11
11.04.2008 19:01

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Тогда пусть будет просто РА!
Язык Ра,
файлы:
ra_con.exe
ra.dll
xxx.ra

p.s. РКД очень на РКПб смахивает...

Неактивен

0    0    #12
11.04.2008 22:04

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Nex lollollol

Неактивен

0    0    #13
12.04.2008 10:23

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Korwin написал:

Как там проблема, решена?

Временно добавил сообщение при старте, но это нельзя считать хорошим решением, нужно копать в глубь...
Проблема, как мне кажется, где-то в атрибутах консольного окна.

И еще один вопрос из той-же области: переключение раскладки на русский язык при старте.
LoadKeyboardLayout("00000419",KLF_ACTIVATE); для консольного окна почему-то не работает...

Неактивен

0    0    #14
12.04.2008 19:53

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

fireton написал:

СИстема Реализации Интерактивного Нарратива, сокращенно СИРИН. smile
Простенько и со вкусом.

нечто подобное уже есть smile

Неактивен

0    0    #15
12.05.2008 09:30

ASBer
Модератор (+162, -20)
Откуда: Москва
Зарегистрирован: 19.07.2007
Сообщений: 816
Вебсайт

Эники-Бэники
ели вареники,
а Джоники-Мнемоники
ели психотроники.

Re: Знатокам WinAPI, help!

Привет, 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й нулевой символ поставляет компилятор smile

Отредактировано ASBer (12.05.2008 09:31)

Неактивен

Powered by PunBB
© copyright 2001–2026 iFiction.Ru