2011-09-29 1 views
1

Я создаю плагин .net для приложения MFC. Я создал форму с помощью WinForms и .net4. Форма отображается после нажатия пользователем кнопки в приложении MFC. Один из моих элементов управления использует Application.Idle для выполнения некоторых задач.Почему Application.Idle никогда не запускается, когда моя форма размещается в приложении MFC?

Проблема в том, что приложение Application.Idle никогда не запускается.

  • В чем именно заключается «применение» в этом сценарии? Это все приложение MFC или форма .net?
  • Почему нет применения.Изда огня?

UPDATE
мне удалось заставить его работать, здесь возможны два решения:

  • показать форму с помощью Form.ShowDialog() (таким образом, форма запускает свой собственный .net сообщение насос)
  • создать поток STA, создать форму в потоке STA и вызвать Application.Run(). Затем вы можете использовать Form.Show() (форма использует насос сообщения .net в потоке, который был создан, в данном случае: .net STA thread)

ответ

2

Единственный способ, которым Winforms может понять, что приложение не работает, - это когда он не находит никаких других сообщений в очереди сообщений. Ваша проблема заключается в том, что не Winforms откачивает цикл сообщений, это MFC. Что ничего не знает о колоколах и свистах Winforms. Другие вещи идут не так, обратите внимание, что табуляция и короткие нажатия клавиш больше не работают, также обрабатываются контуром сообщений Winforms.

Для этого нет чистого решения, может быть только один мастер. Очень несовершенные исправления используют Form.ShowDialog() и запускают новый поток STA, чтобы вы могли вызвать Application.Run().

+0

Я только узнал, что если моя форма показана с помощью ShowDialog(), все работает! Итак, что делает «Form.ShowDialog()»? Это заставляет приложение накачивать контур сообщения в форме .net? –

+1

ShowDialog показывает цикл сообщений. Сделать диалог модальным. Цикл сообщений Winforms. –

+0

@AZ. он может «работать» в том смысле, что Idle уволен, но бездействие, вызвавшее событие, не имеет ничего общего с Idleness в вашем основном приложении MFC. –

1

. .net форма не является .net-приложением , и ни одно из приложений MFC. MFC имеет свой собственный код, который он вызывает в приложении, когда он неактивен; он не знает Application.Idle.

+0

так что вы имеете в виду Application.Idle никогда не называется? И весь класс приложения бесполезен при использовании в MFC? –

+1

это не бесполезно, но не используется в разработанном виде, так как вы используете насос сообщений MFC, а не тот, который используется в Application.Run. Если вы хотите поднять Application.Idle, переместите простоя MFC и подняли событие самостоятельно –