Отображение Unicode

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

Отображение Unicode

Сообщение ANDLL » 13.06.2005 (Пн) 15:38

Итак, зададим строку: ♠¿‼ . Эта строка будет помещаться в строковую переменную непосредственно из некоего файла.

Попытаемся вывести эту строку на hDC(используя DrawTextW). Все произошло в лучшем виде.
Теперь попытаемся установить значение свойства Text TextBox'а в эту строку. Тут нас постигнет неудача: мы увидим следующую строку:¦?!
Теперь используем SetWindowTextW. В трех вариантах:
1) Для VB-ного текстовго поля.
2) Для окна
3) Для окна класса Edit
Увы, в обоих трех случаях мы видим ¦?! несмотря на то, что передаем юникод-строку.

Вопрос: как же теперь редактировать эти строки? Ведь у VB все строки хранятся в формате Unicode. Так почему же его текстовые поля не могут редактировать значения в этой кодировке?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 13.06.2005 (Пн) 15:51

Чегото непонял вопроса
Код: Выделить всё

Private Declare Function SetWindowTextW Lib "user32" (ByVal hwnd As Long, ByVal lpString As String) As Long
'__________________________________
Call SetWindowTextW(Me.hwnd, StrConv("Текст", vbUnicode))
Call SetWindowTextW(Text1.hwnd, StrConv("Текст", vbUnicode))

Все работает...

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 13.06.2005 (Пн) 16:01

И даже так
Код: Выделить всё

Dim hwndEdit As Long
hwndEdit = CreateWindowEx(0, "Edit", "", WS_VISIBLE Or WS_CHILD Or WS_BORDER, 10, 10, 300, 20, Me.hwnd, 0, App.hInstance, &H0)
Call SetWindowTextW(hwndEdit, StrConv("Текст", vbUnicode))

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.06.2005 (Пн) 16:04

А теперь попробуй таким макаром вывести строку
Код: Выделить всё
s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)

(s=♠¿‼)
В особенности сравни то, что выводит MessageBoxW и DrawTextW.
Подсказка: DrawTextW рисует правильные символы. Это согласуется с таблицея символов. А все остальные выводят "вариации на свободную тему".
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.06.2005 (Пн) 17:47

для Unicode нужно юзать контролы из Forms 2.0, а intrinsic contols наследованы еще со старого бейсика, когда еще не было uncicode в винде

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 13.06.2005 (Пн) 18:17

Может просто MessageBoxW из-за шрифта неспособен вывести эти смволы...
Но сейчас я вообще был шокирован
Код: Выделить всё
s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)
msgbox len(s)

Показывает 3, а не 6 :shock:
Я всегда думал, что в юникоде 1 символ записывется 2 байтами. Это почему так?

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.06.2005 (Пн) 18:20

Len показывает длину строки в символах. LenB показывает длину строки в байтах.
На счет MessageBox'а ты прав: тут все дело в шрифте. А вот с Edit'ом мне совершенно не понятно. Ведь у меня WindowsXP!!! Почему же Edit не может отображать символы UNICODE?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.06.2005 (Пн) 18:31

2Konst_One:Спасибо, действительно Forms 2.0 выводят символы Unicode. Остается вопрос с Edit.
И еще: почему Forms 2.0 не воспринимают InitCommonControls?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 19:37

Люди, вы чего все? Этой зимой же проблема уже обсуждалась?
Код: Выделить всё
Option Explicit
Private Declare Function MessageBoxW Lib "user32" (ByVal hWnd As Long, ByVal lpText As Long, ByVal lpCaption As Long, ByVal wType As Long) As Long

Sub Main()
Dim s As String
s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)
MessageBoxW 0, StrPtr(s), StrPtr("У меня в XP это работает прекрасно"), vbInformation
End Sub
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 19:42

Ответ с Edit:
Код: Выделить всё
Option Explicit
Private Declare Function SendMessageW Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETTEXT = &HC

Sub Main()
Dim s As String
s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)
SendMessageW &H1D069E, WM_SETTEXT, 0, ByVal StrPtr(s)
End Sub

Проверено с Edit-ом в Блокноте WinXP. SetWindowTextW с его главным окном тоже нормально работает.


ANDLL, чего-то никаких проблем нету, кроме придуманных тобой :twisted:
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.06.2005 (Пн) 20:16

Н-да :?:
Код: Выделить всё
    Dim s As String, hNotepad As Long
    s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)
    MessageBox 0, StrPtr(s), 0, 0
    hNotepad = FindWindow("notepad", vbNullString)
    SendMessage FindWindowEx(hNotepad, 0, "Edit", vbNullString), WM_SETTEXT, 0, ByVal StrPtr(s)

И прям одно и то же отображается?

P.S. Воспитанность у тебя, tyomitch...
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 20:40

ANDLL писал(а):Н-да :?:
Код: Выделить всё
    Dim s As String, hNotepad As Long
    s = ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C)
    MessageBox 0, StrPtr(s), 0, 0
    hNotepad = FindWindow("notepad", vbNullString)
    SendMessage FindWindowEx(hNotepad, 0, "Edit", vbNullString), WM_SETTEXT, 0, ByVal StrPtr(s)

И прям одно и то же отображается?

SendMessage у тебя как объявлена? Как Alias "SendMessageA"? Тогда ничего удивительного ;-)

(И таки-да, у меня одно и то же отображается при правильных декларациях.)

ANDLL писал(а):P.S. Воспитанность у тебя, tyomitch...

Э... А что я не так сказал? :oops:
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 13.06.2005 (Пн) 20:53

