Русский ввод в ячейку PropertyGrid
От: greatvict www.insat.ru
Дата: 12.07.06 07:56
Оценка:
При переходе на .Net 2.0 обнаружилась такая вещь в одном PropertyGrid-е —
Когда вводишь русский текст в значение текстового свойства, вводятся каракули — ôôôôô (вместо ааааа). Отображает текущее значение русского свойства нормально. В другом месте в том же приложении PropertyGrid работает нормально.
Windows XP English.
В начале программы стоит

Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ru");


Кто-нибудь сталкивался с таким?
Re: Русский ввод в ячейку PropertyGrid
От: greatvict www.insat.ru
Дата: 12.07.06 16:17
Оценка:
Здравствуйте, greatvict, Вы писали:

G>При переходе на .Net 2.0 обнаружилась такая вещь в одном PropertyGrid-е -

G>Когда вводишь русский текст в значение текстового свойства, вводятся каракули — ôôôôô (вместо ааааа). Отображает текущее значение русского свойства нормально. В другом месте в том же приложении PropertyGrid работает нормально.
G>Windows XP English.

G>Кто-нибудь сталкивался с таким?


Получается следующее — символ в кодировке Windows с кодом N воспринимается EditBox-ом, как символ в кодировке Unicode с кодом N.

Выяснились следующие подробности — если положить обычный TextBox на UserControl, который в свою очередь хостится в MFC приложение, как ActiveX, то вот такая фигня и происходит. Обычный EDIT (ActiveX на ATL) на том же UserControl работает нормально.
Re[2]: Русский ввод в ячейку PropertyGrid
От: greatvict www.insat.ru
Дата: 13.07.06 08:20
Оценка:
Здравствуйте, greatvict, Вы писали:

G>Здравствуйте, greatvict, Вы писали:


G>>При переходе на .Net 2.0 обнаружилась такая вещь в одном PropertyGrid-е -

G>>Когда вводишь русский текст в значение текстового свойства, вводятся каракули — ôôôôô (вместо ааааа). Отображает текущее значение русского свойства нормально. В другом месте в том же приложении PropertyGrid работает нормально.
G>>Windows XP English.

G>Получается следующее — символ в кодировке Windows с кодом N воспринимается EditBox-ом, как символ в кодировке Unicode с кодом N.


G>Выяснились следующие подробности — если положить обычный TextBox на UserControl, который в свою очередь хостится в MFC приложение, как ActiveX, то вот такая фигня и происходит. Обычный EDIT (ActiveX на ATL) на том же UserControl работает нормально.


Нашел решение. Нужно в UserControl переопределить функцию —
[DllImportAttribute("user32.dll")]
public static extern bool IsWindowUnicode(IntPtr hWnd);

protected override bool ProcessKeyPreview(ref Message m)
{
    if (m.Msg == 0x102 && m.WParam.ToInt32() < 255)
    {
        if (IsWindowUnicode(m.HWnd))
            m.WParam = new IntPtr(Encoding.GetEncoding("windows-1251").GetChars(new byte[] { (byte)m.WParam.ToInt32() })[0]);
    }
    return base.ProcessKeyPreview(ref m);
}


Получается, что если окно верхнего уровня не Unicode, то винда посылает сообщение WM_CHAR всем дочерним окнам с ANSI символом. И, если дочернее окно Unicode (все .Net окна — Unicode), то оно его неверно воспринимает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.