Aufgabendialog in MFC

 C Programming >> C-Programmierung >  >> Tags >> MFC
Aufgabendialog in MFC

Die neue MFC-Bibliothek von Visual Studo 2010 unterstützt ein weiteres Vista-spezifisches Feature, den Aufgabendialog. Dies ist als Ersatz für das klassische Dialogfeld gedacht und kann Befehlsverknüpfungen, benutzerdefinierte Schaltflächen, benutzerdefinierte Symbole und eine Fußzeile anzeigen.

Hier ist ein Beispiel für einen solchen Dialog (von Windows Server 2008).

MFC enthält eine neue Klasse namens CTaskDialog, die den Aufgabendialog implementiert. Sie müssen afxtaskdialog.h in Ihre Dateien aufnehmen, um es verwenden zu können. Da der Aufgabendialog nur unter Vista oder neueren Versionen (Server 2003, Server 2008, Windows 7) verfügbar ist, müssen Sie prüfen, ob Sie ihn verwenden können oder nicht. Dafür stellt die Klasse CTaskDialog eine statische Methode namens IsSupported() zur Verfügung, die true zurückgibt, wenn der Aufgabendialog auf dem laufenden Betriebssystem verfügbar ist. Außerdem ist der Aufgabendialog nur verfügbar, wenn Sie für UNICODE bauen.

Der folgende Code zeigt, wie der Aufgabendialog aus dem vorherigen Bild erstellt und angezeigt wird.

void CTasksDemoDlg::OnBnClickedButtonTasks1()
{
   CString strMessage("Do you want to save your changes to the document?");
   CString strDialogTitle("Save document");
   CString strMainInstruction("Save document options");

   CString expandedLabel("Hide extra information");
   CString collapsedLabel("Show extra information");
   CString expansionInfo("You can select to save your document either as XML or binary. You should prefer to save as XML as this is the new standard format.");

   if (CTaskDialog::IsSupported())
   {
      CTaskDialog taskDialog(strMessage, strMainInstruction, strDialogTitle, TDCBF_OK_BUTTON);
      taskDialog.SetMainIcon(TD_INFORMATION_ICON);
   
      taskDialog.SetCommonButtons(TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON);
      taskDialog.LoadCommandControls(IDS_SAVE_OPTION1, IDS_SAVE_OPTION2);
      taskDialog.SetExpansionArea(expansionInfo, collapsedLabel, expandedLabel);
      taskDialog.SetFooterText(L"Note: If you don't chose to save your changes will be lost.");
      taskDialog.SetVerificationCheckboxText(L"Remember your selection");

      INT_PTR result = taskDialog.DoModal();

      if (taskDialog.GetVerificationCheckboxState() )
      {
         // PROCESS IF the user selects the verification checkbox
      }

      switch (result)
      {
         case IDS_SAVE_OPTION1:
            AfxMessageBox(L"You chose to save as XML");
            break;
         case IDS_SAVE_OPTION2:
            AfxMessageBox(L"You chose to save as binary");
            break;
         case IDNO:
            AfxMessageBox(L"You chose not to save");
            break;
         case IDCANCEL:
            AfxMessageBox(L"You chose to cancel");
            break;
         default:
            // this case should not be hit
            ASSERT(FALSE);
            break;
      }

   }
   else
   {
      AfxMessageBox(strMessage);
   }
}

In diesem Beispiel sind IDS_SAVE_OPTION1 („Im XML-basierten Format speichern“) und IDS_SAVE_OPTION2 („Im Binärformat speichern (alte Version)“) zwei Zeichenfolgen, die in der Zeichenfolgentabelle des Ressourcen-Editors definiert sind.

Es gibt mehrere vordefinierte Symbole in commctrl.h, die als Hauptsymbol verwendet werden können.

#define TD_WARNING_ICON         MAKEINTRESOURCEW(-1)
#define TD_ERROR_ICON           MAKEINTRESOURCEW(-2)
#define TD_INFORMATION_ICON     MAKEINTRESOURCEW(-3)
#define TD_SHIELD_ICON          MAKEINTRESOURCEW(-4)

Die folgenden Flags für Standardschaltflächen sind im gleichen Header definiert:

enum _TASKDIALOG_COMMON_BUTTON_FLAGS
{
    TDCBF_OK_BUTTON            = 0x0001, // selected control return value IDOK
    TDCBF_YES_BUTTON           = 0x0002, // selected control return value IDYES
    TDCBF_NO_BUTTON            = 0x0004, // selected control return value IDNO
    TDCBF_CANCEL_BUTTON        = 0x0008, // selected control return value IDCANCEL
    TDCBF_RETRY_BUTTON         = 0x0010, // selected control return value IDRETRY
    TDCBF_CLOSE_BUTTON         = 0x0020  // selected control return value IDCLOSE
};
typedef int TASKDIALOG_COMMON_BUTTON_FLAGS;

Eine einfachere Methode zum Erstellen eines Aufgabendialogfelds, jedoch mit weniger Anpassungsoptionen, ist die Verwendung der statischen Methode ShowDialog() von CTaskDialog. Das folgende Beispiel zeigt einen Dialog ähnlich dem ersten.

void CTasksDemoDlg::OnBnClickedButtonTasks2()
{
   HRESULT result2 = CTaskDialog::ShowDialog(
      L"Do you want to save your changes to the document?",
      L"Save document options",
      L"Save document",
      IDS_SAVE_OPTION1,
      IDS_SAVE_OPTION2,
      TDCBF_NO_BUTTON | TDCBF_CANCEL_BUTTON,
      TDF_ENABLE_HYPERLINKS | TDF_USE_COMMAND_LINKS,
      L"Note: If you don't chose to save your changes will be lost.");
}