Вновь откройте модальное диалоговое окно в MFC

Выдача исключения во время конструкции является отличным способом сделать Ваш код путем более сложный. Вещи, которые казались бы простыми внезапно, становятся твердыми. Например, скажем, у Вас есть стек. Как Вы выталкиваете стек и возвращаете главное значение? Ну, если объекты в стеке могут добавить своих конструкторов (создающий временный файл для возврата к вызывающей стороне), Вы не можете гарантировать, что не потеряете данные (декрементный указатель вершины стека, создайте возвращаемое значение с помощью конструктора копии значения в стеке, который бросает, и теперь имейте стек, который просто потерял объект)! Это то, почему станд.:: стек:: поп не возвращает значение, и необходимо назвать станд.:: стек:: вершина.

Эта проблема хорошо описана здесь , проверьте Объект 10, пишущий безопасный от исключения код.

5
задан MMx 4 December 2009 в 11:03
поделиться

5 ответов

Не вызывать EndDialog (IDOK);

Для обработки нажатых кнопок ok или отмены просто наследуйте OnOk или OnCancel ... В противном случае EndDialog будет вызываться дважды, и вы ' у вас возникнет проблема!

1
ответ дан 15 December 2019 в 06:28
поделиться

На самом деле я думаю, что у YeenFei здесь есть хороший аргумент.

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

Это кажется более вероятным, поскольку YeenFei указала, что вы хотите повторно показывать свой диалог каждый раз, когда таймер поднимается, скрывая его, когда пользователь нажимает кнопку, чтобы закрыть его. Таким образом, если время снова повысится,

1
ответ дан 15 December 2019 в 06:28
поделиться

If you want your application run in background without UI, why not juz temporary hide it? a simple function this->ShowWindow(SW_HIDE) will do the job for you.

i think you should revise your design decision as it seem illogical for an application to behave like what you wanted it to be.

0
ответ дан 15 December 2019 в 06:28
поделиться

Я решил проблему, скрывая диалог, вместо того, чтобы закрыть его, и запустив другую резьбу, которая сначала спит, а затем всестороннее диалоговое окно.

0
ответ дан 15 December 2019 в 06:28
поделиться
3853754-

Почему вы не можете кодировать это так:

CdelmeDlg dlg; 
dlg.DoModal(); 

CdelmeDlg dlg1; 
dlg1.DoModal(); 
1
ответ дан 15 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: