Variable Buttons

ZackM

Grünschnabel
Hallo zusammen,

ich bin dabei Meine erste MFC-Anwendung mit Variablen Buttons zu erstellen, wobei der Benutzer die Möglichkeit haben soll, Name und Position von den Buttons zu ändern.
Ich habe zuerst die GUI-Spezifikation in einer XML-Datei abgelegt....

HTML:
<?xml version="1.0" encoding="UFT-8"?>

<Start_Fenster>
   <button>
      <name>senden</name>
      <positionX>10</positionX>
      <positionY>20</positionY>
      <hoehe>60</heohe>
      <breite>130</breite>
   </button>
   <button>
      <name>empfangen</name>
      <positionX>10</positionX>
      <positionY>60</positionY>
      <hoehe>60</heohe>
      <breite>130</breite>
   </button>
   .
   .
   </button>
</Start_Fenster>

... und sie dann mit TinyXml im Programm geladen.

PHP:
TiXmlDocument doc("Datei_Name.xml"); 

if(!doc.LoadFile())
{ 
printf("Error while loading file: %s\n", doc.ErrorDesc()); 
return; 
}

Jetzt versuche alle Buttons durchzulaufen, um die Attribute (Name, Position, hoehe und breite) auszulesen, aber leider ohne Erfolg.
Mein Code schaut so aus:
PHP:
TiXmlElement* root = doc.RootElement();

if (strcmp(root->Value(), "Start_Fenster")!=0)
{ throw runtime_error(string("falsches Wurzel:") + root->Value()); }

for (TiXmlElement* button = root->FirstChildElement();
     button; 
     button = button->NextSiblingElement() )
{
     Start_Fenster.push_back(nodeToButton(button));
}

Ich sitze seit Tagen daran und komme leider nicht weiter... Es wäre echt super, wenn ihr mir weiter helfen könntet!
Danke.

Grüsse, ZackM
 
Hallo,

ich habe schon geschrieben, wo es klemmt :-)
Ich möchte gerne alle Child-Elemente durchlaufen und dann die Atrribute von jedem Button auslesen.

Grüsse, ZackM
 
ZackM hat gesagt.:
Jetzt versuche alle Buttons durchzulaufen, um die Attribute (Name, Position, hoehe und breite) auszulesen, aber leider ohne Erfolg.
Der Code schaut eigentlich soweit ganz gut aus. Das "ohne Erfolg" solltest du daher schon etwas genauer beschreiben. Gibt es Fehler bzw. Abstürze, klappt das Einlesen des roots nicht, wird die for-Schleife nicht durchlaufen etc. ?

Gruß
MCoder
 
Hallo,

Mein Problem ist, dass ich nicht so genau weiß, wie ich die ausgelesenen Attributen z.B. ein einem Array ablege, bevor ich die Create-Funktion aufrufe.

Grüße, PassKey
 
Mhmm... ich würde den Ansatz gehen und eine Objectlist aufbauen, in denen Du eine Referenz auf alle Deine Elemente (Objekte) setzt. Dann kannst Du wunderbar Stück für Stück durch diese Liste gehen, nach Namen suchen und entsprechende Details setzen.

ich weiß jetzt gar nicht, ob Du für Deine Entwicklungsumgebung schon eine vorgefertigte Klasse dafür hast, wenn nicht, bau sie Dir selber :)

Micha
 
Hallo,

meine Antwort kommt jetzt einbißchen zu spät, da ich leider in letzten Woche einen Unfall gehabt habe.

durch das geparste Dokument kann ich jetzt wunderbar stück für stück laufen und einen std::vector der Klasse Button mit den Daten füllen, die aus dem Dokument gelesen wurden.
Die Klasse Button hat fünf Datenelemente, jeweils eines für Namen des Buttons, PositionX, PositionY, Höhe und Breite.
PHP:
vector<Button> buttonList; 
for ( TiXmlElement* button = root->FirstChildElement( ); 
      button; 
      button = button->NextSiblingElement( ) ) 
{ 
  buttonList.push_back(nodeToButton(button)); 
}

Schließlich iteriere ich über die Collection mit Objekten des Typs Button....
aber wie kann ich daraus meine Buttons erstellen

PHP:
for ( vector<Button>::size_type i = 0, 
                                n = buttonList.size( ); 
      i < n; 
      ++i ) 
{ 
// ?
// ?
}

Kann mir vielleicht jemand weiterhelfen? Vielen Dank schonmal
Gruß ZackM


PS: ich arbeite mit Visual Studio 2005
 
Du hast leider nicht geschrieben, ob Du MFC verwendest oder nicht.
Wenn Du MFC verwendest, könntest Du das folgendermaßen machen:
- Du leitest Deine Button-Klasse gleich von CButton ab.
- Der Konstruktor bekommt als Parameter die ID für den Button, die Koordinaten (z.B. als RECT), den Text, einen Zeiger auf das Elternfenster sowie einen Zeiger auf eine Funktion, die aufgerufen wird, wenn der Button gedrückt wird.
- Im Konstruktor rufst Du die Create-Funktion von CButton auf, um den Button grafisch zu erzeugen
- Du brauchst noch einen Kopierkonstruktor, in dem Du ebenfalls Create aufrufst, da damit ja eine neue Instanz des Buttons erzeugt wird
- Im Destruktor rufst Du DestroyWindow() auf.
- Das von 'nodeToButton(...)' erzeugte Objekt hängst Du an Deinen vector<Button> an. (Bei vorwiegend sequentiellem Zugriff würde ich eine list<Button> vorziehen)

Dann brauchst Du ja auch noch eine Methode, um die Button-Klicks zu empfangen und die entsprechenden Aktionen auszulösen.
Dazu bietet sich die 'PreTranslateMessage' - Methode der Fensterklasse an, welche die Buttons enthält (und die den Buttons als Parent angegeben wird). Dort holst Du Dir mit
Code:
UINT iID = ::GetDlgCtrlID(pMsg->hwnd);
die ID des angeklickten Buttons und suchst den Button mit dieser ID in Deinem vector (oder der list). Wenn die von diesem Button empfangene Message 'WM_LBUTTONDOWN' ist, rufst Du die entsprechende Callbackfunktion des Buttons auf.
 
Hallo und danke erstmal für die Antwort.
Ja, ich verwende MFC, was ich auch im ersten Beitrag geschrieben habe :)
Ich werde jetzt versuchen, diese Schritte zu befolgen, was auch gar nicht leicht wird.
Die Antwort hat mich ein Stückchen weitergebracht. Ich habe mir jetzt wenigestens ein bißchen Überblick verschaffen können, jedoch bin ich noch weit vom Ziel entfernt :(
Ich melde mich nochmal.

Gruß, ZackM
 
Hallo,

dass jeder Button eine bestimmte ID bekommen soll, es ist mir jetzt klar, aber wie kann ich dann diese ID in der resource-h-Datei definieren?
Würdest Du mir bitte das mit dem Kopierstruktor ein bißchen genauer erklären?
Danke im Voraus.

Gruß, ZackeM
 
Zurück