Страница 1 из 1

Subclassing и WM_CREATE

Добавлено: 22 Октябрь 2010, 16:07
vadimberman
Всем привет.

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

Естественно, WM_CREATE, где это нужно сделать, Кларион убивает. Вопрос знатокам: можно это как-то обойти?

PS. Если кому интересно, прикрепляю источник. Пока что оно наполовину работает, когда будет готово, вывешу для скачивания. Это не класс - идея в том, чтобы никаких чисток при закрытии делать не надо. Потом добавлю поддержку для таблиц (там вроде только WM_PAINT).

Re: Subclassing и WM_CREATE

Добавлено: 22 Октябрь 2010, 21:25
Дед Пахом
А я почему-то думал, что TEXT control - единственный контрол в Clarion чисто родной виндусовый (а не самописный) и поддерживает юникод без всяких.

Re: Subclassing и WM_CREATE

Добавлено: 23 Октябрь 2010, 3:40
vadimberman
Я тоже так думал. Иллюзии были разбиты попытками скопировать буфер обмена с китайским текстом.

Вообще-то, так и есть. Но это (A)NSI контрол, а не (W)ide string. Т.е. весь API не как у людей - с окончанием W, а A (DrawTextA, CreateWindowA).

Проблема была решена функцией, которая переводит юникод в нужную кодировку в буфере обмена и выстреливает на EVENT:GainFocus. Т.к. у меня приложение по определению работает с разными языками, пришлось это делать динамически, и тот же фокус был проделан с японским, тайским, греческим.

Но есть языки, у которых вообще нет кодировок. Например, пуштунский, которым я сейчас занимаюсь (арабский скрипт + 6 своих знаков, из-за которых он никуда не влазит). Ближе к разработчикам на этом форуме - грузинский, армянский.

Так что пришлось ваять свою поддержку. Идея в том, чтобы данные хранились в UTF-8 (он совместим с латинским шрифтом), и в контроле переводились в UTF-16, который используется виндовскими функциями, оканчивающимися на W (TextOutW, DrawTextW, ...).

В comp.lang.clarion кто-то опубликовал исходник Олега Руденко, который обращается к внутренностям Клариона. Если есть инфа о внутренних структурах вроде UFO, может, кто-то знает, как добраться до WM_CREATE?