Avatar billede mcgoat Nybegynder
31. juli 2003 - 12:47 Der er 13 kommentarer og
2 løsninger

Billede i en ListBox?

Nogen der har en stump kode til hvordan man kan sætte et billede som baggrund i en listbox? jeg har selv en kode, men det kommer i forgrunden og ikke i baggrunden, så man kan ikke se de items der er...

Anyone???
Avatar billede jpk Nybegynder
31. juli 2003 - 12:49 #1
Hvilket udviklingsmiljø?
Avatar billede mcgoat Nybegynder
31. juli 2003 - 12:53 #2
Ah... hehe... Borland C++ Builder5
Avatar billede jpk Nybegynder
31. juli 2003 - 12:58 #3
Bruger selv VC++...

Jeg kunne forestille mig det kunne gøres ved WM_ERASEBKGND, hvordan gør du det nu?
Avatar billede mcgoat Nybegynder
31. juli 2003 - 13:08 #4
Graphics::TBitmap* Bitmap = new Graphics::TBitmap();
Bitmap->LoadFromFile("D:\\test.bmp");
ListBox1->Canvas->Brush->Bitmap = Bitmap;
ListBox1->Canvas->FillRect(Rect(0, 0, 100, 100));
ListBox1->Canvas->Brush->Bitmap = NULL;
delete Bitmap;

Men så kan man ikke se alle de items der er i ListBox
Avatar billede segmose Nybegynder
31. juli 2003 - 13:09 #5
Du kan måske bruge følgende som inspiration:

Here is a typical handler for an OnDrawItem event. In the example, a list box with the lbOwnerDrawFixed style draws a bitmap to the left of each string.

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

{
  Graphics::TBitmap *pBitmap; // temporary variable for item’s bitmap
  int    Offset = 2;  // default text offset width
  // note that we draw on the listbox’s canvas, not on the form
  TCanvas *pCanvas = ((TListBox *)Control)->Canvas;
  pCanvas->FillRect(Rect); // clear the rectangle

  pBitmap = (Graphics::TBitmap *)((TListBox *)Control)->Items->Objects[Index];
  if (pBitmap)
  {
    pCanvas->BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, pBitmap->Width, pBitmap->Height), pBitmap, Bounds(0, 0, pBitmap->Width, pBitmap->Height), clRed); // render bitmap
    Offset += pBitmap->Width + 4;  // add four pixels between bitmap and text
  }
  // display the text

  pCanvas->TextOut(Rect.Left + Offset, Rect.Top, ((TListBox *)Control)->Items->Strings[Index]);
}
Avatar billede segmose Nybegynder
31. juli 2003 - 13:11 #6
> mcgoat
Så skal man vel bare tegne bitmappet før itemsne tegnes, det burde løse det problem.
Avatar billede mcgoat Nybegynder
31. juli 2003 - 13:16 #7
Nahh, har jeg prøvet, det bliver også noget gnu...
Tror snart jeg har prøvet alt, har også set andre har haft det problem, men ikke har fundet en løsning på det :o(
Avatar billede borrisholt Novice
31. juli 2003 - 14:14 #8
Min c++ er vist lidt rustent ....

Jeg er ved at lave en listbox til dig. Kan en ikke lige svare mig på hvordan jeg overstyrer constructoren :

  class TPictureListBox : public TListBox
  {
  protected :
  public :
    Graphics::TBitmap *pBitmap;
    __fastcall TPictureListBox(TComponent* Owner);

} *PictureListBox;



  __fastcall TPictureListBox::TPictureListBox(TComponent* Owner)
  {
    pBitmap = new Graphics::TBitmap();
  }
Avatar billede borrisholt Novice
31. juli 2003 - 14:17 #9
Kom selv i tanke om det
  __fastcall TPictureListBox::TPictureListBox(TComponent* Owner) : TListBox(Owner)

Jens B
Avatar billede borrisholt Novice
31. juli 2003 - 14:34 #10
her er lidt at starte på


  class TPictureListBox : public TListBox
  {
  protected :
    void __fastcall EraseBkg(TMessage& Msg);
  public :
    Graphics::TBitmap *pBitmap;
    __fastcall TPictureListBox(TComponent* Owner);


    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER( WM_ERASEBKGND,TMessage,EraseBkg );
    END_MESSAGE_MAP(TListBox)

  } *PictureListBox;


  void __fastcall TPictureListBox::EraseBkg (TMessage& Msg)
  {
    BitBlt(Canvas->Handle, 0, 0, Width, Height, pBitmap->Canvas->Handle, 0, 0, SRCCOPY);
  }

  __fastcall TPictureListBox::TPictureListBox(TComponent* Owner) : TListBox(Owner)
  {
    pBitmap = new Graphics::TBitmap();
  }



void __fastcall TForm1::FormCreate(TObject *Sender)
{
  PictureListBox = new TPictureListBox(this);
  PictureListBox->Width = 200;
  PictureListBox->Height = 200;
  PictureListBox->pBitmap->Assign(Image1->Picture);
  PictureListBox->Parent = this;
  PictureListBox->Items->LoadFromFile("Unit1.cpp");
}
Avatar billede mcgoat Nybegynder
01. august 2003 - 17:57 #11
Det gør stadig det samme...
Teksten den adder bliver med hvid baggrund og ikke gennemsigtig.
Og når man trykker på en linie i listboksen bliver billedet hvidt på den linie... :o( totalt weird... kan måske slet ikke lade sig gøre......
Avatar billede borrisholt Novice
03. august 2003 - 10:49 #12
"her er lidt at starte på" skrev jeg og IKKE "her er en færdig løsning". Det der med tekst baggrunden troede jeg du kunne løse selv. Eller retter gad at surfe e ntur på nettet efter.

Jens B
Avatar billede soepro Nybegynder
05. august 2003 - 09:55 #13
mcqoat >> Jeg kender ikke til nogen måde hvorpå du kan få eet billede til at dække hele baggrunden af list-boxen - men du kan få tegnet et billede i hver linie, foran teksten eller "bagved" som du udtrykker det.

Du skal bruge det såkaldte 'OwnerDraw' i list-boxen:

1) Sæt 'Style' til lbOwnerDrawFixed (alle linier fylder lige meget) eller lbOwnerDrawVariable (Hver linie fylder det som er krævet aht. billedet.)

2) Lav en 'OnDrawItem' event i stil med:
void __fastcall TForm1::lblEventDrawItem(TWinControl *Control, int Index,
      TRect &Rect, TOwnerDrawState State)
{
  // "Extract" the bitmap, and draw it -along with the accompanying
  // text- in the designated rectangle.
  Graphics::TBitmap *tmpBmp = dynamic_cast<Graphics::TBitmap *>(lbEvent->Items->Objects[Index]);
  tmpBmp->Width = 16;
  lbEvent->Canvas->Draw(Rect.Left, Rect.Top + 2, tmpBmp);
  lbEvent->Canvas->TextOut(Rect.Left + tmpBmp->Width + 2, Rect.Top + 2,
                          lbEvent->Items->Strings[Index]);
} // lbEventDrawItem

