Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Изменение диалога в рантайме


Автор: CaptainFlint 13.10.2003, 19:54
Суть вот в чем. У меня есть программа, в ней - диалог "Настройки" с несколькими вкладками. На одной из них - выбор языка. При нажатии кнопки "Применить" должен меняться язык программы, но диалог не закрывается. Как сделать, чтобы язык диалога тоже менялся? Язык собственно меняю с помощью AfxSetResourceHandle(LoadLibrary(...)), но перечитать ресурс этого диалога "на лету" оттуда не удается... Если закрыть и снова открыть диалог, то да, он становится на нужном языке, но тогда нельзя будет отменить действия, пропадает весь смысл кнопки "Применить".

Автор: RAN 13.10.2003, 21:18
UpdateWindow не катит?

Автор: mr.DUDA 13.10.2003, 23:04
попробуй послать WM_INITDIALOG

Автор: CaptainFlint 14.10.2003, 14:06
UpdateWindow() ничего не делает.
Если посылаю WM_INITDIALOG себе (CPropertyPage), то ничего не происходит, только заново выполняется код OnInitDialog(), а там пересчитывания с ресурса нету. Если же шлю его базовому диалогу (CPropertySheet), то программа падает.

Автор: Step 14.10.2003, 14:17
сделай функцию для замены надписей....

Автор: Step 14.10.2003, 14:18
т.е. в тупую

Автор: CaptainFlint 14.10.2003, 14:21
Step
Втупую нельзя: вдруг надписи не поместятся в отведенное место? Да и кроме того придется дублировать весь ресурс диалога в строковые ресурсы, а это нехорошо...

Автор: Ars 15.10.2003, 15:42
Цитата
Если закрыть и снова открыть диалог, то да, он становится на нужном языке, но тогда нельзя будет отменить действия, пропадает весь смысл кнопки "Применить".

А по-моему, так и нужно делать и смысл кнопки "Применить" именно в возможности сохранить изменения без закрытия диалога. Это в какой программе можно отменить то, что было применено?! wink.gif

Автор: CaptainFlint 15.10.2003, 15:52
Ars
Цитата
Это в какой программе можно отменить то, что было применено?!

Ну я же говорю, что не согласен в этом вопросе с мелкомягкими smile.gif Это же с их подачи такая трактовка сейчас идет... Ну поставил я арабский язык случайно, нажал "Применить", и все. Ладно, если, как у меня, названия языков в списке меняться не будут. А если будут? Или если долго выбирал, подбирал себе хорошие настройки, а потом решил поэкспериментировать. Нажал "применить" - и хана, все настройки хорошие забылись. Так что ли? Не-ет, я так не согласен. Но вопрос не о том, как надо реализовать концепцию настроек, а немножко про другое ;) Так что это оффтоп...
А если не оффтопить, то появилась у меня одна идейка: создать новый диалог (с новым языком), и все контролы перебрать и установить их параметры на новые. Т.е. по сути заставить прогу считать ресурс диалога и данные из уже считанного перекачать в существующий. Пока это на стадии поиска возможности перебрать все контролы без явного указания их идентификаторов, т.е. в цикле. Иначе какой-нить новый контрол добавлю - и код смены языка апдейтить...

Автор: Ars 15.10.2003, 16:28
Цитата
Ну я же говорю, что не согласен в этом вопросе с мелкомягкими  Это же с их подачи такая трактовка сейчас идет... Ну поставил я арабский язык случайно, нажал "Применить", и все. Ладно, если, как у меня, названия языков в списке меняться не будут. А если будут? Или если долго выбирал, подбирал себе хорошие настройки, а потом решил поэкспериментировать. Нажал "применить" - и хана, все настройки хорошие забылись. Так что ли? Не-ет, я так не согласен. Но вопрос не о том, как надо реализовать концепцию настроек, а немножко про другое ;) Так что это оффтоп...

Все это философия и я готов пофилософствовать, но краткое резюме такое: отойти от стандарта - нажить геморрой

Цитата
это на стадии поиска возможности перебрать все контролы без явного указания их идентификаторов, т.е. в цикле

Можно применить функцию EnumChildWindows, а контролы различать по Tabstop'у, ID или еще чему нибудь

Автор: Step 15.10.2003, 16:46
если я правильно понял то по пременить может вообще изменить структура диалога, и количесто элементов и расположения и вообще все, тоесть полностью другой ресурс, а не только язык ресурса. ТАК ИЛИ НЕТ

Автор: CaptainFlint 15.10.2003, 17:01
Ars
Надо же, я как раз набрел на функцию EnumChildWindows smile.gif Буду пробовать. А различать по ID можно. Я так понимаю, ID - это и есть идентификатор контрола в данном случае.
Step
Ты правильно понял, такое можно было бы сделать по моей первоначальной идее. Да, это нехорошо, не спорю, да, могут быть ошибки. Но зато как легко было бы реализовать smile.gif По новой же идее все будет ок, ни новые не добавятся, ни старые не исчезнут. Будет меняться только текст, размер и положение контрола (может, чего упустил, но это неважно).

Автор: Step 15.10.2003, 17:06
А ты непробывал делать длл с диалогам и разными ресурсами, а твоя основаня прога просто переключает длл

Автор: CaptainFlint 15.10.2003, 19:43
Step
Я именно так и делаю (см. мой самый первый пост). Но переключить таким способом собственно диалог, в котором я выбираю язык, без его закрытия у меня не получается. Об этом и был первоначальный вопрос: как это сделать.

Автор: Step 16.10.2003, 09:01
Константин, шаблон диалога устанавливается в функции креате класса диалог, и вот ее надо перегрузить....

Автор: DENNN 17.10.2003, 17:45
http://www.codeproject.com/cpp/mult_lang_support.asp

Автор: CaptainFlint 20.10.2003, 11:16
Step
Create вызывается только при создании, а мне надо переделать уже созданный диалог.
В общем, я решил эту проблему, именно так, как говорил - EnumChildWindows, в качесте lParam передаю новый объект диалога, а внутри EnumChildProc вытаскиваю из нового диалога контрол с тем же ID, что и текущий контрол, и меняю текст и расположение текущего контрола на новые значения. Уже реализовал, все работает. Всем спасибо за идеи и советы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)