OldSchoolHack GUI
MessageBoxen auswerten

In diesem Tutorial verwenden wir unsere Klasse ErsteForm aus dem Tutorial Eine Form mit Leben füllen weiter. Ziel dieses Tutorials ist es, auszuwerten, auf welchen Button ein Benutzer bei der OSHGui::MessageBox geklickt hat.
Dazu wollen wir die Beschriftung eines OSHGui::Label ändern. Hier nochmal der alte Code:

class ErsteForm : public Form
{
private:
Button *ersterButton;
void InitializeComponent()
{
this->SetText("ErsteForm");
ersterButton = new Button();
ersterButton->SetText("klick mich");
ersterButton->GetClickEvent() += ClickEventHandler(std::bind(&ErsteForm::ersterButton_Click, this, std::placeholder::_1));
this->AddControl(ersterButton);
}
public:
ErsteForm()
{
InitializeComponent();
}
private:
void ersterButton_Click(Control *sender)
{
MessageBox::Show("Ich wurde angeklickt!");
}
};

Um ein Label zum Anzeigen zu bekommen, gehen wir beim Erstellen genauso vor wie bei dem Button:

class ErsteForm : public Form
{
private:
Button *ersterButton;
Label *anzeigeLabel; //Zeiger auf ein Label
void InitializeComponent()
{
this->SetText("ErsteForm");
ersterButton = new Button();
ersterButton->SetText("klick mich");
ersterButton->GetClickEvent() += ClickEventHandler(std::bind(&ErsteForm::ersterButton_Click, this, std::placeholder::_1));
this->AddControl(ersterButton);
anzeigeLabel = new Label(); //neues Label erzeugen
anzeigeLabel->SetLocation(ersterButton->GetLeft(), ersterButton->GetBottom() + 5); //Label 5 Pixel unterhalb des Buttons positionieren
anzeigeLabel->SetText("bitte auf den Button klicken"); //dem Label den Text zuweisen
this->AddControl(anzeigeLabel); //Label zur Form hinzufügen
}
public:
ErsteForm()
{
InitializeComponent();
}
private:
void ersterButton_Click(Control *sender)
{
MessageBox::Show("Ich wurde angeklickt!");
}
};

Im Moment wird bei unserer MessageBox nur ein "OK" Button angezeigt. Diesen wollen wir nun zu zwei "Yes" "No" Buttons ändern.

void ersterButton_Click(Control *sender)
{
MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo);
}

Nun wird die Frage und zwei Buttons angezeigt. Um nun auszuwerten, auf welchen Button der Benutzer geklickt hat, müssen wir die MessageBox mit einer Funktion verknüpfen, die aufgerufen wird, sobald die MessageBox geschlossen wurde. Dazu können wir wieder std::bind oder einen Lamda-Ausdruck verwenden. In diesem Beispiel verwenden wir einen Lambda-Ausdruck, da wir die Funktion nur an dieser einen Stelle benötigen und es unsinnig wäre, dazu eine Funktion in unsere Klasse aufzunehmen.

void ersterButton_Click(Control *sender)
{
MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [](DialogResult result)
{
//dieser Code wird ausgeführt, wenn die MessageBox geschlossen wurde.
});
}

In dieser (anonymen) Funktion können wir nun die Variable OSHGui::DialogResult result auswerten und erfahren dadurch, auf welchen Button der Benutzer geklickt hat.

void ersterButton_Click(Control *sender)
{
MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [](DialogResult result)
{
if (result == ResultYes) //prüfen ob auf "Yes" geklickt wurde
{
}
else if (result == ResultNo) //prüfen ob auf "No" geklickt wurde
{
}
else //auf gar nichts wurde geklickt...MessageBox wurde einfach geschlossen
{
}
});
}

Die Beschriftung unseres Labels passen wir nun einfach innerhalb der if-Verzweigungen an. Da unser Label dem Lambda-Ausdruck unbekannt ist, müssen wir dem Lambda-Ausdruck per [this] mitteilen, dass wir uns innerhalb unserer Form befinden.

void ersterButton_Click(Control *sender)
{
MessageBox::Show("Kommen Sie in den Tutorials mit?", "Frage", ButtonYesNo, [this](DialogResult result)
{
if (result == ResultYes)
{
anzeigeLabel->SetText("dann kanns ja weitergehen :)");
}
else if (result == ResultNo)
{
anzeigeLabel->SetText("dann nochmal langsam von vorne durchgehen");
}
else
{
ersterButton_Click(0);
}
});
}

Wurde auf "Yes" geklickt, so ändert sich der Text des Labels zu "dann kanns ja weitergehen :)", anderfalls zu "dann nochmal langsam von vorne durchgehen". Falls die MessageBox aber einfach geschlossen wurde, ohne auf einen Button zu klicken, wird die Funktion ersterButton_Click aufgerufen, was zur Folge hat, dass die gleiche MessageBox wieder angezeigt wird.