На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> CView и сообщения от клавиатуры , Не приходят сообщения от клавиатуры, если свернуть и развернуть CView, сообщения приходят
    Есть MDI приложение. В нем CView. Открываю CView, начинаю ввод с клавиатуры. Сообщения от клавиатуры не приходят! От мыши приходят, а от клавиатуры нет. Если окно CView свернуть и развернуть, то сообщения от клавиатуры начинают приходить. Пробовал разные варианты, устанавливал фокус, активировал просмотр, трассировал процесс открытия просмотра, ничего не получается. Где грабли?
      Цитата a_n_y_a @
      Есть MDI приложение. В нем CView. Открываю CView, начинаю ввод с клавиатуры. Сообщения от клавиатуры не приходят! От мыши приходят, а от клавиатуры нет. Если окно CView свернуть и развернуть, то сообщения от клавиатуры начинают приходить. Пробовал разные варианты, устанавливал фокус, активировал просмотр, трассировал процесс открытия просмотра, ничего не получается. Где грабли?

      Проблема решена, дело в следующем, в CView создается объект:

      ExpandedWrap disabled
         mv = new CVosprZvukVideo(this);
         mv->Create(IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO, this);
         
          IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO  - это диалог, и его инициализация заканчивается оператором return TRUE;


      Соответственно фокус ввода устанавливается на этот диалог, а не на CView!
      Я это заметил, но переключение фокуса ввода на CView, после сворачивания и разворачивания окна,
      ввело меня в заблуждение. Когда все варианты были исчерпаны, я проверил последний, изменил:

      ExpandedWrap disabled
        return TRUE;  на return FALSE;



      и все заработало!
        Но есть непонятки. Создаю диалог в окне просмотра:
        ExpandedWrap disabled
           mv = NULL;
           mv = new CVosprZvukVideo(this);
           BOOL Rez = FALSE;///
           Rez=mv->Create(IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO, this);

        В диалоге инициализация с выходом TRUE:
        ExpandedWrap disabled
          BOOL CVosprZvukVideo::OnInitDialog()
          {
              CDialogEx::OnInitDialog();
              // TODO:  Add extra initialization here
              return TRUE;  // return TRUE unless you set the focus to a control
          }

        Если посмотреть работу функции:
        ExpandedWrap disabled
          BOOL CVievDom::PreTranslateMessage(MSG* pMsg)
          {
              if (pMsg->message== WM_CHAR)
                  Rez = Rez;   ///  Вот здесь я ставлю точку останова
          }

        то фокус ввода на диалоге и при нажатии кнопки клавиатуры сообщение WM_CHAR в просмотр не приходит!
        Но объект диалога в окне просмотра! Сообщения должны сначала приходить в главное окно и только потом
        в дочерние?! Я правильно понимаю? Или майкрософтовцы чего-то с диалогом намудрили?
        После сворачивания и разворачивания окна просмотра сообщения от клавиатуры начинают приходить в
        просмотр и срабатывает точка останова.
          Цитата a_n_y_a @
          то фокус ввода на диалоге и при нажатии кнопки клавиатуры сообщение WM_CHAR в просмотр не приходит!
          Но объект диалога в окне просмотра! Сообщения должны сначала приходить в главное окно и только потом
          в дочерние?! Я правильно понимаю? Или майкрософтовцы чего-то с диалогом намудрили?
          После сворачивания и разворачивания окна просмотра сообщения от клавиатуры начинают приходить в
          просмотр и срабатывает точка останова.

          Что у тебя возвращает функция PreTranslateMessage, когда летит WM_CHAR ? Диалоговые окна съедают все сообщения внутри своей функции PreTranslateMessage, чтоб оно пошло дальше, ЕМНИП нужно возвращать не return PreTranslateMessage(pMsg), а return false(или что там чтоб сообщение пошло дальше).
          Это стандартное поведение MFC диалогов.

          Добавлено
          Почитай ка еще вот эту статейку: https://rsdn.org/article/mfc/maze.xml
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0311 ]   [ 17 queries used ]   [ Generated: 26.04.24, 12:25 GMT ]