Как запретить диалогу MFC обрабатывать клавиши ввода и выхода и не передавать его - PullRequest
4 голосов
/ 11 августа 2010

у нас есть приложение C ++, которое размещает Flex-приложение в диалоге MFC. Все работает нормально, все нажатия кнопок и т. Д. Передаются напрямую, чтобы согнуться без проблем, кроме клавиш ввода и выхода, которые немедленно закрывают диалоговое окно.

Мы можем перехватить клавишу ввода, введя PreTranslateMessage() или OnOK() и препятствуют поведению при закрытии окна, но у нас все еще есть проблема передачи этих нажатий клавиши ввода в размещенное гибкое приложение дальше.

На форме нет кнопки "по умолчанию" или чего-либо подобного, возможно, MFC связывает клавишу ввода с кнопкой закрытия в строке заголовка за кулисами или что-то в этом роде.

Есть ли у кого-нибудь идеи, как мы можем помешать MFC обрабатывать клавишу ввода как особый случай?

Большое спасибо за любые подсказки.

Редактировать: Вот PreTranslateMessage(), который просил мммонем.

BOOL CFlexDialog::PreTranslateMessage(MSG* pMsg)
{
  if ((pMsg->message == WM_KEYDOWN))
  {
    if (pMsg->wParam == VK_RETURN)
    {
      m_ctrlFlex->OnReturnKeyPressed();
      return TRUE;
    }
  }
  return __super::PreTranslateMessage(pMsg);
}

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

Мы просто хотим, чтобы MFC обрабатывал ключи возврата и выхода как любой другой ключ.

Ответы [ 4 ]

2 голосов
/ 26 августа 2010

Удалить OnOK() и OnCancel();PreTransateMessage достаточно после рассмотрения VK_ESCAPE.

Почему бы вам не использовать:

m_ctrlFlex->SendMessage(WM_KEYDOWN, VK_RETURN, 0)

вместо

m_ctrlFlex->OnReturnKeyPressed();

в вашей реализации PreTranslateMessage?

1 голос
/ 11 августа 2010

Командные кнопки MFC могут реагировать на события, даже если они не имеют фокуса.

Вы пытались перехватить событие OnClicked и OnOk, чтобы ничего не возвращать?

Пример: trap OnClick ...

   void CMyDialog::OnClickedMyOK()
   {
      CDialog::OnOK();
   }

Затем сделайте запрет в OnOk ()

void CMyDialog::OnOK()
{
}

Это должно остановить обработку клавиши ввода.

0 голосов
/ 30 августа 2010

Если у вас есть проблемы с обработкой вкладок и клавиш ввода, я бы порекомендовал вам использовать окно вместо диалога.Диалог добавляет модальные (если вы используете модальные), вкладки и кнопки по умолчанию.Если вам не нужны / не нужны эти функции или если они мешают вам, не используйте диалоговое окно.

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

0 голосов
/ 11 августа 2010

Другим подходом является «Windows Subclassing».То есть отправка сообщений из одной оконной процедуры, то есть WindProc (), в другую WndProc ().Это может обеспечить путь без прямого вмешательства.(Это не подклассы C ++.)

Вот способ с Подклассами MFC Редактировать: Обеспечил лучшую ссылку.

Поиск "Подклассы Windows / MFC", если больше информацииНеобходимый.

Элемент управления / окно flex имеет WndProc, и у вашего окна, безусловно, есть WndProc, подклассы Windows должны работать.


Новое редактирование: Вот, пожалуй, лучшая ссылка для создания подкласса элемента управления ActiveX.

Элементы управления ActiveX: создание подклассов элемента управления Windows

Создание подклассов элементов управления Windows Forms - Больше.Net-centric.

Примечание: В MFC вы должны увидеть эти функции.

CWnd :: SubclassDlgItem

CWnd :: SubclassWindow

CDialog наследуется от CWnd, поэтому вы также увидите эти две функции как функции "диалога".Они являются ключом к созданию этой работы.Если окно флэш-памяти является истинным окном, используйте SubclassWindow.Если это элемент управления, используйте SubclassDlgItem.

И, наконец, если больше ничего не работает.Продукт / библиотека, которая, будем надеяться, облегчит задачу. EasyHook выглядит здесь как продукт. EasyHook на CodeProject, вы можете получить весь исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...