Srollbalken zum scrollen bringen
-
Hi @ All
Wiedermal habe ich ein eher kleines Problem.
Und zwar habe ich ein programm in dem ich daten auslese und untereinander ausgebe. Die daten geben ich in einem Childwindow aus. Dies Childwindow soll nun eine Scrollleiste haben wenn der inhalt nicht mehr in das Fenster passt.
Eine Scrollleiste habe ich. Leider kann ich nicht scrollen.
Bei google habe ich nun ein tutorial gefunden wo beschrieben steht wie das funktioniert. Doch leider funktioniert das nur wenn mein ganzer text in einem Char-Array steht.In meinem Programm werden jedoch alle strings nach einander ausgegeben.
Hat einer eine Idee wie ich das so machen kann das ich auch scrollen kann?
MFG Sqwan
Mein prog:
#include "stdafx.h" #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string> using namespace std; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK ChildProc(HWND, UINT, WPARAM, LPARAM); const char szChildName[] = "content"; const UINT PM_COLORCHANGED = WM_APP + 1; static HWND hButton; static HWND hButton4; static HWND hButton5; static HWND hButton6; static HWND hEdit1; static const int iRand = 20; static const int iZeichenhoehe = 16; static RECT rect; static int iScrollRange; static int iScrollPos; bool anzeigen=false; bool isGleich = false; char buffer[9]; int anfang = 0; int ende = 3; int get = 9; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MSG msg; HWND hWnd; WNDCLASS wc; char szAppName[] = "WetterDB"; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; RegisterClass(&wc); wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.hIcon = NULL; wc.lpfnWndProc = ChildProc; wc.lpszClassName = szChildName; RegisterClass(&wc); hWnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 230, 370, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hChild; static RECT rect; static int iColor = RGB(255, 255, 255); switch (message) { case WM_CREATE: { GetClientRect(hWnd, &rect); hChild = CreateWindow(szChildName, NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL, 10, 70, 200, 260, hWnd, NULL, ((LPCREATESTRUCT) lParam)->hInstance, NULL); hButton = CreateWindow("button", "Suchen", WS_CHILD | WS_VISIBLE, 110, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton4 = CreateWindow("button", "JJJJ", WS_CHILD | WS_VISIBLE, 10, 40, 66, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton5 = CreateWindow("button", "MM", WS_CHILD | WS_VISIBLE, 77, 40, 66, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hButton6 = CreateWindow("button", "TT", WS_CHILD | WS_VISIBLE, 144, 40, 66, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE, 10, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL); return 0; } case WM_COMMAND: { if (lParam == (LPARAM)hButton) { GetWindowText(hEdit1, buffer, 9); buffer[8]='\0'; anzeigen=true; InvalidateRect(hWnd,0,true); } if (lParam == (LPARAM)hButton4) { anfang=0; ende=3; } if (lParam == (LPARAM)hButton5) { anfang=4; ende=5; } if (lParam == (LPARAM)hButton6) { anfang=6; ende=7; } return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hWnd, message, wParam, lParam); } LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_SIZE: { } case WM_PAINT: { if(anzeigen) { PAINTSTRUCT ps; HDC hDC; hDC = BeginPaint(hWnd, &ps); { FILE *fp; char pclinebuffer[1000]; char text[8]; int xPosition=10,i; int a=0; fp = fopen("text.txt", "rt"); while(fgets(pclinebuffer, sizeof(pclinebuffer), fp)) { a=0; for(i=anfang; i<=ende; i++) { text[a]=pclinebuffer[i]; a++; } for(i=0; i<=ende-anfang; i++) { if(text[i]==buffer[i]) { isGleich=true; } else { isGleich=false; break; } } if(isGleich) { TextOut(hDC, 10, xPosition, pclinebuffer, 13); xPosition += 20; } } fclose(fp); } EndPaint(hWnd, &ps); } } } return DefWindowProc(hWnd, message, wParam, lParam); }
-
Du könntest dir z.B. die Sache einfacher machen und ein EDIT-Control oder RichEdit-Control benutzen.
...oder die Messages (WM_VSCROLL z.B.)für die Scrollbar abfangen und entsprechend was tun.
-
Okay ... Ich habe es mal versucht. Aber iwie will das nicht so ganz.
hChild kennt er nicht.
Wird daran liegen das es nicht im Child-window initalisiert wurde.
Wenn ich hChild global definiere gibt es keinen Fehler mehr, jedoch scrollt trotzdem nichts. Könnte das daran liegen das es ein Child-window ist? Weil iwie muss das ja gehen...Oder bin ich vieleicht mit meinem code auf dem Holzweg.
Mit einem editfeld habe ich das schon mal versucht und bin kläglich gescheitert. Da konnte ich zwar hinterher scrollen, jedoch hatte ich keine zeilenumbrüche, und man konnte in dem fenster rumtippen und sachen verändern.
Hier mal mein code..
Der steht im Child-window...
Vllt findet ja wer einen fehler oder kann mir weiter helfen.case WM_VSCROLL: { switch(LOWORD(wParam)) { case SB_LINEDOWN: { iScroll++; } case SB_LINEUP: { iScroll--; } SetScrollPos(hChild, SB_VERT, iScroll, TRUE); } }
-
Du scrollst ja auch noch nicht sondern sorgst nur dafür das der Scrollbalken halbwegs funzt.
(Ich persönlich finde MS hat das mit den Scrollbalken in der WinAPI irgendwie abartig kompliziert gefuscht)
Evtl. ist ScrollWindowEx() was für dich.
-
hm... Auch da habe ich das Problem das der Scrollbalken davon abhängig ist wie groß mein text ist und wie viel text ich habe.
Leider weiß ich das aber nie.
Gibt es keine möglichkeit zu scrollen ohne zu wissen wie viel text in dem Fenster ist, oder eine möglichkeit festzustellen wie viel text ich in meinem Fenster habe?Weil ich trage den text per while-schleife mit TextOut() immer eine zeile nach der anderen ein. Und dann weiß ich ja nicht wie viel das insgesammt ist...
MFG Sqwan
-
Naja, merk dir einfach nach 1x zeichnen den letzten Wert von deinem xPosition

Aber warum nimmst du nicht einfach nen normales Textfeld? Die Teile haben schließlich die ganze Scrollerei-Arbeit schon fertig eingebaut?
-
Das habe ich ja schon mal versucht.
Nur kann ich da sachen ändern die da rein getragen werden.
Und da kriege ich es nicht hin zeilenumbrüche einzubauen.Ich kann ja mal das stück code posten was ich mit so nem Editfeld gemacht habe.
Hier Erzeuge ich das feld:
hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", // <- das ist der Inhalt der Editfelds WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 10, 10, 100, 20, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);In dieses Feld möchte ich nun natürklich auch sachen schreiben.
Das mache ich so.case WM_COMMAND: { if (lParam == (LPARAM)hButton) { FILE *fp; int i,j; j=0; char pclinebuffer[100]; char text[10000]; char *s; if ((fp = fopen("text.txt", "rt")) == 0) { //printf("Eingabedatei konnte nicht geoeffnet werden\n"); return 0; } while(fgets(pclinebuffer, sizeof(pclinebuffer), fp)) { for(i=0; i<5; i++) { text[j]=pclinebuffer[i]; j++; text[j]='\r'; } } text[j+1]='\0'; s = text; SetWindowText(hEdit, s); fclose(fp); } return 0; }Wie gesagt hänge ich an den zeilenumbrüchen.
Wenn du da eine idee für mich hast, kannst du mir da ja vllt weiterhelfen.MFG Sqwan
-
Das Editfeld braucht nicht nur \r sondern \r\n.
Unter Windows ist \r\n ein Zeilenumbruch. (.NET-Framework ist da nicht so wählerisch und begnügt sich schon mit \n)