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ügen 😋 wä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 bei

    SB_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 funzt 🙂 😞

    mfg 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 😉


Anmelden zum Antworten