Join Date: Aug 2007
Posts: 8643
User-Rating:
|
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:
CPP 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::placeholders::_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:
CPP Code: 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::placeholders::_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.
CPP Code: 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.
CPP Code: 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:ialogResult result auswerten und erfahren dadurch, auf welchen Button der Benutzer geklickt hat.
CPP Code: 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 @c [this] mitteilen, dass wir uns innerhalb unserer Form befinden.
CPP Code: 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 "bitte auf einen Button in der MessageBox klicken" ausgegeben.
|