Laden...

Listbox für Bilder

Erstellt von Michael Schuler vor 18 Jahren Letzter Beitrag vor 14 Jahren 37.648 Views
M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren
Listbox für Bilder

Hallo Community

Kennt jemand von euch ein gutes Control um Bilder darzustellen? Es würde mir sogar Source Code reichen. Die Listbox zeige ich in einem Form auf der rechten Seite an und ist nur ca. 200px breit. Ich versuchte mir ein Control zu basteln welches von ListBox erbt, doch versagte ich kläglich 🙁

Danke für eure Hilfe
LG

Michael

-
885 Beiträge seit 2004
vor 18 Jahren

Du könntest doch die Listbox nehmen, dort Objekte erzeugen und mit einem Bild Icon versehen, welches das Bild darstellt.

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Du meinst die ListView? Habe ich probiert, doch hat ein sehr unschönes verhalten. Kann ich also nicht nehmen.

-
885 Beiträge seit 2004
vor 18 Jahren

Wie willst du es denn haben? Screenshot, etc..

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren


so in der art.

-
885 Beiträge seit 2004
vor 18 Jahren

Ja das ist doch sau easy 😉

Nimm die ListBox, stell sie auf LargeIcons, verknüpf das mit ner ImageList und weise den Bildern einen Index dieser ImageListe zu (geht auch dynamisch). Fertig - hab ich vor einer Woche gebastelt - Zufälle gibts gg

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Du meinst die ListView, nicht die ListBox. Habe ich ja ausprobiert, doch will ich nicht nur Bilder anzeigen von der Grösse von 32x32 sondern auch grössere bilder (200x150) aber dann wird das verhalten sehr unschön.

-
885 Beiträge seit 2004
vor 18 Jahren

Ja hast recht. 4848 geht glaub ich auch noch. Hm. bei der Größe... also dann lade sie doch direkt in die Liste...

siehe: http://www.chip.de/downloads/c1_downloads_12993900.html

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Benützt du also die Liste vom Programm von welchem du den Link geschicht hast?

-
885 Beiträge seit 2004
vor 18 Jahren

Nein das ist nur ein Beipspiel wie das aussehen könnte.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo michaelschuler,

hast du denn schon mal auf http://www.codeproject.com/ geguckt, ob die was passendes haben?

Es würde mir sogar Source Code reichen.

Du bist lustig. Der Source-Code ist doch leider oft das, was man braucht und nicht kriegt.

herbivore

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Original von herbivore

Es würde mir sogar Source Code reichen.
Du bist lustig. Der Source-Code ist doch leider oft das, was man braucht und nicht kriegt.

😉 ich dachte bei meiner anfangsfragestellung, jemand habe ein control für mich.
codeprojekt habe ich schon abgeklappert, habe nichts passendes gefunden.

🙁

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo michaelschuler,

ist eine Liste mit großen Bildern nicht sowieso unpraktisch? Mach doch eine mit kleinen Bildern und wenn man drauf klickt, erscheint daneben in einer PictureBox das Bild in Originalgröße.

herbivore

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

In meinem Fall nein. Resp. es ist ja eine Liste mit kleinen Bildern, nur stelle ich mir unter "klein" nicht max 48px vor, sondern vielleicht 150 o.ä.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo michaelschuler,

dann sollte es relativ leicht mit einer OnwerDraw-ListBox gehen. Habe leider keinen Code. Aber du brauchst ja im Prinzip nur eine Zeichenanweisung (Graphics.DrawImage), um das jeweilige Bild in einem Rutsch in das jeweilige Item zu zeichnen.

herbivore

4.221 Beiträge seit 2005
vor 18 Jahren

@hebivore

Ich habe meinen Code leider auch nicht mehr gefunden... da man sowas aber immer mal wieder brauchen kann hab ich mal kurz ein neues gepinselt 😁


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

namespace ImageListBox
{
	/// <summary>
	/// ImageListBox malt schöne Bildchen
	/// wenn man als Items voll referenzierte Pfade zu Bildern liefert,
	/// welche mit ImageFromFile geladen werden können.
	/// 
	/// Exceptions werden direkt in der ListBox angezeigt !!
	/// 
	/// Erstellt durch: Programmierhans
	/// Art:            Freeware
	/// Zeitaufwand:	20 Minuten (wobei die Thumb-Methode schon existiert hat)
	/// </summary>
	public class ImageListBox : ListBox
	{
		public ImageListBox():base()
		{
			this.DrawMode=DrawMode.OwnerDrawFixed;
		}

