Kleines Problem mit einen horizontalen SCROLLBAR
-
Irgendwas mache ich falsch der Scrollbar reagiert nicht so
wie er soll!
Noch was vorweg der Scrollbar ist von mir in ner
ResourcenFile editiert und gehört zu einen modalen Dialog.
Der Dialog wird vernünftig gezeichnet mit allen Ellementen auch der
Scrollbalken aber der funkioniert nicht der bleibt immer links kleben
bzw. schnippt immer an die linke Seite zurück!
Jez folgt der Code Der Dialogfunktion:
BOOL CALLBACK TrafoDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HRGN hrgn; HWND hwndHScroll; int iHorzScrollPos; switch(message) { case WM_INITDIALOG: iHorzScrollPos = 0; hwndHScroll = GetDlgItem(hwnd, IDS_HSCROLLBAR); SetScrollRange(hwndHScroll, SB_CTL, 0, 255, TRUE); SetScrollPos(hwndHScroll, SB_CTL, iHorzScrollPos, TRUE); return TRUE; case WM_COMMAND: switch(LOWORD (wParam)) { case IDOK: case IDCANCEL: EndDialog(hwnd, 0); return TRUE; case IDR_LINKS: return TRUE; case IDR_HALT: return TRUE; case IDR_RECHTS: return TRUE; } break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); EndPaint(hwnd, &ps); break; case WM_HSCROLL: hwndHScroll = GetDlgItem(hwnd, IDS_HSCROLLBAR); switch(LOWORD (wParam)) { //case SB_BOTTOM: // iHorzScrollPos = 0; //break; case SB_PAGELEFT: iHorzScrollPos = 0; break; case SB_LINELEFT: iHorzScrollPos -= 1; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: iHorzScrollPos -= HIWORD (wParam); break; case SB_LINERIGHT: iHorzScrollPos += 1; break; //case SB_TOP: // iHorzScrollPos = 255; //break; case SB_PAGERIGHT: iHorzScrollPos = 255; break; case SB_ENDSCROLL: iHorzScrollPos = GetScrollPos(hwndHScroll, iHorzScrollPos); break; default: break; } SetScrollPos(hwndHScroll, SB_CTL, iHorzScrollPos, TRUE); break; } return FALSE; }
irgendetwas mache ich falsch bei oder in der "WM_HSCROLL" Message
des Dialoges.Vieleicht kann jemand von Euch diesen Teil des Codes mal editieren
und in seine Antwort einfügenwäre echt dankbar!
mfg sclearscreen
-
Hi,
Ein Fehler im Code hab ich nicht gesehen.
Hast du schon mal probiert nach case WM_HSCROLL:eine Messagebox() zu öffnen ??? Um sicher zu stellen, das dieser Case-Zweig angesprochen wird ??? Weil wenn das nicht passiert denk ich mal hast du eine Fehlerhafte Einstellung im Resourcen-Editor.
MfG Unwissender
-
Habsch gemacht der wird angesprochen!
Ja ne das is mein Fehler oder wie mans nennen will, die
MessageBox habsch selbst eingecodet nur um zu sehen ob ich diesen
Zweig ueberhaupt erreiche!
Gesehen ist uebertrieben ich habs zumindest am Systemklang gehört
das auf "WM_HSCROLL" reagiert wird! Das war nun nur zum testen!!!
Ich hab das SCROLLBAR jetzt soweit am laufen und hab die MessageBox wieder
rausgenommen, die war auch ne gefährliche Sache die MessageBox war "nisch sichtbar" nur hörbar und hat den Focus vom modalen Dialog und der Anwendung genommen, wie will man ne nicht sichtbare DialogBox die selbst modal ist wegklicken!!?!? -> Da ging nur laufende Anwendung durch die BCB-IDE zurücksetzen!Mein Hauptfehler war ->
-> die Variable(n) SCROLLINFO war nicht statisch
danach hats soweit gefunzt!!Einen kleiner Makel des Scrollbar ist geblieben ich kann den
THUMB-caret oder wie auch immer nicht per Mausziehen handeln
Wie muss der Code beiSB_THUMBPOSITION
bzw.
SB_THUMBTRACK
aussehen damit der THUMB nach dem losslassen an der Stelle bleibt wo er ist?
der beliebt nicht auf der Position wenn ich dei Maustaste loslasse
alles ander funztmfg sclearscreen
-
BOOL CALLBACK TrafoDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; HRGN hrgn; static HPEN hpen; static POINT figur1 [5], figur2 [5]; HWND hwndHScroll; static SCROLLINFO scrollinfo; switch(message) { case WM_INITDIALOG: hwndHScroll = GetDlgItem(hwnd, IDS_HSCROLLBAR); scrollinfo.cbSize = sizeof(SCROLLINFO); scrollinfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; scrollinfo.nPage = 10; scrollinfo.nMin = -125; scrollinfo.nMax = 125; scrollinfo.nPos = 0; SetScrollInfo(hwndHScroll, SB_CTL, &scrollinfo, FALSE); SetScrollPos(hwndHScroll, SB_CTL, scrollinfo.nPos, TRUE); figur1[0].x = 55; figur1[0].y = 155; figur1[1].x = 55; figur1[1].y = 125; figur1[2].x = 150; figur1[2].y = 155; figur1[3].x = 245; figur1[3].y = 125; figur1[4].x = 245; figur1[4].y = 155; return TRUE; case WM_COMMAND: switch(LOWORD (wParam)) { case IDOK: case IDCANCEL: EndDialog(hwnd, 0); return TRUE; case IDR_LINKS: return TRUE; case IDR_HALT: return TRUE; case IDR_RECHTS: return TRUE; } break; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); if(scrollinfo.nPos < 0) { } else if(scrollinfo.nPos > 0) { } else { Polygon(hdc, figur1, 5); } EndPaint(hwnd, &ps); break; case WM_HSCROLL: hwndHScroll = GetDlgItem(hwnd, IDS_HSCROLLBAR); // Unterscheidung von verschiedenen Scrollbars if( ((HWND) lParam) == hwndHScroll) { scrollinfo.fMask = SIF_POS | SIF_TRACKPOS; GetScrollInfo(hwndHScroll, SB_CTL, &scrollinfo); switch(LOWORD (wParam)) { case SB_LINELEFT: if(scrollinfo.nTrackPos <= scrollinfo.nMin) scrollinfo.nPos = scrollinfo.nMin; else scrollinfo.nPos -= 1; break; case SB_LINERIGHT: if(scrollinfo.nTrackPos >= scrollinfo.nMax) scrollinfo.nPos = scrollinfo.nMax; else scrollinfo.nPos += 1; break; case SB_PAGELEFT: if(scrollinfo.nTrackPos <= scrollinfo.nMin) scrollinfo.nPos = scrollinfo.nMin; else scrollinfo.nPos -= scrollinfo.nPage; break; case SB_PAGERIGHT: if(scrollinfo.nTrackPos >= scrollinfo.nMax) scrollinfo.nPos = scrollinfo.nMax; else scrollinfo.nPos += scrollinfo.nPage; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: if(scrollinfo.nTrackPos <= scrollinfo.nMax) scrollinfo.nPos = scrollinfo.nMax; else if(scrollinfo.nTrackPos >= scrollinfo.nMin) scrollinfo.nPos = scrollinfo.nMin; else scrollinfo.nPos = scrollinfo.nTrackPos; break; default: break; } SetScrollPos(hwndHScroll, SB_CTL, scrollinfo.nPos, TRUE); InvalidateRect(hwnd, 0, TRUE); } break; } return FALSE; }
Alles andere geht nur das ziehen mit der Maus bei:
case SB_THUMBPOSITION: case SB_THUMBTRACK: if(scrollinfo.nTrackPos <= scrollinfo.nMax) scrollinfo.nPos = scrollinfo.nMax; else if(scrollinfo.nTrackPos >= scrollinfo.nMin) scrollinfo.nPos = scrollinfo.nMin; else scrollinfo.nPos = scrollinfo.nTrackPos; break;
funzt nicht!
was muss man da tun!?!!!?! Der slider, Thumb wie auch immer soll an der Stelle stehenbleiben an der man mit ziehen aufhört
wie in jeden Editor!!!mfg sclearscreen
-
Soll ich die Position des THUMB in dem Zweig abspeichern natürlich statisch
den Scrollbar dann zerstören -> neu generieren mit alter Thumbposition!?!Wenn ja ist dann noch was zu beachten da der Scrollbar in ner Resource von mir
definiert wurde, im bezug auf den Resourcenskript MOVEABLE oder DISCARDABLE!?!
Ich denke aber das diese Idee nicht gut ist da ich ja bei ziehen mit der Maus
durch das zerstören des Scrollbar dessen Focus verliere!!mfg
:p
-
1.)
static int iHorzScrollPos;
2.)
case SB_THUMBPOSITION: case SB_THUMBTRACK: iHorzScrollPos = HIWORD(wParam); // hier nicht -= | HIWORD(wParam) enthält ja die neue Position break;
3.)
case SB_ENDSCROLL: iHorzScrollPos = GetScrollPos(hwndHScroll,SB_CTL); // den 2. Parameter hattest du falsch gesetzt break;
Ich hab jetzt einfach mal deinen ersten Code genommen