Окно «Я занят, пожалуйста, подождите» - без кнопок - PullRequest
0 голосов
/ 18 декабря 2009

Я хочу открыть окно, чтобы показать, что программа занята определенной трудоемкой задачей. Но я не хочу никаких кнопок на нем. Я просто хочу всплыть, выполнить задание, а затем удалить его. Я не уверен, как называется такое окно, и поэтому не знаю, что искать в MSDN и т. Д. Есть ли какой-нибудь готовый API для такого рода вещей или мне нужно готовить свой собственный?

РЕДАКТИРОВАТЬ: В ответ на некоторые комментарии ...

Я не использую MFC.

Программа для моего собственного использования - ответ не должен выглядеть красиво.

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

Ответы [ 8 ]

4 голосов
/ 18 декабря 2009

Это на самом деле более глубокий вопрос, чем просто диалоги. Если вы занимаетесь работой, которая может занять много времени, то вы не хотите, чтобы она была в главном потоке. В версиях Windows, предшествующих Vista, окно не будет рисовать - у вас возникает синдром «белого окна», который очень уродлив. Гораздо лучше создать рабочий (не-пользовательский) поток и заставить его публиковать сообщение обратно в главное окно, когда это будет сделано. Очевидно, у вас должен быть какой-то тайм-аут на случай, если он никогда не закончится. Если вы делаете это таким образом, то проблема «диалога» становится проблемой простого открытия окна и его снятия, когда поток отправляет вам сообщение «выполнено». Вы можете попробовать поискать в документации MSDN «немодальное диалоговое окно», диалоговое окно, которое вы можете создавать и уничтожать по своему желанию (не забудьте отключить главное окно). Есть некоторые недостатки в реализации этого в MFC, но вы не говорите, используете ли вы это или нет.

2 голосов
/ 18 декабря 2009

почему ???

Принятая идиома Windows заключается в использовании курсора песочных часов.

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

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

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

1 голос
/ 18 декабря 2009

Посмотрите на функцию CreateWindowEx . Вы можете использовать WS_POPUP как dwStyle для создания всплывающего окна. Смотрите здесь для списка стилей окна.

1 голос
/ 18 декабря 2009

Я думаю, что вы ищете Заставка

0 голосов
/ 18 декабря 2009

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

"|"
"\b/"
"\b-"
"\b\\"

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

Еще одно сердцебиение:

"*"
"\b "
"\b*"
0 голосов
/ 18 декабря 2009

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

теперь в вашем коде, используйте функцию CreateDialog() для создания вашего диалога, затем ShowWindow(). вам нужно будет настроить цикл сообщений для перерисовки диалога. в MSDN есть хороший набор примеров .

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

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

0 голосов
/ 18 декабря 2009

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

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

0 голосов
/ 18 декабря 2009

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

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