TaskDialog без кнопок

#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. Просто создайте свое собственное окно с вашим собственным пользовательским интерфейсом, тогда вы сможете делать с ним все, что захотите.