Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Listbox für Bilder
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

Listbox für Bilder

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

Du könntest doch die Listbox nehmen, dort Objekte erzeugen und mit einem Bild Icon versehen, welches das Bild darstellt.
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

Du meinst die ListView? Habe ich probiert, doch hat ein sehr unschönes verhalten. Kann ich also nicht nehmen.
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

Wie willst du es denn haben? Screenshot, etc..
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden


so in der art.
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

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*
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

Benützt du also die Liste vom Programm von welchem du den Link geschicht hast?
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

Nein das ist nur ein Beipspiel wie das aussehen könnte.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo michaelschuler,

hast du denn schon mal auf http://www.codeproject.com/ geguckt, ob die was passendes haben?
Zitat
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
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von herbivore
Zitat
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.

private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

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.ä.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

@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...
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Programmierhans,

nicht schlecht!

herbivore

PS: Im Testcode meinst du bestimmt *.bmp o.ä. statt *.*, gell?
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

Werds gleich ausprobieren,
dankeschön
private Nachricht | Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member



Dabei seit:
Beiträge: 329
Herkunft: Zürich, Schweiz

Themenstarter:

beantworten | zitieren | melden

Funktioniert perfekt...
*freu*
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat
Original von michaelschuler
Funktioniert perfekt...
*freu*

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
private Nachricht | Beiträge des Benutzers
-acid-
myCSharp.de - Member



Dabei seit:
Beiträge: 885
Herkunft: Hessen

beantworten | zitieren | melden

Also schlussendlich ist es genau das was ich ihm vermitteln wolte *g* Er sollte einfach die Bilder als Item übergeben
private Nachricht | Beiträge des Benutzers
mogli73
myCSharp.de - Member



Dabei seit:
Beiträge: 92

beantworten | zitieren | melden

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??
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Hallo mogli73,
Zitat von 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.
private Nachricht | Beiträge des Benutzers
mogli73
myCSharp.de - Member



Dabei seit:
Beiträge: 92

beantworten | zitieren | melden

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???
private Nachricht | Beiträge des Benutzers
winSharp93
myCSharp.de - Experte

Avatar #avatar-2918.png


Dabei seit:
Beiträge: 5.742
Herkunft: Stuttgart

beantworten | zitieren | melden

Zitat von mogli73
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.
private Nachricht | Beiträge des Benutzers
mogli73
myCSharp.de - Member



Dabei seit:
Beiträge: 92

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
mogli73
myCSharp.de - Member



Dabei seit:
Beiträge: 92

beantworten | zitieren | melden

Ist ein gutes Argument.

Aber zerst muss es mal funktionieren...
private Nachricht | Beiträge des Benutzers
el_vital
myCSharp.de - Member



Dabei seit:
Beiträge: 346

beantworten | zitieren | melden

Ist es möglich die ImageListBox auf die Form einer WPF Anwendung zu bringen?
private Nachricht | Beiträge des Benutzers