Jak do listBoxa dodać obrazki?

2012-09-07 12:02
0

Jak to zrobić? Czy może nie da się i trzeba wykorzystać listView


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899

Pozostało 580 znaków

2012-09-07 12:10
0
maszynaz napisał(a)

Jak do listBoxa dodać obrazki?

Zależy w jakim sensie; Jeśli chodzi Ci o umieszczenie obrazu zamiast normalnego tekstu to masz przecież coś takiego jak kanwa (ang. Canvas) i możliwość rysowania po niej w zdarzeniu OnDrawItem czy podobnie nazwanych (nie piszę w C# więc nazewnictwa nie znam, stąd może się różnić od podanego przeze mnie); Najpierw jednak trzeba dostosować właściwości kontrolki (chociażby wysokość pozycji, pewnie ItemHeight i na pewno OwnerDraw);

maszynaz napisał(a)

Czy może nie da się i trzeba wykorzystać listView

Wszystko się da, tylko trzeba wiedzieć jak; W TListView też się da - zdarzenia praktycznie takie same, ale do własnego rysowania itemów masz kilka (zwykłe i rozszerzone - do bardziej zaawansowanych rzeczy);

Zastanów się z którego komponentu chcesz korzystać i przede wszsytkim poczytaj o OwnerDraw i właściwościach Canvas z jakiegokolwiek kursu;


ale ja nie chcę rysować po canvasie bo takie dodawanie małej ikonki na pewno można dodać jakąś gotową metodą. Tylko jak?... - maszynaz 2012-09-07 12:12
Ale jakiej małej ikonki i jaką gotową metodą? Masz metodę (?) Canvas.Draw() do malowania gotowej grafiki z obiektu; Napisz w poście dokładniej jaki efekt Cię interesuje; - furious programming 2012-09-07 12:16
każdy wiersz ma wyglądać tak "malutki_obrazek tekst". Obrazek będzie miał około 16 pikseli x 16 pikseli. - maszynaz 2012-09-07 12:25
No to musisz skorzystać ze zdarzenia OnDrawItem i ręcznie go narysować, uprzednio ustawiając odpowiednią wielkość pozycji i ilość kolumn w kontrolce; - furious programming 2012-09-07 12:32

Pozostało 580 znaków

2012-09-07 12:26
2

ustawić listBox1.DrawMode na OwnerDrawVariable

        public Form1()
        {
            InitializeComponent();

            listBox1.Items.Add(Bitmap.FromFile(@"c:\a.png"));
            listBox1.Items.Add(Bitmap.FromFile(@"c:\b.png"));
            listBox1.Items.Add(Bitmap.FromFile(@"c:\c.png"));
        }

        private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
        {
            Bitmap bmp = ((ListBox)sender).Items[e.Index] as Bitmap;
            e.ItemHeight = bmp.Height;
            e.ItemWidth = bmp.Width;
        }

        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            Bitmap bmp = ((ListBox)sender).Items[e.Index] as Bitmap;
            e.Graphics.DrawImage(bmp, e.Bounds.Left, e.Bounds.Top);
            e.DrawFocusRectangle();
        }

PS. Następne pytanie będzie brzmiało „a jak teraz dodać tekst”. Postaraj się, dojdź czasem do czegoś samemu…

edytowany 2x, ostatnio: Azarien, 2012-09-07 12:29

Pozostało 580 znaków

2012-09-07 12:37
0

dlaczego rozsmarowuje mi obrazek na cały listbox?


"Wszystko co może być wynalezione, zostało wynalezione"
Charless H. Duell - komisarz urzędu patentowego U.S., 1899
edytowany 5x, ostatnio: maszynaz, 2012-09-07 13:46

Pozostało 580 znaków

2012-09-07 15:36
1
maszynaz napisał(a)

dlaczego rozsmarowuje mi obrazek na cały listbox?

Bo pewnie wykorzystujesz kanwę kontrolki, a nie danej pozycji;
Wykorzystaj argument DrawItemEventArgs e tak, jak zrobił to @Azarien;


edytowany 3x, ostatnio: furious programming, 2012-09-07 15:37

Pozostało 580 znaków

