Edit-Control: ES_MULTILINE im Nachhinein setzen möglich?



  • Hi, ich habe ein simples Edit-Control und möchte nun im Nachhinein bestimmen können, ob das Edit-Control mehrzeilig sein soll, oder nicht. Soweit ich das bisher ausprobiert habe und in der MSDN nachlesen konnte ist das wohl so nicht möglich. Irgendwie kann ich mir das aber nicht vorstellen. Jeglichen Window-Style kann ich über SetWindowLong(Ptr) ändern, aber ES_MULTILINE nicht?



  • Irgendwie kann ich mir nicht vorstellen das man sowas überhaupt braucht.



  • Wo steht in der MSDN dass das nicht geht?
    Ich hab davon nichts gelesen.

    Ein Link oder Zitat wäre hilfreich.



  • Naja, im Grunde gebe ich Dir Recht. Eigentlich weiß man beim Erstellen, ob das Feld Multiline sein soll oder nicht. Ich schreibe nur gerade an einem kleinen Api-Wrapper für mich und möchte die Schnittstelle windowsfrei halten, d.h. ich kann in meinem Ctor keine Styles übergeben, die angeben, wie das Editfeld erstellt werden soll.
    Möglichkeit 1 ist nun, dass ich per bool-Flag angebe, ob es Multiline sein soll und dann entsprechend die Styles dazu-Oder oder halt nicht. Das finde ich persönlich aber nicht sehr schön. Schöner wäre eine Funktion, wie z.B.

    void setMultiline(bool _Multi = true);
    

    womit ich dann die Eigenschaften nach dem Erstellen einfach ändern kann, also z.B. sowas

    Edit myedit(&win, "Textfeld", 10, 10, 100, 25);
    myedit.setMultiline();
    myedit.setThinBorder();
    myedit.setxxxxxxxxx();
    usw.
    

    @Zerebus: Es steht da nicht wirklich, dass das nicht geht, sondern bei allen möglichen anderen Styles steht, dass man diese mit SetWindowLong ändern kann und bei diesen steht das halt nicht. Ich hab's trotzdem ausprobiert und anscheinend klappt das auch nicht. 😞
    Ich hab's so probiert:

    LONG OldStyle = GetWindowLong(hEdit, GWL_STYLE);
       LONG NewStyle = OldStyle | WS_BORDER | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN;
       SetWindowLong(hEdit, GWL_STYLE, NewStyle);
       SetWindowPos(hEdit, HWND_TOPMOST, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOZORDER | SWP_NOSIZE | SWP_NOOWNERZORDER);
    

    erstellt wurde das Edit mit:

    hEdit = CreateWindowEx(0, "Edit", "Textfeld", WS_CHILD | WS_VISIBLE, 10, 10, 100, 100, hWnd, 0, 0, 0);
    

    Ist jetzt nur ein kleines Testprogramm außerhalb des Wrappers. Den Style WS_BORDER übernimmt er, aber Multiline ist es danach trotzdem nicht.



  • kannste nicht ne Klasse MultilineEdit von Edit ableiten?



  • Stimmt, könnte ich auch machen. Irgendwie denk' ich in letzter Zeit nicht richtig nach. 🙄

    Wenn es wirklich nicht anders geht ... 😞

    THX.



  • Bei wxWidgets wirds auch mit nem Flag gemacht! Aber natürlich nicht direkt ES_MULTILINE!



  • SetWindowLong ist dein Freund.



  • Luckie schrieb:

    SetWindowLong ist dein Freund.

    Ganz merkwürdige Antwort. 🙄



  • Luckie schrieb:

    SetWindowLong ist dein Freund.

    Wie ich bereits geschrieben hab' kann ich gerade diese Styles nicht darüber ändern. 😞 Trotzdem thx.

    Ich hab's jetzt so gemacht, dass ich eine abstracte Basisklasse Edit habe, wovon ich dann SingleEdit und MultiEdit ableite, weil ich mir noch nicht ganz sicher bin, ob ich evtl. MultiEdit von SingleEdit ableiten kann.



  • Das würde ja bedeuten ein MultiEdit ist ein SingleEdit? Hört sich komisch an. 🤡



  • Nein, ich würde dann aus dem abstrakten Edit und dem abgeleiteten SingleEdit ein nicht abstraktes Edit machen, wovon MultiEdit dann erbt. Ich bin mir aber noch nicht so ganz sicher, was wohl vorteilhafter wäre, daher im Moment die Unterscheidung in SingleEdit und MultiEdit. Mich stört da aber irgendwie die abstrakte Klasse mittendrin, daher bin ich noch nicht sicher. Egal, das ist nu schon zu sehr OT. 🙂



  • mantiz schrieb:

    Luckie schrieb:

    SetWindowLong ist dein Freund.

    Wie ich bereits geschrieben hab' kann ich gerade diese Styles nicht darüber ändern. 😞 Trotzdem thx.

    Oh, sorry, habe ich überlesen.


Anmelden zum Antworten