Уникодный Edit понимает не весь уникод

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 05.04.2019 (Пт) 15:30

То есть, показывать может всё, а вот набирать - нет.

Есть Edit, созданный CreateWindowExW, он субклассируется. Показывать может любые знаки. Набирать может тоже большинство раскладок. Можно писать в одном окне на арабском, русском, идише и тд.

Но! Если раскладка клавиатуры подразумевает язык, для которого нет Ascii-кодировки, типа японской или грузинской, то в Edit-e вводятся вопросики. Причем, вставить из буфера текст на этих языках - можно.

И я, скорее всего, даже знаю, почему. Видимо, в дебрях бейсика при обработке сообщений вызывается DispatchMessageA вместо W, и до моей винпрок уникодные сообщения просто не доходят.

Как это победить?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Уникодный Edit понимает не весь уникод

Сообщение Хакер » 05.04.2019 (Пт) 21:51

В таких случаях надо выкладывать пример, с которым можно играться, отлаживать, искать решение. И писать версию ОС, на которой проблема наблюдается.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 05.04.2019 (Пт) 22:46

Пример лежит в соседнем топике. viewtopic.php?f=1&t=56533

На вскидку, если без субклассинга и оставив за скобками проблему прозрачности:
Код: Выделить всё
hwTx = CreateWindowExW(WS_EX_TRANSPARENT, StrPtr("Edit") _
, StrPtr("ля-ля-ля") _
, WS_BORDER Or WS_CHILD Or WS_VISIBLE Or &H4& _
, 0, 0, 150, 150, Me.hwnd, 0, App.hInstance, 0)

Установив соотсветствующие раскладки, в поле можно печатать на иврите, арабском, вьетнамском и пр. Нельзя печатать на грузинском, санскрите и пр. Напечатанное в блокноте, можно через буфер вставить любое.

К эдиту не приходит ни одного сообщения WM_UNICHAR.
Ось семёрка, но, думаю, это не принципиально - в блокноте всё печатается, а это ведь тоже эдит.

С DispatchMessageA , на сколько у меня удалось проверить, проблема не связана. Установил в программе хук WH_GETMESSAGE, при получении клавиатурных сообщений дополнительно их транслирую:
Код: Выделить всё
           Case WM_KEYDOWN, WM_KEYUP ', WM_CHAR
             TranslateMessage ByVal lParam
             DispatchMessageW ByVal lParam

Получаю, в эдите, как и предполагал, строенные знаки, но уникодного среди них нет - все три одинаковые. WM_CHAR перетранслировать сначала не решился - думал, это вызовет зацикливание, но потом оказалось, что нет, знаки так же высыпаются по три, и уникодного среди них всё равно нет. WM_UNICHAR так и не приходит.

С ричэдитом абсолютно такая же ситуация :(
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Уникодный Edit понимает не весь уникод

Сообщение Хакер » 06.04.2019 (Сб) 6:53

А обычный «Блокнот» себя при этом правильно ведёт?

Вот я, не зная, в чём причина проблема заранее, прирменил бы именно такой подход: если Блокнот (или любое другое юникодное приложение с EDIT-ом) не дуркует, надо надо просто брать и вычислять разницу. Во-первых, разницу в оконных и классовых (если есть новый класс) стилях, а следом разницу в обработке.

DispatchMessageA по идее не должна давать эту проблему, иначе это вызывало бы глобальные проблемы со встраиванием юникодных контролов в неюникодные приложения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 06.04.2019 (Сб) 15:08

Блокнот ведёт себя правильно. Но как к нему подступиться, чтобы что-то там проверять, ума не приложу.

Я воспроизвел ситуацию на си. На окно, созданное с помощью CreateWindowA, положил эдит, созданный с помощь CreateWindowExW. Получил точно такое же поведение - эдит могёт отображать что угодно, но набирать позволяет только в тех раскладках, где есть соответствующая Ascii-кодировка. Санскрит и грузинский пролетают.

Если и главное окно, и едит создавать W-функциями, то эдит получается полноценный.

Прикладываю оба экзешника - один с убогим униэдитом, другой с полноценным.
Вложения
unicod.zip
(54.92 Кб) Скачиваний: 146
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 06.04.2019 (Сб) 15:59

arthur2 писал(а):И я, скорее всего, даже знаю, почему. Видимо, в дебрях бейсика при обработке сообщений вызывается DispatchMessageA вместо W
arthur2 писал(а):С DispatchMessageA , на сколько у меня удалось проверить, проблема не связана.
Хакер писал(а):DispatchMessageA по идее не должна давать эту проблему
В общем, да, конечно, это не она создаёт проблему. Проблему, конечно же создаёт ГетМеседжеА, вот кто создаёт проблему :D :D :D

Код: Выделить всё
Sub Main()
Dim hwTx As Long
hwTx = CreateWindowExW(WS_EX_TRANSPARENT, StrPtr("Edit") _
, StrPtr("ля-ля-ля") _
, WS_BORDER Or WS_VISIBLE Or &H4& _
, 0, 0, 150, 150, 0, 0, App.hInstance, 0)
Dim msg As msg
    Do
      GetMessageW msg, 0&, 0&, 0&
      TranslateMessage msg
      DispatchMessageW msg
    Loop

End Sub
Уаля! В воздухе висит вполне себе полноценный УниЕдит!

Теперь надо бы придумать, как бы решить это не столь радикально.
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 06.04.2019 (Сб) 23:18

Наваял пример. В нём Едит и РичЕдит с полноценным уникодом.
В эдитах теперь можно полноценно печатать в любоЙ раскладке.

Единственное, что странно - WM_UNICHART так и не приходит. Спрашивается, как же тогда получить нужный код напечатанного знака?
Вложения
UniText.zip
(166.59 Кб) Скачиваний: 161
Артур
 
   

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Уникодный Edit понимает не весь уникод

Сообщение Teranas » 07.04.2019 (Вс) 9:51

Очень достойно, только я не понял куда делся фон под текстом, вроде, всё начиналось именно с этого, и нет прокрутки строк.
С уважением, Андрей.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Уникодный Edit понимает не весь уникод

Сообщение arthur2 » 07.04.2019 (Вс) 11:01

Это ж пример. Акценты только на том, о чём речь. Прокрутку можно прикрутить, просто при создании указав соответствующий флаг или послав едитам соответствующее сообщение.

В коде закомментирована установка субклассинга (в form_load в конце - прямо там об этом и написано). Если раскомментировать, будет прозрачный фон у едита. К тому же, можно будет ловить от него любые события, как то нажатие клавиш, движение мыши, и пр. Чтобы субклассинг спокойно отлаживать, можно подключить к примеру dll-ку (она там же в папке) и закомментировать #Const ReleaseBuild = 1 в модуле субклассинга. Специально убрал длл-ку из референцев, чтобы пример от неё не зависел.

У РичЕдита фон и без субклассинга прозрачный.
Артур
 
   


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 33

    TopList