Announcement

Collapse
No announcement yet.

Horiz. Scrollbalken für CheckListBox

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Horiz. Scrollbalken für CheckListBox

    Hi

    Ich möchte für meine CheckListBox einen horizontalen Scrollbalken.
    Ich habe diesen Code übernommen:
    Code:
    int MaxWidth = 0; 
    for (int i = 0 ; i < CheckListBox1->Items->Count ; i++) 
    { 
      MaxWidth = max(MaxWidth, 
      CheckListBox1->Canvas->TextWidth(CheckListBox1->Items->Strings[i])); 
    } 
    SendMessage(CheckListBox1->Handle, LB_SETHORIZONTALEXTENT, MaxWidth, 0);
    Dies funktioniert auch, nur wenn ich mit dem Balken zurückfahre, verschwinden manchmal die Häkchen bei den Checked-Einträgen. Kann man das beheben?

    greetz tacter
    Zuletzt editiert von tacter; 15.10.2007, 14:33.

  • #2
    Warum wird in dem Beispiel oben die Berechung der Breite für die CheckListBox1 mit Daten aus einer ListBox vorgenommen? Aus welcher??
    Christian

    Comment


    • #3
      Oops, sry, sollte natürlich CheckListBox1 heissen.

      Comment


      • #4
        Könnte das das Problem gewesen sein???
        Christian

        Comment


        • #5
          Nein, es ist immernoch wie vorher. Der Code sieht im Moment so aus:

          Code:
                          for(i=0;i<num_files;i++)
                          {
                                  // load the file
                                  int NameLength = DragQueryFile(HDrop, i, NULL, NULL) + 1;
                                  char *FileName = new char[NameLength];
                                  DragQueryFile(HDrop, i, FileName, NameLength);
                                  CheckListBox1->Items->Add(FileName);
                                  Form2->CheckListBox1->Checked[ilFilesBox+i]=true;
                                  delete [] FileName;
          
                                  if(CheckListBox1->Canvas->TextWidth(CheckListBox1->Items->Strings[i])>MaxWidth)
                                          MaxWidth=CheckListBox1->Canvas->TextWidth(CheckListBox1->Items->Strings[i]);
                          }
          
                          SendMessage(CheckListBox1->Handle, LB_SETHORIZONTALEXTENT, MaxWidth, 0);

          Comment


          • #6
            Bei jedem Schleifendurchlauf wird die Größe der Box berechnet und neu gesetzt.

            Versuch doch mal dir IN der Schleife den größten MaxWert einfach zu merken und NACH der Schleife die Breite einmal zu setzen.
            Christian

            Comment


            • #7
              Tut es doch, oder? SendMessage kommt nach der Schleife. In der Schleife wird nur geschaut, welches der grösste MaxWert ist.

              Comment


              • #8
                ok, dann fällt mit auch nix mehr ein, bei mir funktioniert es.

                Vielleicht noch eine
                CheckListBox1->Refresh() oder
                CheckListBox1->Update()

                nach dem Send
                Christian

                Comment


                • #9
                  Sie verschwinden nur wenn ich langsam scrolle, also die Kästchen aus dem Bild sind und ich dann zurückscrolle. Wenn ich ganz schnell zurückscrolle, sind sie noch da.

                  CheckListBox1->Refresh() oder
                  CheckListBox1->Update()
                  nützt nichts.

                  Comment


                  • #10
                    Hallo,

                    Originally posted by tacter View Post
                    CheckListBox1->Refresh() oder
                    CheckListBox1->Update()
                    nützt nichts.
                    Konnte das Verhalten nachvollziehen und auch beseitigen. Refresh() ist der richtige Weg, aber du darfst es natürlich nicht hinter deinem Code aufrufen (wäre ja sinnlos an der Stelle).
                    Du musst auf die Nachricht "WM_HSCROLL" reagieren, die an die CheckListBox gesendet wird. Und wenn diese Nachricht empfangen wird, rufst du Refresh() auf. Diese Lösung ist aber noch optimierungsbedürftig, da sie ganz schön an CPU saugt.
                    Mit freundlichen Grüßen,
                    Freiheit
                    ---
                    //don't question it ... it's clearly an optimization
                    ---
                    lafin.de lanmonitor.de

                    Comment


                    • #11
                      Danke! Es funktioniert. Jetzt flakert es einfach wenn man scrollt.
                      Stimmt, CPU von 0% auf 50% Auslastung =)

                      Comment

                      Working...
                      X