		protected override void OnDrawItem(DrawItemEventArgs e)
		{
			base.OnDrawItem(e);
			if (e.Index>-1 && this.Items.Count>e.Index)
			{
				object itm=this.Items[e.Index];
				if (itm!=null)
				{
					string fileName=itm.ToString();
					if (System.IO.File.Exists(fileName))
					{
						Image img=null;
						try
						{
							img=Image.FromFile(fileName);
							if (img!=null)
							{
								Graphics g=e.Graphics;
								Image img2=this.GetThumbnail(img,e.Bounds);
								g.DrawImageUnscaled(img2,e.Bounds);
							}
						}
						catch (Exception ex)
						{
							Graphics g=e.Graphics;
							StringFormat sf=new StringFormat();
							sf.Trimming=StringTrimming.EllipsisCharacter;
							string message=string.Format("{0} konnte nicht geladen werden. Exception: {1}",fileName,ex.ToString());
							g.DrawString(message,this.Font,new SolidBrush(this.ForeColor),e.Bounds,sf);
						}
					}
				}
			}
		}
		
		private Image GetThumbnail(Image pImage, Rectangle pBounds)
		{
			Image ret=new Bitmap(pBounds.Width,pBounds.Height);
			Graphics g=Graphics.FromImage(ret);
			g.FillRectangle(new SolidBrush(Color.White),0,0,ret.Width,ret.Height);
            
			float factor = Math.Max ((float)pImage.Width/(float)pBounds.Width, (float)pImage.Height/(float)pBounds.Height);
			g.DrawImage(pImage,0,0,(float)pImage.Width/factor,(float)pImage.Height/factor);
			g.Dispose();
            
			return ret;
		}

	}
}


und ein wenig TestCode dazu:


		private void Form1_Load(object sender, System.EventArgs e)
		{
			//Höhe der Items festlegen (die Breite floatet)
			this.imageListBox1.ItemHeight=80;

			string windir = System.Environment.GetEnvironmentVariable ("SystemRoot");
			string[] files=System.IO.Directory.GetFiles(windir,"*.bmp");
			foreach (string file in files)
			{
				this.imageListBox1.Items.Add(file);
			}
		}


Viel Vergnügen beim spielen 🙂

Edit: . durch *.bmp ersetzt

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Programmierhans,

nicht schlecht!

herbivore

PS: Im Testcode meinst du bestimmt *.bmp o.ä. statt ., gell?

4.221 Beiträge seit 2005
vor 18 Jahren

Original von herbivore

PS: Im Testcode meinst du bestimmt *.bmp o.ä. statt ., gell?

Ja natürlich 🙂 .... war noch ein Ueberbleibsel der Exception-Tests...

Habs im Beitrag korrigiert.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Werds gleich ausprobieren,
dankeschön 😁

M
Michael Schuler Themenstarter:in
329 Beiträge seit 2004
vor 18 Jahren

Funktioniert perfekt...
*freu*

4.221 Beiträge seit 2005
vor 18 Jahren

Original von michaelschuler
Funktioniert perfekt...
*freu*

😁

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

-
885 Beiträge seit 2004
vor 18 Jahren

Also schlussendlich ist es genau das was ich ihm vermitteln wolte g Er sollte einfach die Bilder als Item übergeben 🙂

M
92 Beiträge seit 2007
vor 15 Jahren

Der Code von Progrmmierhans läuft bei mir nicht.

Wenn ich ihn via Copy Paste einfüge, meldet der Compiler


this.imageListBox.ItemHeight=80;

"WindowsApplication1.Form1" enthält keine Definition für "imageListBox".

ja, ich habe auch kein Steuerelement "imageListBox".
Was mach ich falsch??

5.742 Beiträge seit 2007
vor 15 Jahren

Hallo mogli73,

"WindowsApplication1.Form1" enthält keine Definition für "imageListBox".

ja, ich habe auch kein Steuerelement "imageListBox".
Was mach ich falsch??

Du musst natürlich ein solches Steuerelement in deiner Form haben!?!