2012-09-07 20:02
1

Do zwykłego ListBoxa nie da się dodać obrazka, ale możesz napisać własną klasę dziedziczącą po ListBox i zdefiniować w niej operator.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace ConsoleApplication19
{
    class Program
    {
        static void Main(string[] args)
        {
            MerkuryListBox slb = new MerkuryListBox();
            Image img = new Bitmap(800, 600);

            int wynik = slb + img;
            Console.WriteLine(wynik);
            Console.ReadLine();
        }
    }

    public class MerkuryListBox : ListBox
    {
        public static int operator +(MerkuryListBox listBox, Image image)
        {
            return 666;
        }
    }
}

"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."
edytowany 1x, ostatnio: somekind, 2012-09-07 20:13

Pozostało 580 znaków

2012-09-07 20:38
0
somekind napisał(a)

Do zwykłego ListBoxa nie da się dodać obrazka, ale możesz napisać własną klasę dziedziczącą po ListBox i zdefiniować w niej operator.

A nie ma takiej metody jak AddObject w Pascal'u? Tam można pakować różne obiekty, nie tylko obrazki;


Niestety dodając do listy obrazek jako obiekt jest problem ze zdarzeniem OnMeasureItem - najpierw ustalany jest rozmiar itema w tym zdarzeniu, a dopiero po tym tworzony jest obiekt; Być może w nowszych środowiskach niż D7 jest to inaczej zaplanowane;


Metodę ListBox.AddObject można wykorzystać np. tak:

procedure TForm1.FormCreate(Sender: TObject);
begin
  with lbSquares.Items do
    begin
      AddObject('Square', TBitmap.Create());
      (Objects[Count - 1] as TBitmap).LoadFromFile('Square.bmp');

      AddObject('Square 2', TBitmap.Create());
      (Objects[Count - 1] as TBitmap).LoadFromFile('Square2.bmp');
    end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  I: Word;
begin
  for I := 0 to lbSquares.Items.Count - 1 do
    lbSquares.Items.Objects[I].Free();
end;

procedure TForm1.lbSquaresDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  with lbSquares.Canvas do
    begin
      if odSelected in State then
        begin
          Pen.Color := clBlack;
          Brush.Color := clBlack;
        end
      else
        begin
          Pen.Color := clWhite;
          Brush.Color := clWhite;
        end;

      Rectangle(Rect);
      Draw(Rect.Left + 2, Rect.Top + 2, (lbSquares.Items.Objects[Index] as TBitmap));

      if odFocused in State then
        begin
          Pen.Color := Pen.Color xor $FFFFFF;
          DrawFocusRect(Rect);
        end;
    end;
end;

Pliki:

Square.bmp:
Square.png

Square2.bmp:
Square2.png

Efekt wykorzystania powyższego kodu:

Result.png

W załączniku kod programu i plik wykonywalny;


edytowany 5x, ostatnio: furious programming, 2012-09-07 21:33
Ale co robi niby to AddObject i gdzie tego można użyć? No, i nie jest to operator +. ;) - somekind 2012-09-07 21:08
Żartujesz ze mnie, czy naprawdę chcesz wiedzieć...? - furious programming 2012-09-07 21:09
Nie żartuję, nie znam Pascala, więc pytam, żeby móc odpowiedzieć na Twoje pytanie, czy nie ma takiej metody. :) - somekind 2012-09-07 21:10
Zaraz Ci napiszę przykład użycia :P - furious programming 2012-09-07 21:13

Pozostało 580 znaków

2012-09-08 08:48
0

Do zwykłego ListBoxa nie da się dodać obrazka
A co ja niby pokazałem, bez dziedziczenia?

A nie ma takiej metody jak AddObject w Pascal'u? Tam można pakować różne obiekty, nie tylko obrazki;
Czy naprawdę nikt nie czyta moich postów?
To mogę przestać pisać…

edytowany 1x, ostatnio: Azarien, 2012-09-08 08:48
Faktycznie, nieuważnie analizowałem Twój kod - on przecież wszystko wyjaśnia... :) - furious programming 2012-09-08 13:29

Pozostało 580 znaków

Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0