Здравствуйте, 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), то оно его неверно воспринимает.