Fenster ID von Dialogelementen


  • Mod

    Ich denke schon, dass dies geht. Du musst nur die Dialog-Id in Verbindung mit der Control-Id nutzen. In dieser Kombination "sollte" ein Control eindeutig sein. Allerdings verbietet es niemand mehrere Controls mit der gleichen ID anzulegen.



  • Martin Richter schrieb:

    Ich denke schon, dass dies geht. Du musst nur die Dialog-Id in Verbindung mit der Control-Id nutzen. In dieser Kombination "sollte" ein Control eindeutig sein. Allerdings verbietet es niemand mehrere Controls mit der gleichen ID anzulegen.

    Und wie komme ich dann an die DialogID wenn ich nur die Control ID habe? Gibts da ne Methode die man auf das entsprechende Controlelement anwenden kann um an die Dialog ID zu kommen?


  • Mod

    Du erzeugst doch den Dialog mit IDD_Dialog !

    Also kennst Du doch die ID.



  • Und wie komme ich dann an die DialogID wenn ich nur die Control ID habe?

    Zur Laufzeit? Gar nicht, denke ich.
    Martim meint sicher, dass Du für die Controls eindeutige Namen verwenden solltest, die den ID-Namen des Dialogs enthalten.
    Oder bin ich schon wieder auf dem Holzweg? Für Section und Key in "WritePrivateProfileString" habe ich bisher die Werte direkt in den Quellcode der Dialoge geschrieben (falls Du das verwendest).



  • Genau die Funktion verwende ich auch. In den einzelnen Dialogklassen habe ich auch eine DialogBar Instanz von der aus ich auf die einzelnen Conrolelemente per GetDlgItem(CID) zugreifen kann. Nur müsste ich dann eben beim speichern "von Hand" alle Felder auslesen und abspeichern, also

    GetDlgItem(IDC_Control1)->GetValue();
    GetDlgItem(IDC_Control2)->GetValue();
    ...
    

    Das Problem was ich damit habe ist, wenn man dann irgendwann mal wieder auf die Idee kommt irgendwelche Fenster hinzuzufügen oder rauszulöschen, man diese entsprechenden Fenster in der Speicher- und Laderoutine dann auch per Hand löschen bzw. hinzufügen müsste, wobei die Wahrscheinlichkeit groß ist, dass man das vergisst.

    Es wäre daher gut wenn man einfach über alle in einer DialogBar vorhanden Elemente iterieren könnte...


  • Mod

    Warum? Du kannst doch einfach mit der Funktion GetWindow alle Fenster durchlaufen!
    Du musst doch gar nicht die IDs kennen. Und von dem CWnd* kannst Du Dir auch dann die ID holen...



  • Stimmt, diese Funktion hatte ich noch nicht ausprobiert 🙂

    Da wird mir aber zwischendrin immer mal ne 65535 als ID geliefert (Buffer overflow?) aber im wesentlichen sind alle gesuchten Controls vorhanden.
    Allerdings werden da jetzt natürlich auch statische Controls zurückgegeben, die ich ja logischerweise nicht speichern muss. Deswegen wäre es noch nett wenn ihr mir sagen könntet, wie ich den Typ (Editbox, Combobox ...) eines CWnd Objekts herausfinde. Die einzige Funktion die ich dazu in der MSDN gefunden habe ist GetWindowInfo. Diese kann ich jedoch aus irgend einem Grund nicht benutzen...(Compiler sagt die wäre ihm nicht bekannt)


  • Mod

    65535=IDC_STATIC (-1)

    GetClassName
    http://msdn.microsoft.com/en-us/library/ms633582(VS.85).aspx

    Und wenn es MFC gesubclasste Fenster sind, dann kannst Du sogar IsKindOf verwenden, oder DYNAMIC_DOWNCAST oder was auch immer.



  • Argh da werden ja Groupboxen (statisch) als Button ausgegeben, genauso wie Radiobuttons (dynamisch). Gibt es da eine Möglichkeit der Differenzierung?


  • Mod

    Slivor schrieb:

    Argh da werden ja Groupboxen (statisch) als Button ausgegeben, genauso wie Radiobuttons (dynamisch). Gibt es da eine Möglichkeit der Differenzierung?

    Du glaubst es nicht, die werden nicht nur so ausgegeben, das sind Buttons! 🤡
    <Stöhn/>
    CWnd::GetStyle!
    http://msdn.microsoft.com/en-us/library/0x61949c.aspx


Anmelden zum Antworten