Fenster ID von Dialogelementen



  • Hallo,

    habe einen Dialog im *.rc file der wie folgt aussieht:

    IDD_Dialog DIALOG DISCARDABLE  0, 0, 228, 180
    STYLE WS_CHILD
    FONT 8, "MS Sans Serif"
    BEGIN
        CONTROL         "Radio1",IDC_Radio1,"Button",
                        BS_AUTORADIOBUTTON | WS_GROUP,7,6,54,10
        CONTROL         "Radio2",IDC_Radio2,"Button",
                        BS_AUTORADIOBUTTON,5,135,65,10
        COMBOBOX        IDC_Combo1,28,36,92,125,CBS_DROPDOWNLIST | 
                        WS_VSCROLL | WS_TABSTOP
        EDITTEXT        IDC_Edit1,28,51,40,12,ES_AUTOHSCROLL | ES_NUMBER
    END
    

    Wie kann ich wenn ich eine Control ID habe auf den zugehörigen Dialog schließen? Also z.B. von IDC_Radio1 auf IDD_Dialog? GetParent liefert da leider nicht das gewünschte Ergebnis...

    Danke im Vorraus schonmal für eure Hilfe.

    Gruß,
    Slivor



  • Hast Du mal daran gedacht, dass IDC_Radio1 in mehreren Dialogen verwendet werden könnte?



  • Kann mir jetzt gerade nicht vorstellen, wozu du das brauchst. Aber offenstichtlich hast du mehrere Dialoge, mit gleichen/ähnlichen Controls. Um die Zugehörigkeit eines Controls zu ermitteln kannst du ja bei Änderung/Klick des entsprechenden Controls abfragen welcher Dialog gerade aktiv ist.



  • Hallo,

    brauche das um es in einem ini file abzuspeichern. Das entsprechende Window wollte ich als Kategorie nehmen, um darunter die einzelnen Einstellungen der Controlelemente zu speichern...

    Aber offensichtlich geht das ja nicht, dann muss ichs halt "hardcoded" machen und alles einzeln zuweisen...



  • Da lag ich ja mit meinem Gedanken voll daneben. Ich würde mir in meinen Dialogen ein Flag oder einen Kenner anlegen, evt. (wenn es sich anbietet) die Titelzeile des Dialogs (GetWindowText) verwenden.


  • 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