WinApi/C++ Scrollbars mit CreateWindow(...)



  • crashjosh schrieb:

    Hallo Leute
    Da ich jetzt mit WinApi progge und schon Editboxen...

    Du weißt aber, dass Editboxen nicht nur aus einer Reihe bestehen können, oder?
    So wie ich das nämlich verstehe, möchtest du nun einen längeren Text über mehrere Zeilen diesem Control zufügen, oder?

    Falls ich richtig liege, kannst du bei CreateWindow einfach zusätzlich die Styles ES_MULTILINEund WS_VSCROLL übergeben.



  • Eig möchte ich eine Scrollbar und ein Textfeld wo AGBs drin stehen
    und halt das ich scrollen kann..



  • Wenn du einmalig den Text zufügen möchtest, schickst du einfach eine Nachricht vom Typ WM_SETTEXT. Der LPARAM zeigt hierbei auf die nullterminierte Zeichenkette.

    Äußerst praktisch ist es aber (und funktioniert natürlich auch, wenn der Text später nicht mehr geändert werden soll), jederzeit Text anfügen zu können:

    void AddToEditCtrl (HWND editWnd, const TCHAR* text)
    {
    	SendMessage (editWnd, EM_SETSEL, -1, -1);
    	SendMessage (editWnd, EM_REPLACESEL, FALSE, reinterpret_cast<LPARAM>(text));
    	SendMessage (editWnd, EM_SCROLLCARET, 0, 0);
    }
    
    // Überladung für std::strings
    void AddToEditCtrl (HWND editWnd, const std::basic_string<TCHAR>& text)
    {
        AddToEditCtrl(editWnd, text.c_str());
    }
    


  • Sry bin ein Anfänger ^^ ahbe mir dei Docs von der MSDN zu WM_SETTEXT durchgelesen
    aber ich verstehe nur Bahnhof 😕



  • Ich glaube, du hast etwas missverstanden:

    crashjosh schrieb:

    hScroll = CreateWindow ("EDIT",
    	                      NULL,
    			 WS_VISIBLE | WS_CHILD | WS_VSCROLL |
                                     ES_AUTOVSCROLL | ES_LEFT,
    						 20,100,
    						450,100,
    						hWnd,(HMENU)ID_SCROLL,
    						hInst,
    						NULL);
    

    hScroll ist kein Handle auf eine Scrollbar, sondern ein Handle auf ein Editfeld, das eine vertikale Scrollbar (WS_VSCROLL) besitzt und sie bei Bedarf (ES_AUTOVSCROLL) anzeigt. Wenn du nun auch noch das Flag ES_MULTILINE hinzufügst, sollte das Control deinen Vorstellungen entsprechend arbeiten.

    // Ich nenne hScroll nun hEdit
    
    const TCHAR* text = TEXT("Dies ist der Text, der ins Editfeld soll.");
    SendMessage(hEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text));
    
    // oder, wie vorgeschlagen
    AddToEditCtrl(hEdit, text);
    


  • Danke hat alles Funktioniert aber man kann den Text löschen und

    \n
    

    klappt nicht

    const char szAGB[] ="Bitte lesen sie sich die Nutzungsbedingungen durch!\nBla\nBla"
    
    //...
    
    const TCHAR* text = TEXT(szAGB);
    SendMessage(hScroll, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text));
    

    EDIT: Ausgabe im Scrollfeld : Bitte lesen sie sich die Nutzungsbedingungen durch!BlaBla



  • Ich bin mir nicht sicher, aber möglicherweise benötigst du \r\n als Zeilentrenner.

    PS: Wenn du schon mit TCHAR's arbeitest, dann bitte konsequent durchgehend. (und das Makro TEXT() lässt sich auch nicht auf String-Variablen anwenden)



  • Naja ich kenne mich mit TCHAR nicht aus bin grade erst WinApi eingestigen

    \r\n funzt nicht 😞



  • crashjosh schrieb:

    Naja ich kenne mich mit TCHAR nicht aus bin grade erst WinApi eingestigen

    Deswegen die etwas sonderbare Verwendung 😃

    Korrekt müsste es so aussehen:

    const TCHAR szAGB[] TEXT(="Bitte lesen sie sich die Nutzungsbedingungen durch!\nBla\nBla");
    
    //...
    
    SendMessage(hScroll, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(szAGB));
    

    \r\n funzt nicht 😞

    Hast du auch an ES_MULTILINE gedacht?



  • 😃
    Danke funzt alles 👍



  • Hm.. Wenn ich bei

    CreateWindow ("STATIC",...)
    

    angebe wird alles Grau aber bei "EDIT" kann man den Text/Nutzungsbedingungen
    editieren
    hab es schon mit "SCROLLBAR" versucht aber das ging ganz schief...
    wie kann ich es schaffen das man den Text nicht bearbeiten kann aber trotzdem scrollen?



  • ES_READONLY.



  • Funzt nicht ^^

    hScroll = CreateWindow ("EDIT",//oder "STATIC"
    	                                    NULL,
    			WS_VISIBLE | WS_CHILD | WS_VSCROLL | ES_AUTOVSCROLL | ES_LEFT | WS_BORDER | ES_MULTILINE | ES_READONLY,
    						  20,100,
    						450,100,
    						hWnd,(HMENU)ID_SCROLL,
    						hInst,
    						NULL);
    




  • Schon gut ,schon gut... 🙄



  • Okay, du hättest duzuschreiben können, was nicht funktioniert. Wird das Control nicht erstellt, ist es nicht readonly, ist es auf einmal eine Listview 🤡 .

    Das könnten durchaus wichtige Dinge sein.



  • Sry nochmal war ein anderer Fehler
    ^^
    Danke für all den Support



  • Wie wärs, wenn du dann die Lösung hier hinschreibst, damit Leute, die später das gleiche Problem haben, hier nachlesen können, wie sich dieses u.U. beheben lässt? 🙄



  • crashjosh schrieb:

    Danke hat alles Funktioniert aber man kann den Text löschen und

    \n
    

    klappt nicht

    const char szAGB[] ="Bitte lesen sie sich die Nutzungsbedingungen durch!\nBla\nBla"
    
    //...
    
    const TCHAR* text = TEXT(szAGB);
    SendMessage(hScroll, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text));
    

    EDIT: Ausgabe im Scrollfeld : Bitte lesen sie sich die Nutzungsbedingungen durch!BlaBla

    probier mal

    \r\n
    


  • @manmanman es war ein Fehler ich hatte eine Variable falsch geschrieben :p
    @dbu Wurde schon genannt aber danke trotzdem ^^


Anmelden zum Antworten