neueWerte ist deine Form und liefereRahmenFarbe wäre die Funktion die du darauf aufrufst? Wann wird der ganze Code denn aufgerufen? Unmittelbar nachdem dein Fenster geöffnet wird, oder wenn du auf einen Button klickst? Was helfen kannst ist den Debugger zu benutzen. Du setzt Breakpoints im Code und guckst ob die jeweiligen Stellen im Code überhaupt aufgerufen werden. Dann kannst du Schritt für Schritt deinen Code durchgehen lassen und gucken welche Werte wie aussehen. Wenn du nicht weißt wovon ich hier rede, dann guck mal bei Google. Wenn du damit nicht weiter kommst natürlich gern hier im Forum fragen. Benutzt du Visual Studio zum entwickeln?
Hier hast du ein Beispiel für Visual Studio 2010. Hab es nur überflogen, aber sieht ganz gut aus.
Ansonsten sagst du, du bist Anfänger. Das ist natürlich nicht schlimm, aber ich frage mich warum du unbedingt Windows Forms und C++/CLI verwenden möchtest. Warum machst du dir das ganze nicht ein wenig einfacher? Hier geht es ja denke ich primär erst mal um dein Spiel. Benutz doch vielleicht SFML. Das ist nun mal extra für Spiele gemacht und damit solltest du denke ich einfacher zurecht kommen. Andere Sprachen bieten sich natürlich auch an. Vielleicht wäre C# ja was für dich. Da hättest du die Möglichkeit mit Unity zu arbeiten. Einfacher heißt nicht unbedingt schlechter. Ich arbeite seit längerem nicht mehr mit C++ und größtenteils benutze ich eigentlich C#, bis auf wenige Ausnahmen. Ist natürlich nur ein Hinweis, den du beherzigen kannst oder eben nicht.
Aber noch mal kurz zu deinem Problem. Sinnvoll sind 2 Herangehensweisen wie ich finde.
1: Du benutzt einen Dialog. Dieser liefert direkt deinen gewünschten Wert zurück sobald er beendet wird. In Pseudocode läuft das dann in etwa so ab:
|
Quellcode
|
1
2
|
ColorDialog dialog = new ColorDialog();
Color color = dialog.Show();
|
Wichtig ist, das ist nur Pseudocode. Kein C++ und auch nichts anderes. Du erstellst im Prinzip deinen Dialog, zeigst ihn an, die eigentliche Logik deines Fensters wird angehalten. Wenn dein Dialog dann beendet wird, wird ein Wert zurück gegeben. In diesem Fall ein Objekt vom Typ Color. Die Syntax musst du dann an deine Sprache anpassen und die Funktionen passend zusammen suchen. Ich zeige hier nur die Logik.
2: Du benutzt ein weiteres nicht modales Fenster. Dein eigentliches Fenster wird dadurch nicht unterbrochen (der Thread des Fensters). Dein zweites Fenster für die Farbwahl kennst möglichst das Hauptfenster und kann bevor es sich beendet die gewünschten Werte an dein Hauptfenster übergeben. Noch mal ein wenig Pseudocode. Für den Code gilt das selbe wie oben. Ich zeige nur Logik. Wie das ganze dann umgesetzt wird musst du selbst gucken.
|
Quellcode
|
1
2
3
4
5
6
|
// im Hauptfenster passiert das:
ColorPicker picker = new ColorPicker(this);
// im ColorPicker passiert vor dem schließen das:
mainWindow.SetColorPickerResult(color);
|
Ein wenig zum Verständnis. Wenn du dein Fenster für die Farbauswahl erzeugst so gibst du diesem eine Referenz, einen Zeiger, was auch immer, auf das Hauptfenster mit. Hier willst du das Ergebnis am Ende ja haben. Dein Hauptfenster bekommt eine Funktion um ihm den Wert zu übergeben. In diesem Fall SetColorPickerResult. Wenn im Farbauswahlfenster die Farbe gesetzt wurde und das Fenster geschlossen werden soll, dann rufst du vorher diese Funktion auf dem Hauptfenster auf.
Ich persönlich würde zur ersten Variante tendieren. Du wirst vermutlich wollen, dass das Hauptfenster eingefroren wird solange in den Optionen Dinge eingestellt werden. Du kannst erst wieder zum Hauptfenster zurück, wenn dein Optionsfenster geschlossen ist. So ist das Verhalten in den meisten Programmen und auch Spielen. Wie gesagt, das oben ist alles nur Pseudocode um ein wenig zu veranschaulichen wie der Ablauf dabei ist. Wie das ganze dann am Ende mit C++/CLI und Windows Forms umgesetzt werden kann, wirst du dann im Internet mit Hilfe von MSDN und Co raus finden. Aber denk noch mal darüber nach ob du damit überhaupt weiter arbeiten möchtest.
edit:
Hier wäre ein Link zu Möglichkeit 1.