Jeg har her benyttet mig af at man kan added både en tekst og et object til hver linie i list-boksen:

  if (tblEvent->Active)
  {
    lbEvent->Clear();
    tblEvent->First();
    while (!tblEvent->Eof)
    {
      eventDesc = tblEvent->FieldByName("DateStart")->AsString
                + " " + tblEvent->FieldByName("TimeStart")->AsString
                + " " + tblEvent->FieldByName("ShortDesc")->AsString;
      switch (tblEvent->FieldByName("EventType")->AsInteger)
      {
        case 6 : // Payment
                lbEvent->Items->AddObject(eventDesc, legendPayment->Picture->Graphic);
                break;
        case 5 : // Invoice
                lbEvent->Items->AddObject(eventDesc, legendInvoice->Picture->Graphic);
                break;
        case 4 : // Visit.
                lbEvent->Items->AddObject(eventDesc, legendVisit->Picture->Graphic);
                break;
        case 3 : // Mail.
                lbEvent->Items->AddObject(eventDesc, legendMail->Picture->Graphic);
                break;
        case 2 : // Fax.
                lbEvent->Items->AddObject(eventDesc, legendFax->Picture->Graphic);
                break;
        case 1 : // Phone
                lbEvent->Items->AddObject(eventDesc, legendPhone->Picture->Graphic);
                break;
        default: // Other
                lbEvent->Items->AddObject(eventDesc, legendOther->Picture->Graphic);
                break;

      }; // Eventtype
      tblEvent->Next();
    }; // All events.

3) Lave en 'OnMeasureItem' event:
void __fastcall TfrmCard::lbEventMeasureItem(TWinControl *Control,
      int Index, int &Height)
{
  // Size this listbox item to be able to hold the selected bitmap.
  // (Occurs after graphic has been added to the box - before it is
  // drawn)
  int bmpHeight = dynamic_cast<Graphics::TBitmap *>(lbEvent->Items->Objects[Index])->Height + 2;
  if (bmpHeight > Height)
    Height = bmpHeight;
} // lbEventMeasureItem

Disse tre ting giver tilsammen en tegning af et billede *FORAN* den ønskede tekst. Hvis du vil have billedet bag teksten, skal du blot ændre koordinaterne på TextOut'en i 'OnDrawItem' event'en sådan at teksten skrives samme sted som billedet blev tegnet:

  lbEvent->Canvas->TextOut(Rect.Left + 2, Rect.Top + 2,
                          lbEvent->Items->Strings[Index]);
Avatar billede mcgoat Nybegynder
05. august 2003 - 12:23 #14
Prøver når jeg kommer hjem... Borrisholt, lav et svar så jeg kan acceptere jeg begge :o)
Avatar billede borrisholt Novice
05. august 2003 - 13:00 #15
:-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester