Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.03.2007, 15:48

Wie erstelle ich eine Textbox mit Scrollbar?

Hallo Community,

als Anfänger stehe ich mal wieder vor einem Problem in Sachen Windows-Programmierung.

Ich möchte in einem einfachen Windows-Programm eine Textbox einfügen die zumindest über eine vertikale Scrollleiste verfügt. Der Text der in dieser Textbox angezeigt werden soll dürfte aber nicht veränderbar sein.

Eigentlich ziemlich simpel dachte ich mir aber ich finde einfach keine Lösung. Ich kenne mich mit Windows-Forms absolut nicht aus und mit MFC ebenfalls nicht. Gibt es da nicht eine Lösung, dass die Textbox als Child-Fenster erstellt wird einfach per CreateWindow ("TEXTBOX", ....) oder so ähnlich!?

Wenn ich ein STATIC-Child-Fenster erstelle und im den Parameter
ES_AUTOVSCROLL übergebe hilft das nichts.

In der winuser.h werden folgende Funktionen definiert:
EnableScrollBar(); und ShowScrollBar();
Mit deren Hilfe kann ich zwar eine ScrollBar erstellen die dann auch sichtbar ist allerdings lässt sich nichts scrollen. Auch nicht mit der Funktion SetScrollPos();.

Ich bin überzeugt das mir jemand helfen kann also bedanke ich mich schonmal. ;)

M.f.G.
SaRu_

ThomasS

Frischling

Beiträge: 50

Wohnort: Landshut

Beruf: Student

  • Private Nachricht senden

2

31.03.2007, 16:58

Wenn du die WinAPI (und damit CreateWindow) nehmen willst einfach WS_VSCROLL bei den Styles angeben. Allerdings heißt die Klasse für Eingabefelder "EDIT" und nicht "TEXTBOX".

Beispiel für eine mehrzeilige Textbox mit 2 Scrollleisten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
CreateWindowEx(WS_EX_CLIENTEDGE,
               L"EDIT",
               Text,
               WS_VISIBLE | WS_CHILD | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL | WS_HSCROLL,
               X,
               Y,
               Width,
               Height,
               parentHwnd,
               NULL,
               hInstance,
               NULL);


EnableScrollBar(), ein STATIC-Child-Fenster, Windows Forms oder MFC brauchst du dafür nicht.

EDIT: Am besten direkt nach der Erstellung noch eine Nachricht für die Schriftart hinterherschicken, sonst sieht die komisch (groß und fett) aus:

C-/C++-Quelltext

1
SendMessage(m_hWnd, WM_SETFONT, (WPARAM)(GetStockObject(DEFAULT_GUI_FONT)), 0);

Damit wird die als DEFAULT_GUI_FONT eingestellte Schriftart eingesetzt, die man von einer Textbox erwartet.

3

31.03.2007, 17:22

Besten Dank für die schnelle und gute Hilfe.

Das es die Klasse "TEXTBOX" nicht gibt war mir schon klar nur dachte ich es gibt eine besondere Klasse extra für so Textboxen.

*EDIT*: Es klappt soweit.

In meiner Edit-Box steht nun viel Text und jetzt soll aus einer Datei neuer Text ausgelesen und ans Ende des vorhandenen Textes angehängt werden. Folgendes Problem:

Wenn ich Text anhänge dann soll die Scrollleiste automatisch ans Ende des Textes gescrollt sein sodass der User das nicht mehr tun muss. Mit SetScrollPos() geht es aber leider nicht.

M.f.G.
SaRu_

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

4

31.03.2007, 18:12

Zitat von »"SaRu"«


Wenn ich Text anhänge dann soll die Scrollleiste automatisch ans Ende des Textes gescrollt sein sodass der User das nicht mehr tun muss. Mit SetScrollPos() geht es aber leider nicht.

Ich erinner mich nicht mehr genau, aber ich habs mal so gemacht:

C-/C++-Quelltext

1
2
3
//scroll to bottom:

