Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Траблы с переключением раскладки  (Прочитано 9835 раз)
0 Пользователей и 1 Гость смотрят эту тему.
titov_alex
Участник

ru
Offline Offline

« : 28-04-2004 10:08 » 

Добрый день.
Проблема такая:
имею MDI приложение, написанное на чистом WinAPI. В дочернем mdi окне имеется строка ввода (контрол Edit из библиотеки CommCtrl.lib). В это поле иногда нужно заносить русские значения.
Но, при попытке сменить раскладку клавиатуры, наблюбается следующее - изчезает мененжер раскладки клавиатуры в пенели задач и раскладка не переключается (при попытке ввода ввод идет на англиской кодировке).
Во всех остальных (не mdi-дочерних, например, панель инструментов слева - окно, дочернее главному MainFrame, но не являющееся MDI_CHILD_WINDOW) окнах, раскладка переключается нормально. Причем, если сменить раскладку там, а затем перейти в поле ввода на mdi-дочернем окне, то ввод будет производиться русским текстом.
В чем могут быть грабли?

Спасибо.

PS исходники целиком предоставить не могу в виду их большого размера. А какие именно места могут понадобиться не знаю.
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #1 : 28-04-2004 11:00 » 

Просмотрел сообщения, получаемые едитом на mdi и обычном окне:
Контрол в обычном окне отсылает сообщения WM_INPUTLANGCHANGEREQUEST (дважды), после чего получает сообщение WM_INPUTLANGCHANGE.
Контрол в mdi окне отсылает те же сообщение, но в ответ ничего не получает...
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #2 : 17-05-2004 11:56 » 

проблемма до сих пор не решена, неужели ни у кого нет никаких мыслей по этому поводу? Жаль

есть идея - возможно, этот эффект как-то связан с тем, что дочернее окно работает в своем собственном потоке (опыта работы с окнами в отдельном потоке я не имею, так что мог и напортачить)

вот так я реализовал цикл обработки сообщений:

Код:
  MSG msg;
  while )GetMessage)&msg,hWnd,0,0:>0: |
    if ) msg.hwnd == NULL:
      continue;
    {{TranslateMessage) &msg :;
    {{DispatchMessage) &msg :;
  "


тоесть абсолютно также как и для главного окна приложения..
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #3 : 17-05-2004 15:08 » 

Контрол ты изпользуешь впрямую? Я как правило использую следующим образом
class CEditImpl : public CWindowImpl<CEditImpl, CEdit>
{
};
Правда я работаю с WTL.
А грабли мне кажется в том что у тебя когда фокус на контроле - он перехватывает обработку нажатия всех кнопок. Нужно bHandled = FALSE;
в случае с WTL
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
titov_alex
Участник

ru
Offline Offline

« Ответ #4 : 17-05-2004 15:22 » 

я под чистыв винапи пишу, так что свойства bHandled сбросить немогу (
контрол я теперь уже засубклассил.. только толку все равно 0 - запрос на переключение раскладки ведь отправляется.. я вот думаю, может это происходит потому, что раскладка для всей программы должна быть одной, а я пытаюсь только для mdi-дочернего окна ее поменять... но как заставить дочернее окно посылать запрос от имени главного, я не знаю (
Записан
--Zap--
Гость
« Ответ #5 : 17-05-2004 15:23 » 

titov_alexА ты что в Инете ничего про это не нашел?Не понял?
Посмотри может найдешь что-нибудь.

Лично я про  это ничего незнаю =(
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #6 : 17-05-2004 16:09 » 

ну у меня был тот же трабл. Все стало нормально после того как я перестал заканчивать обработку сообщения нажатия кнопок в процедуре контрола. В втл как это делается я уже грил. Просто в АПИ не знаю. Хотя можно поднять коды втл и позырить.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
titov_alex
Участник

ru
Offline Offline

« Ответ #7 : 17-05-2004 17:52 » 

Хм.. можно попробовать... только вроде у меня почти всегда вызывается стандартная оконная функция контрола.. завтра посмотрю, скажу что как..
Записан
titov_alex
Участник

ru
Offline Offline

« Ответ #8 : 20-05-2004 10:34 » new

Так и есть. После своей обработки сообщения, я каждый раз вызываю стандартную процедуру, которую сохранил при субклассинге контрола, так что по идее все должно работать...

Впрочем, хоть и должно, но не работает.

А какие отличия у цикла обработки сообщений в главном потоке, если главное окно приложение - WIN_TYPE_MAIN_FRAME?
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines