Scrollbar Problem
-
Ich habe eine Scrollbar, dessen größe aber nicht passt. (aber warum?)
Wenn ich den Scrollbalken mit der Maus nehme und ganz nach rechts schiebe, geht ein Teil des Inhalts ab. Mit den Scrollbuttons kann ich dann ganz nach rechts hin klicken.
-
wow deine "Beschreibung" ist ja mehr als schlecht. Also ich weis überhaupt nicht was du getan hast und was nicht funktioniert.
WO hast du ein Scrollbalken?
WOFÜR hast du ihn? Für ein Edit-Feld oder wofür?
WAS genau geht nicht? Die Größe passt nicht und ein Teil des Inhalts geht ab
Also ein paar mehr Erläuterungen und vielleicht ein bisschen Quellcode währen hilfreich

schirrmie
-
Also, ist ein bischen schwierig zu erklären.
ich habe ein Fenster darin befindet sich eine GDI clipping area.
Sie füllt aber nicht das komplette Fenster aus, denn oben und links davon sind panels mit Buttons.Wenn ich nun der Zeichenfäche eine Bestimmte größe gebe, die größer ist als die clipping area, dann wird gescrollt.
Das ist schon richtig, aber mit dem Scrollbalken (horizontal) kann ich nicht bis ganz nach rechts fahren. Er steht zwar schon rechts an, aber die Zeichenfäche ist nicht ganz bis rechts hingescrollt, da geht was ab.Wenn ich nun auf die kleinen Scroll-Buttons drücke, so 20 mal, komme ich ganz langsam ganz rechts. Aber eben nicht mit dem schieben.
Verstanden?
-
Hier ein bischen Quellcode:
Werden als parameter übergeben:
int clip_width = 500;
int clip_height = 400;
int gdi_width = 600;
int gdi_height = 400;
int charheight = 7;int endx = gdi_width - clip_width;
int endy = gdi_height - clip_height;SCROLLINFO scrollinfo;
memset(&scrollinfo, 0, sizeof(SCROLLINFO));
scrollinfo.cbSize = sizeof(SCROLLINFO);
scrollinfo.fMask = SIF_POS | SIF_RANGE | SIF_PAGE;scrollinfo.nPos = endx / 2;
scrollinfo.nMin = 0;
scrollinfo.nMax = endx;
scrollinfo.nPage = clip_width / charheight;kann nicht bis endx scrollen;
-
Zeig uns mal Deinen Scrollhandelr. Ich würde vermuten, das in der Behandlung Deines WM_HSCROLL ds Probelem liegt.
Auf einen Rollbefehl passt Du vermutlich die Koordinaten an und aktualisierst dann den Scrollbar. Ich tippe mal darauf, dass Deine Beerchnung wenn Du um eine Seite Blätterst falsch ist, weil ein zu großer Wert für den Rollbalken erlaubt ist. Bei den Einzelschritten gehst Du vermutlich anders vor.
Ich würde sagen: Debugge mal...
-
UserDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
case WM_HSCROLL:
{
...
//in item stehen die letzten daten der scrollbar drin
//item->frac = scrollinfo.nPageint CurPos;
switch(LOWORD(wParam))
{
case SB_LEFT:
CurPos = item->minval;
break;
case SB_LINELEFT:
if (CurPos != item->minval)
CurPos--;
break;
case SB_LINERIGHT:
if (CurPos != item->maxval)
CurPos++;
break;
case SB_PAGELEFT:
CurPos -= item->frac;
if (CurPos < item->minval)
CurPos = item->minval;
break;
case SB_PAGERIGHT:
CurPos += item->frac;
if (CurPos > item->maxval)
CurPos = item->maxval;
break;
case SB_RIGHT:
CurPos = item->maxval;
break;
SetScrollPos(hwnd, TRUE, CurPos, TRUE);
break;
}
}
-
Hab einen kleinen Teil vergessen.
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
/* Cast to singed value, for negative scrollbars /
CurPos = (short)HIWORD(wParam);
break;
default:
return; / nothing more to do!! */
}
-
CurPos wird doch hier gar nicht initialisiert. Wie soll denn das gehen?
-
Hat einer einen Rat,
schlage mich schon mehrere Stunden damit rum.
-
Ach das habe ich vergessen zu kopieren.
in meiner Struktur steht die zuletzt gespeicherte position
damit wird CurPos initialisiert.CurPos = item->val; switch(LOWORD(wParam)) { ...
-
So kann ich dazu nichts sagen. Sieht OK aus. Also debuggen und die Werte kontrollieren...
-
Es verhält sich so als wie wenn des Scrollbalken zu groß wäre. Und zwar um seine komplette Breite. Wenn ich das Bild stärker vergrößere wird der Scrollbalken kleiner und ich kann immer weiter nach rechts schieben.
-
Wie kalkulierst Du den die Weite, die Du rollen darfst.
Normalerweise so:
<Weite Rollbalken> = <Weite View aus Daten> - <Weite des Fensters>
-
Ja genau so mach ich das.
Jetzt habe ich was neues herausgefunden.
Wenn ich mein scrollinfo.nMax um 153 erhöhe (warum weiß ich nicht) dann passts.
Aber: dies Funktioniert nur wenn das Fenster maximiert ist.
Wenn ich das Fenster minimiere ist des Scrollbereich zu groß. Und je kleiner das Fenster, desto kleiner mein clipping area und desto größer wird der Überschuss an Scrollbereich? Komisch.Erst hatte ich gedacht die 153 kommen vom Linken panel. Kann aber nicht sein sonst müsste er beim minimieren gleich bleiben, dieses panel ändert nämlich die größe beim minimieren des Fensters nicht.
-
Normal ist es ja so:
Wenn ich bei scollinfo.nMin = 0 und bei scollinfo.nMax = 500 angebe, kann ich meine Position dazwischen verschieben.Geht aber nicht komme nicht bis 500 ran.
Wenn ich den Scrollbalken nach rechts verschiebe steht er bei 400 (geschätzt) an. Das darfs doch nicht geben.
-
Aber daran ist nicht der Rollbalken schuld! Du selbst setzt und kontrollierst was gescheiht wenn gerollt wird.
-
case SB_THUMBTRACK: /* Cast to singed value, for negative scrollbars */ CurPos = (short)HIWORD(wParam); break;Wenn ich den Rollbalken ganz nach rechts verschiebe dann müsste mir doch HIWORD(wParam) -> scrollinfo.nMax liefern oder?
-
Ich glaube der Rollbalken geht davon aus, dass ihm die Gesamte Fensterbreite gehört. Da ich aber links ein Panel habe stimmt jetzt die Breite nicht mehr.
Nur wie sage ich der Bildlaufleiste, dass sie <gesamte Fensterpreite> - <größe linkes Panel> ist.