Codebeispiele setzten meist eine gewisse Eigeninitiative voraus - lauffähige Beispiele stellen sie nur in den seltensten Fällen dar.
Und das ist auch gut so.

M
92 Beiträge seit 2007
vor 15 Jahren

das ist mir schon klar...

aber das betreffende Control ist eine eigenkreation von Programmierhans...


public class ImageListBox : ListBox

die Frage ist: Wie verweise ich darauf? oder muss ich mittels dll-Datei ein solches Control herstellen, in die Toolbox aufnehmen und dann auf die Form ziehen???

5.742 Beiträge seit 2007
vor 15 Jahren

Wie verweise ich darauf? oder muss ich mittels dll-Datei ein solches Control herstellen, in die Toolbox aufnehmen und dann auf die Form ziehen???

Das ist eine Möglichkeit (so ziemlich die komplizierteste).

Am einfachsten wird sein, das Projekt einmal zu kompilieren; dann sollte das Control automatisch in der Toolbox erscheinen.

Auch kannst du das Control "manuell" (ohne Designer) erstellen und der Control Collection der Form hinzufügen.

M
92 Beiträge seit 2007
vor 15 Jahren

funktioniert leider auch nicht.

Ich kopiere die ganze Klasse

[EDIT=herbivore]Hier stand unnötigerweise eine Kopie des Code von Programmierhans von public class ImageListBox : ListBox { bis zur zugehören geschweiften Klammer zu.[/EDIT]

in eine neue Win-Form und drücke F6 => in der Toolbox entsteht kein neues Control.

Auch die 2. Version klappt nicht => Im Formdesigner kann ich auf die public class ImageListBox nicht zugreiffen...

5.299 Beiträge seit 2008
vor 15 Jahren

Hi!

Ich würde das eh sehr mit Vorsicht genießen.
Wennichrechtverstehe wird beim Zeichen-Vorgang für jedes zu zeichnende Item jedesmal die BildDatei geöffnet, und ein Thumbnail daraus generiert, und dieses gemalt.

Das müsste höllisch flackern, und die Festplatte voll ans rödeln kriegen, wenn man ein anderes Fenster darüber hinweg-zieht (viele Zeichenvorgänge).

M.E. müsste man die Thumbnails iwie cachen und wiederverwenden.

Der frühe Apfel fängt den Wurm.

M
92 Beiträge seit 2007
vor 15 Jahren

Ist ein gutes Argument.

Aber zerst muss es mal funktionieren... 🙁

E
346 Beiträge seit 2007
vor 14 Jahren

Ist es möglich die ImageListBox auf die Form einer WPF Anwendung zu bringen?

5.742 Beiträge seit 2007
vor 14 Jahren

Ist es möglich die ImageListBox auf die Form einer WPF Anwendung zu bringen?

WTF!!!
Also Entschuldigung - da fällt mir wirklich nicht mehr mehr ein 😉

Mit der WPF dauert die Erstellung eines solchen Controls keine halbe Minute!
Was willst du da mit einer WinForms Version?

E
346 Beiträge seit 2007
vor 14 Jahren

ich möchte Ordner auswählen und die dort enthaltene Bilder anzeigen. Meine Kenntnisse in WPF sind wohl zu schlecht. Alle Bücher schneiden nur die Grundlagen an und ich habe noch nicht verstanden wie ich so etwas damit schnell realisieren kann. Besonders nicht mit XAML.

5.742 Beiträge seit 2007
vor 14 Jahren

Ein sehr pragmatischer Ansatz:


<ListBox Name="listBox">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type System:String}">
            <Image Width="100"
                   Height="100"
                   Source="{Binding Path=.}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Beispiel für die Verwendung:


List<string> files = new List<string>();
files.AddRange(Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures"));

this.listBox.ItemsSource = files;

E
346 Beiträge seit 2007
vor 14 Jahren

danke winSharp93. So etwas funktioniert ja wirklich einfach.
Nur folgendes mußte ich löschen: DataType="{x:Type System:String}
Das wird von dem Compiler nicht akzeptiert.

5.742 Beiträge seit 2007
vor 14 Jahren

DataType="{x:Type System:String}
Das wird von dem Compiler nicht akzeptiert.

Achso - da fehlt nur eine entsprechende xmlns Anweisung.