len = GetWindowTextLength(m_hWnd);
SendMessage(m_hWnd, EM_SETSEL,len,len);

Es koennte aber auch so klappen (nicht getestet)

C-/C++-Quelltext

1
SendMessage(m_hWnd,EM_SCROLL,SB_BOTTOM,0);
"Have you tried turning it off and on again?"

5

01.04.2007, 14:02

Die 2. Methode klappt einwandfrei. Vielen Dank!!!

*EDIT*:

Ok ich habe noch eine Frage. (Ich hoffe mal die Letzte)
Ich hab ja schon geschrieben das an den Text in meiner Edit-Box neuer Text (aus einer Datei) angefügt werden soll.
Nun hat der Text zwar keine festgelegte Länge aber er ist sehr lang.

Problem 1: Bisher habe ich den vorhandenen Text per GetWindowText() in eine char-Variable eingelesen, in einen string gecastet und dann den anderen Text angehängt und zu letzt wieder über SetWindoWText() in die Edit-Box geschrieben. Gibt es keine einfachere Lösung?

Problem 2: Die Texte sind sehr lang also weiß ich nicht wie ich das mit den Variablen lösen soll. char text[1024] reicht nicht aus.

Nun bin ich drauf gekommen, dass man vielleicht sowas wie Maps aus der STL nutzen könnte. Also eine Art Array das keine festgelegte Größe hat und dann immer eine Zeile einzeln einlesen. Ist aber glaube ich zu umständlich. :(


Brauche also nochmal eure Hilfe :!:


Gruß
SaRu_

6

01.04.2007, 22:48

Zitat

Problem 1: Bisher habe ich den vorhandenen Text per GetWindowText() in eine char-Variable eingelesen, in einen string gecastet und dann den anderen Text angehängt und zu letzt wieder über SetWindoWText() in die Edit-Box geschrieben. Gibt es keine einfachere Lösung?

Problem 2: Die Texte sind sehr lang also weiß ich nicht wie ich das mit den Variablen lösen soll. char text[1024] reicht nicht aus.


Zu1: Nein, zumindest fällt mir keine ein. Aber so umständlich istdas jetzt auch nicht!

Zu2:
Mach ein dynamisches Array!

C-/C++-Quelltext

1
2
3
4
char* buffer;

int zeilen = GetWindowTextLength(textfeld);
buffer = new char[zeilen];


So müsste es gehen!
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

7

02.04.2007, 08:46

kannst du nicht CString nehmen? Dem kannst du beliebig viel anhängen und mit der Funktion c_str() bekommst du dein char* zurück.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

8

02.04.2007, 11:25

Mit EM_SETSEL und EM_REPLACESEL kannst du einen Text anhaengen ohne den bisherigen zwischenspeichern zu muessen.

C-/C++-Quelltext

1
2
int len = GetWindowTextLength(hLog);
SendMessage(hLog,EM_SETSEL,(LPARAM)len,(WPARAM)len);        SendMessage(hLog,EM_REPLACESEL,(LPARAM)FALSE,(WPARAM)szAppend);
"Have you tried turning it off and on again?"

9

02.04.2007, 11:29

Zitat

kannst du nicht CString nehmen? Dem kannst du beliebig viel anhängen und mit der Funktion c_str() bekommst du dein char* zurück.



Lass ihn doch erstmal ein bisschen mit char Arrays üben. Da ein bisschen Erfahrung zusammeln schadet auch nicht. std::basic_string<wchar_t> und co. kann er später immer noch nutzen!
Das Böse ist des Menschensbeste Kraft - Friedrich Nietzsche

10

02.04.2007, 14:34

Hallo,

danke an euch drei für die Antworten.

Ich werde mir die Zeit nehmen und mich nach und nach mit allem auseinandersetzen.

Das wars jetzt also vorerst von mir, falls es ein Problem gibt werd ich mich schon nochmal melden ;)


Gruß
SaRu_

Werbeanzeige