#c #windows-7 #messagebox #taskdialog
#c #windows-7 #messagebox #taskdialog
Вопрос:
Возможно ли отобразить TaskDialog без кнопок? Я хотел бы иметь возможность показывать только индикатор выполнения (с сообщением), а затем закрывать окно TaskDialog, когда моя обработка будет завершена (из события таймера). Прямо сейчас я могу показать отключенную кнопку, а затем вызвать ButtonClick, чтобы закрыть окно, но отображение кнопок и использование метода CloseDialog было бы идеальным.
Спасибо.
Ответ №1:
Создайте свой собственный класс из CTaskDialog
class CTaskDlg : public CTaskDialog
{
in CTaskDlg.h declare:
public:
void CloseTaskDlg(void);
protected:
HWND m_TaskDlgHwnd;
virtual HRESULT OnInit();
};
в CTaskDialog.cpp:
void CTaskDlg::CloseTaskDlg(void)
{
::SendMessage(m_TaskDlgHwnd, TDM_CLICK_BUTTON, static_cast<WPARAM>(TDCBF_OK_BUTTON), 0);
}
HRESULT CTaskDlg::OnInit()
{
m_TaskDlgHwnd = ::GetActiveWindow();
return S_OK;
}
CTaskDlg dlg;
dlg.CloseTaskDlg();
Ответ №2:
Оба TaskDialog()
и TaskDialogIndirect()
принудительно нажимают кнопку по умолчанию, если вы не указываете никаких кнопок, но у вас есть контроль над тем, какие кнопки используются, поэтому я бы разместил кнопку прерывания в диалоговом окне, чтобы отменить любую операцию, статус которой вы отображаете. Или, может быть, кнопка Скрыть, если пользователь больше не хочет видеть прогресс, не останавливая выполняемую операцию.
Вы должны использовать TaskDialogIndirect()
, чтобы активировать функцию индикатора выполнения. Вы также можете использовать его функцию обратного вызова для получения HWND
содержимого диалогового окна, чтобы при необходимости программно закрыть его.
В противном случае не используйте TaskDialog API. Просто создайте свое собственное окно с вашим собственным пользовательским интерфейсом, тогда вы сможете делать с ним все, что захотите.