ListBox draw items



  • Hi zusammen,

    bin neu hier im Forum und habe schon eine Frage.

    Habe eine ListBox mit dem Namen "TListBox *UnbearbeiteteSongs;"

    Jetzt würde ich gerne die Items selber drawen um ein bisschen flexibler zu sein.

    Habe folgenden Code gefunden, weis aber nicht wirklich wie ich den einbauen soll:

    private:
       void listBox1_DrawItem(Object* /*sender*/, System::Windows::Forms::DrawItemEventArgs* e)
       {
          // Set the DrawMode property to draw fixed sized items.
          listBox1->DrawMode = DrawMode::OwnerDrawFixed;
          // Draw the background of the ListBox control for each item.
          e->DrawBackground();
          // Create a new Brush and initialize to a Black colored brush by default.
          Brush* myBrush = Brushes::Black;
    
          // Determine the color of the brush to draw each item based on the index of the item to draw.
          switch (e->Index)
          {
          case 0:
             myBrush = Brushes::Red;
             break;
          case 1:
             myBrush = Brushes::Orange;
             break;
          case 2:
             myBrush = Brushes::Purple;
             break;
          }
    
          // Draw the current item text based on the current Font and the custom brush settings.
          e->Graphics->DrawString(
             listBox1->Items->Item[e->Index]->ToString(),
             e->Font, myBrush,
             RectangleF::op_Implicit(e->Bounds),
             StringFormat::GenericDefault);
          // If the ListBox has focus, draw a focus rectangle around the selected item.
          e->DrawFocusRectangle();
       }
    

    Das Problem ist, wie bekomme ich den DrawItemEventArgs hin. wenn ich einen Doppelklick auf meine ListBox in der Form mache, dann kommt ja nur:

    void __fastcall UnbearbeiteteSongsClick(TObject *Sender);

    und da fehlt ja der DrawItemEventArgs !!!

    Vielleicht kann mir jemand helfen, wie ich das hinbekomme!!!

    Danke Bench



  • Dann schau einfach mal in den Objektinspektor, Abteilung Events.



  • Hi,

    ok habe ich gemacht!
    Habe halt nur die Möglichkeit:

    void __fastcall TForm1::Test(TWinControl *Control, int Index, TRect &Rect,TOwnerDrawState State)

    Das ist halt die onDrawItem Methode!

    Aber wenn ich das Programm dann starte oder speichere, dann ist diese wieder weg!?!?!?!?!?!

    Warum?

    danke Bench



  • Hallo

    Zunächst einmal bezweifle ich das dein Codeauszug für den Builder ist. Die verwendeten Typen gibt es im Builder nicht.

    In den genannten Event must du natürlich auch irgendwas reinschreiben, damit den die IDE nicht wieder entfernt. Darein gehören die Zeichenoperation die du haben willst, basierend auf den Methoden von TCanvas. Weiteres kannst du in der BCB-Hilfe zum Draw-Event und zu TCanvas nachlesen. Auch in der FAQ hier im Forum gibt es einen Beitrag zum Zeichnen mit dem Draw-Event, da fürs StringGrid.

    bis bald
    akari



  • HI,

    also der borland c++ Builder 5 hat mir das ausgespuckt!
    danke jetzt bleibt die Funktion da...!!! 😃

    Was würdest du alternativ empfehlen??

    Kannst du mir vielleicht einen Code schicken?

    Danke Bench



  • Hi nochmals ich,

    also habe jetzt folgendes in der funktion:

    TColor LBColors[3] = {clBlue, clGreen, clRed}; 
          if(State.Contains(odSelected)) 
    		 {
    			UnbearbeiteteSongs->Canvas->Brush->Color = LBColors[Index];   // Hintergrundfarbe
    			UnbearbeiteteSongs->Canvas->Font->Color = LBColors[3-Index];  // Textfarbe
    		 }
    		else
    		{
    			UnbearbeiteteSongs->Canvas->Brush->Color = /*LBColors[3-Index]*/clGreen; // dito
    			UnbearbeiteteSongs->Canvas->Font->Color = /*LBColors[Index]*/clGreen;
    		}
    
    	 // Hintergrund zeichnen
    		UnbearbeiteteSongs->Canvas->FillRect(Rect);
    		// Text zeichnen
    		UnbearbeiteteSongs->Canvas->TextRect(Rect, Rect.Left, Rect.Top, UnbearbeiteteSongs->Items->Strings[Index]);
    
    		if(State.Contains(odFocused))
    	 	UnbearbeiteteSongs->Canvas->DrawFocusRect(Rect);
    

    Aber es passiert nichts!!!

    warum?

    Bench



  • Hallo

    Bench_XProjects schrieb:

    also der borland c++ Builder 5 hat mir das ausgespuckt!
    danke jetzt bleibt die Funktion da...!!! 😃

    Nein ich meine nicht den Code aus deinem zweiten Post, sondern den aus deinem ersten.

    Aber es passiert nichts!!!

    Der Code funktioniert soweit, die Einträge werden in meinem Test eingefärbt.
    Eventuell hast du vergessen die Eigenschaft Style der ListBox auf lbOwnerDrawFixed zu setzen?

    bis bald
    akari



  • Hi,

    du bist echt ein Freak!!!
    Genau das wars!!!!

    So, aber neues Problem: 😃

    Jetzt hängt sich das Programm auf. d.h es bounced immer hin und her!!
    es wird quasi immer grun und weiss im wechsel angezeigt!!

    wenn ich in die Listbox per UnbearbeiteteSongs->Items->Add("Eins");
    ein element hinzufüge, dann hängt er sich auf und bounced!

    wenn ich keins hinzufüge, dann nicht?

    An was liegt das?

    bench



  • Jetzt gehts!!!!! 😃

    Frage:

    Wie bekomm ich da ein Bild rein?????

    bench



  • Hallo

    Du kannst jedes TBitmap-Objekt in deinem Draw-Event mittels der Methode TCancas::Draw zeichnen lassen.

    bis bald
    akari



  • Hi,

    ok cool!

    Habe es jetzt mal so probiert:

    Graphics::TBitmap *tmp = new Graphics::TBitmap();
    UnbearbeiteteSongs->Canvas->Draw(0, 0, tmp);
    

    Jetzt sollte ich das Bittmap nur mal reinladen!

    Will nicht auf irgendwelche Bibliotheken zurückgreifen müssen!!!

    Soll ganz einfach und kurz sein!

    Quasi Fileangabe und ab gehts...!!!

    SChon mal vielen Dank!!

    Bench



  • so hets irgendwie nicht:

    Graphics::TBitmap *tmp = new Graphics::TBitmap();
    		tmp=LoadImage(NULL,"bg.bmp",IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    		UnbearbeiteteSongs->Canvas->Draw(0, 0, tmp);
    

    Da kommt:

    [C++ Fehler] Test1.cpp(95): E2034 Konvertierung von 'void *' nach 'TBitmap *' nicht möglich

    danke



  • Hallo

    Schau mal in der Builder-Hilfe nach der Methode TBitmap::LoadFromFile.

    (Es ist übrigens ungünstig bei jedem Draw-Event die Datei neu zu laden)

    bis bald
    akari



  • HI,

    ok hast Recht!!!
    Schreib ich noch um!!
    Schau mal in der Hilfe nach!!!

    Bench



  • Hi,

    jetzt nochmals ich!!

    Also bin jetzt so weit:

    void __fastcall TForm1::UnbearbeiteteSongs_OnDrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State)
    {
    
    		//Aktiv
    		if(State.Contains(odSelected))
    		 {
    			UnbearbeiteteSongs->Canvas->Brush->Color = clBlack;   // Hintergrundfarbe
    			UnbearbeiteteSongs->Canvas->Font->Color = clWhite;  // Textfarbe
    			UnbearbeiteteSongs->Canvas->Font->Size = 12;
    		 }else if(Index % 2 && !State.Contains(odFocused)) {
    			UnbearbeiteteSongs->Canvas->Brush->Color = clSilver;
    			UnbearbeiteteSongs->Canvas->Font->Color = clBlack;
    			UnbearbeiteteSongs->Canvas->Font->Size = 10;
    		 }else{
    			UnbearbeiteteSongs->Canvas->Brush->Color = clWhite;
    			UnbearbeiteteSongs->Canvas->Font->Color = clBlack;
    			UnbearbeiteteSongs->Canvas->Font->Size = 10;
    
    		 }
    
    		UnbearbeiteteSongs->Canvas->FillRect(Rect);// Hintergrund zeichnen
    		UnbearbeiteteSongs->Canvas->TextRect(Rect, Rect.Left, Rect.Top,UnbearbeiteteSongs->Items->Strings[Index]);  // Text zeichnen
    
    }
    

    Hab leider keinen Plan, wie ich da jetzt icons in die Listbox bringen kann!
    Also kleine Bildchen!!!

    HAbe schon endlos gegooglet und leider nichts passendes gefunden!!

    normalerweise solte es ja mit der Draw(); gehen!

    Aber da klappt bei mir irgendwie nicht!!

    Wäre um einen kleinen Code sehr dankbar!!!


Anmelden zum Antworten