31. juli 2003 - 12:47Der 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...
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
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(
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......
"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.
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:
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.