zg

(no subject)

Nov 28, 2007 11:28

встала тут интересная задачка. есть гуёвое приложение. анси, в том смысле, что не unicode. приложение русское. а пускается под виндой с латышским языком для неуникодных программ. и вполне нормально пускается, 90% по русски. но часть всё же нет. а надо.

1. для начала попробовал applocale. минуса два: всплывающее окно перед стартом и полнейшая русификация, даже там, где не надо.
2. програмные методы.
2.1. SetThreadLocale: нафига оно вообще нужно, не понятно.
2.2. попытка подменить активную кодовую страницу на 1251 ни к чему не привела. идея в принципе хорошая. но как станет видно позже, трудная в правильной реализации.
2.3. а в чём же вообще дело? почему 90% текста выводятся нормально, остальные - нет? все просто. всё нормально у тех контролов, которые отрисовывает само, приложение. проблемы - у стандартных контролов, которые отрисовывает винда. отчего же так происходит? весь текст в конце концов выводится через TextOutW. но в первом случае TextOutW вызывается из TextOutA. а в TextOutA текст из ansi в unicode преобразуется: mb2wc(GetCodePage(hdc),…). для стандартных же контролов сразу вызывается TextOutW с текстом полученным по WM_SETTEXT, сконверченым по mb2wc(GetACP(),…). разница - налицо. тут же возникает вопрос, почему не сработал вариант 2.2. всё просто, все таблицы для преобразований генерятся при старте, потом реально кодовая страница не используется для преобразований. в принципе подменить таблицы можно штатно, но я до этого не дошёл :)
в принципе устраивала ситуация поменять текст у контролов. SendMessageW(…,WM_SETTEXT,…) не катит, потому как окно анси, поэтому посылаемый текст проходит через wc2mb(GetACP(),…), mb2wc(GetACP(),…) и портится безвозвратно. тот же эффект имеют: SetWindowTextW, GetWindowLongW/CallWindowProcW. решение оказалось в DefWindowProcW(…,WM_SETTEXT,…). там уже никаких конверсий не происходит. так были побеждены кнопки, чекбоксы и радибатоны. оставались закладки. и тут меня ожидал приятный сюрприз. у закладок два сообщения TCM_SETITEMA и TCM_SETITEMW. и работают они так, как ожидается :)

software

Previous post Next post
Up