Хы. Если заменить деларацию на W, то действительно, в блокноте отображается то, что нужно.
В MessageBox'е - первый символ заменяется на квадратик, остальные отображаются верно(возможно, связанно со системным шрифтом для Message'а).
Если устанавливать текст(С помощью SetWindowTextW) на новосозданном Edit'е, то отображается ерунда. Видимо связанно с тем, что шрифт, выбранный по умолчанию не поддерживает эти символы.

tyomitch писал(а):Э... А что я не так сказал?

Будто я для тебя сочиняю головоломки, что бы ты их разгадывал. Если считаешь вопросы смешными, неадекватными, элементарными, в-общем не заслыживающими твое святейшее внимание, просто не отвечай
tyomitch писал(а):ANDLL, чего-то никаких проблем нету, кроме придуманных тобой :twisted:
[/i]
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.06.2005 (Пн) 21:36

ANDLL писал(а):Хы. Если заменить деларацию на W, то действительно, в блокноте отображается то, что нужно.
В MessageBox'е - первый символ заменяется на квадратик, остальные отображаются верно(возможно, связанно со системным шрифтом для Message'а).

У меня всё отображается совершенно нормально.
Только что проверил в Win2000 - там всё так же.
Проверь декларацию.

ANDLL писал(а):Если устанавливать текст(С помощью SetWindowTextW) на новосозданном Edit'е, то отображается ерунда. Видимо связанно с тем, что шрифт, выбранный по умолчанию не поддерживает эти символы.

Создавать окно тоже надо через CreateWindowExW:
Код: Выделить всё
Option Explicit
Private Declare Function CreateWindowExW Lib "user32" (ByVal dwExStyle As Long, ByVal lpClassName As Long, ByVal lpWindowName As Long, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
Private Declare Function SetWindowTextW Lib "user32" (ByVal hwnd As Long, ByVal lpString As Long) As Long
Private Const WS_VISIBLE = &H10000000
Private Const WS_CHILD = &H40000000
Private Const WS_BORDER = &H800000
Private Const WM_SETFONT = &H30
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const DEFAULT_GUI_FONT = 17
Private Declare Function GetStockObject Lib "gdi32" (ByVal nIndex As Long) As Long

Private Sub Form_Load()
Dim hwndEdit As Long
hwndEdit = CreateWindowExW(0, StrPtr("Edit"), StrPtr(""), WS_VISIBLE Or WS_CHILD Or WS_BORDER, 10, 10, 300, 20, Me.hwnd, 0, App.hInstance, &H0)
'SendMessage hwndEdit, WM_SETFONT, GetStockObject(DEFAULT_GUI_FONT), ByVal 0&
SetWindowTextW hwndEdit, StrPtr(ChrW(&H2660) & ChrW(&HBF) & ChrW(&H203C))
End Sub

Тогда вместо первого символа будет рисоваться квадратик - потому что такого символа нет в шрифте System. Когда в шрифте какого-то символа нехватает, рисуется именно квадратик, а не какой-то левый символ. Всюду, где у тебя символы меняются на левые, можешь заранее знать, что шрифт не при чём.

Если раскомментировать SendMessage, то шрифт поменяется на MS Sans Serif, и все символы отрисуются правильно.

ANDLL писал(а):
tyomitch писал(а):Э... А что я не так сказал?

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

Мне казалось, что я ответил конкретно на заданные вопросы и привёл работающий код - в отличие от остальных отвечавших :roll:
Чем я тебя обидел-то? Где ты увидел, что я счёл вопросы "смешными, неадекватными, элементарными"??
Изображение

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 14.06.2005 (Вт) 0:46

Приведенный tyomitch'ем код у меня на XP, примерно следующее писал(а):ЂЂЂ

Хотя я уверен, что и это также из-за шрифта, потому что скопировав и вставив вставляется ♠¿‼

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 0:56

ism писал(а):
Приведенный tyomitch'ем код у меня на XP, примерно следующее писал(а):ЂЂЂ


Который из? У меня их с полдесятка уже в этом топике.
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.06.2005 (Вт) 7:43

Про CreateWindowExW не знал. Про WM_SETFONT тоже не догадался.
tyomitch писал(а):Чем я тебя обидел-то? Где ты увидел, что я счёл вопросы "смешными, неадекватными, элементарными"??

По твоему придуманные звучит лучше? Я не обижаюсь а констатирую факты.
Ладно, думаю с помощью tyomitch мы разобрадись с юникодов в виндосных окнах.

А вот на счет IDL: выбранная кодировка Unicode(Codepage 1200). В блокноте эта кодировка назывется просто "Юникод". Как я уже говорил, VC++ корректно декомпилирует этот файл и создает tli и tlh файлы именно с теми именами, которые надо. В отличие от OLEViewer'а и VisualBasic'а. Но ведь вообще COM поддерживает unicode :!: Почему же одни клиенты нормально реагируют на unicode-имена, а другие - нет :?:
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.06.2005 (Вт) 13:50

ANDLL писал(а):Но ведь вообще COM поддерживает unicode :!: Почему же одни клиенты нормально реагируют на unicode-имена, а другие - нет :?:

Ахез, скорее всего - недописали. VB6-то уже 7 лет как вышел, и OleView тоже. Может, в VB.net уже всё нормально?
Изображение

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 14.06.2005 (Вт) 14:03

Ага. Vb.Net тоже пишет ♠¿‼, только этот в отличие от VB6 вообще отказывается работать, ссылаясь на то, что ™ - недопустимый символ.
А ї значит допустимый? Ну вот и спрашивается: есть тут логика?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 188

    TopList