Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TaskDialogIndirect на RTL системе 
:(
    Опции темы
0xDEAD
Дата 13.9.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Добрый день, 

Я создаю Task Dialog с английским текстом с помощью функции TaskDialogIndirect. На системах RTL (Арабский, Иврит, ...) диалог создается перевернутый. Как мне его перевернуть назад? Есть флаг TDF_RTL_LAYOUT, но мне как раз надо обратное, типа TDF_LTR_LAYOUT, чего увы нету.
PM MAIL   Вверх
GremlinProg
Дата 13.9.2012, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



у нас подразумевается, что LTR - опция по-умолчанию,
возможно в арабском варианте по-умолчанию RTL, т.е. чтобы включить LTR и следует просто включить TDF_RTL_LAYOUT


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
0xDEAD
Дата 13.9.2012, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Цитата(GremlinProg @  13.9.2012,  12:44 Найти цитируемый пост)
в арабском варианте по-умолчанию RTL

Да.

Цитата(GremlinProg @  13.9.2012,  12:44 Найти цитируемый пост)
чтобы включить LTR и следует просто включить TDF_RTL_LAYOUT

Нет.

В этом то и вся проблема...
PM MAIL   Вверх
GremlinProg
Дата 13.9.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(0xDEAD @  13.9.2012,  16:00 Найти цитируемый пост)
В этом то и вся проблема...

а если вручную выставить WS_EX_LAYOUTRTL?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
0xDEAD
Дата 15.9.2012, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Не помогает...
PM MAIL   Вверх
feodorv
Дата 15.9.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Интересная ситуация)))


Цитата(0xDEAD @  15.9.2012,  13:14 Найти цитируемый пост)
Не помогает...

То есть 
Код

SetWindowLong (hWnd, GWL_EXSTYLE, GetWindowLong(hWnd,GWL_EXSTYLE) ^ WS_EX_LAYOUTRTL))

не помогает? А какие стили у диалога?


Можно ещё попробовать поиграться с SetProcessDefaultLayout перед созданием диалога (как с 0 в качестве аргумента, так и с LAYOUT_RTL). И, пожалуйста, скажите, что возвращает GetProcessDefaultLayout...

Добавлено через 12 минут и 40 секунд
Здесь так написано:
Цитата

After a window has been created, change the layout using the SetWindowLong function. For example, this is necessary when the user changes the user interface language of an existing window from Arabic or Hebrew to German. However, when changing the layout of an existing window, you must invalidate and update the window to ensure that the contents of the window are all drawn on the same layout. The following code sample changes the window layout as needed:

lExStyles = GetWindowLong(hWnd, GWL_EXSTYLE);

// Check whether new layout is opposite the current layout
if (!(pLState -> IsRTLLayout) != !(lExStyles & WS_EX_LAYOUTRTL))
{
    // the following lines will update the window layout

    lExStyles ^= WS_EX_LAYOUTRTL;        // toggle layout
    SetWindowLong(hWnd, GWL_EXSTYLE, lExStyles);
    InvalidateRect(hWnd, NULL, TRUE);    // to update layout in the client area
}



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
0xDEAD
Дата 16.9.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: 3
Всего: 3



Цитата(feodorv @  15.9.2012,  22:40 Найти цитируемый пост)
А какие стили у диалога?

WS_EX_LAYOUTRTL есть у окна и у детей. Причем даже если у всех детей убрать WS_EX_LAYOUTRTL, синий заголовок и иконка все равно остаются перевернуты.


Цитата(feodorv @  15.9.2012,  22:40 Найти цитируемый пост)
И, пожалуйста, скажите, что возвращает GetProcessDefaultLayout...

Ноль.


...
Посмотрел дебагером, как у них там система работает.
Код примерно такой:

Код

if(dwFlags & FLAG_RTL)
    MakeRtl();

blabla = GetUserDefaultUILanguage();
GetLocaleInfo(blabla, ..., &bUserDefaultUIRtl);
if(bUserDefaultUIRtl)
    MakeRtl();


Другими словами, если GetUserDefaultUILanguage - это язык RTL, диалог будет RTL, и никакой флаг тут не поможет...
Единственное решение, о котором я могу подумать, это хукать GetUserDefaultUILanguage, но это по моему уже перебор...
Эх, криворукие кодеры...
PM MAIL   Вверх
feodorv
Дата 16.9.2012, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Мдя... smile 
Могу предложить ещё попробовать SetThreadUILanguage smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.