Laden...

ImageListBox

Erstellt von Programmierhans vor 18 Jahren Letzter Beitrag vor 18 Jahren 15.189 Views
Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren
ImageListBox

Falls wer ne ImageListBox sucht hab ich Code in einem anderen Thread gepostet

Listbox für Bilder

So was wäre doch was für die Komponentensammlung .....

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

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren
ImageListBox mit GdiPlus

So nun habe ich das laden der Bilder mal auf GdiPlus umgestellt....

Jetzt müssten eigentlich mehr Formate erkannt werden !


using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
using System.Runtime.InteropServices;

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
	/// 
	/// Erweiterung:	Bilder werden nun mit GdiPlus geladen (mehr Formate / und schneller)
	/// </summary>
	public class ImageListBox : ListBox
	{
		/// <summary>
		/// Default Constructor
		/// </summary>
		public ImageListBox():base()
		{
			this.DrawMode=DrawMode.OwnerDrawFixed;
		}

		/// <summary>
		/// Draws the Item (Image)
		/// </summary>
		/// <param name="e">the DrawItemEventArgs</param>
		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
						{
							//Image per GdiPlus laden (x-Formate)
							img=LoadImage(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);
						}
					}
				}
			}
		}
		
		/// <summary>
		/// Returns a resized Image
		/// </summary>
		/// <param name="pImage">the original Image</param>
		/// <param name="pBounds">the Bounds of the new Image</param>
		/// <returns></returns>
		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;
		}

		[DllImport("gdiplus.dll", CharSet=CharSet.Unicode)]
		private static extern int GdipLoadImageFromFile(string filename, out IntPtr image);

		/// <summary>
		/// Loads a Image from File using GdiPlus
		/// </summary>
		/// <param name="pFileName">the FileName</param>
		/// <returns>the Image or null</returns>
		public static Image LoadImage(string pFileName)
		{
			IntPtr ptrImage = IntPtr.Zero;
			GdipLoadImageFromFile(pFileName, out ptrImage);
			if (ptrImage==IntPtr.Zero)
			{
				return null;
			}
			else
			{
				return (Bitmap) typeof(Bitmap).InvokeMember("FromGDIplus", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, new object[] { ptrImage });
			}
		} 
	}
}


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

S
125 Beiträge seit 2005
vor 18 Jahren

Hi Programmierhans.

Soweit ich das probiert hab geht das nicht mit *.tga-Files.

Schade, da es mir viel gebracht hätte. Brauch das für einen MapEditor. 🙁
Vielleicht haste ja noch ne andere Idee. =)

PS: Welche Formate werden standardmäßig unterstützt und welche mit deiner Methode??? ?(

cu SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren

Meine Methode sollte eigentlich mindestens folgendes unterstützen:

Bitmap file (.bmp)|.bmp|TIFF file (.tif)|.tif|JPEG file (.jpg)|.jpg|PNG file (.png)|.png|GIF file (.gif)|.gif

Und oh peinlich ich weiss gar nicht was im Standard alles unterstützt wird.

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

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren

Für PowerPoint wird ein
TrueVision Targa (TGA) Tgaimp32.flt 26624 Supports TrueVision
Filter erwähnt .... ev. wird TGA nach Installation automatisch unterstützt...

(In Verbindung mit PowerPoint und Excel gefunden)

Anderenfalls wäre noch DirectX eine Variante....

Direct3DX Utility Library
What file formats are supported by the D3DX image file loader functions?
The D3DX image file loader functions support BMP, TGA, JPG, DIB, PPM and DDS files.

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

S
125 Beiträge seit 2005
vor 18 Jahren

Jo...

Nur leider wüßte ich im Moment nicht wie ich das jetzt mit einbinden sollte.
Hab mich mal mit DirectX versucht (und gnadenlos verloren 😄). Jetzt beiß ich mich durch SdlDotNet durch. Für die Zwecke der Spieleentwicklung ganz gut (*.tga's kann man laden) aber leider ist die GUI-Funktionalität nicht besonders.

Deshalb wollte ich mir meinen MapEditor mit WinForms basteln. Bin halt ein bequemer Programmierer. 8)

Aber deine Klasse ist echt Klasse (was für ein Wortspiel... 😄).

Wenn du nix dagegen hast verwende ich sie für meine Projekt. Evtl. leicht abgeändert.

CU SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren

Schade dass es mit dem Tga nicht geklappt hat.... aber wenn Du die Klasse trotzdem brauchen kannst, dann verwende diese ruhig.... Du kannst ja wenn Du WILLST den Programmierhans oder mycsharp.de oder beides im Info aufführen 🙂... trotzdem noch viel Spass damit 🙂

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

F
10.010 Beiträge seit 2004
vor 18 Jahren

Stell doch auf die devil um.

http://www.mastropaolo.com/devildotnet/

S
125 Beiträge seit 2005
vor 18 Jahren

@FZelle:

Wenn du mich meintest... hab ich doch schon. Siehe tga Files: Wie kann man sie in C# öffnen?. 😁

Aber danke trotzdem... 😉

CU SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

P
78 Beiträge seit 2006
vor 18 Jahren

wie muss ich das einbinden?? bin anfänger 😭

die eine klasse hinzufügen und den testcode und eine Listbox in meinem Form hinzufügen und die listbox dann imageListBox1 nennen???

wäre nett wenn mir jemand auf die sprünge helfen könnte.

danke
grüße

Programmierhans Themenstarter:in
4.221 Beiträge seit 2005
vor 18 Jahren

Variante 1

-Klasse als eigenes File zu einem Projekt hinzufügen.
-Projekt builden
-das Projekt (dessen Controls) in die Toolbox einbinden
-das Control aus der Toolbox auf Dein Formular ziehen.

Variante 2 (ohne Toolbox)

-Klasse als eigenes File zu einem Projekt hinzufügen.
-Projekt builden
-normale ListBox auf das Form ziehen
-den Code im entsprechenden erstellten Form so anpassen dass als Type dieserListBox nicht System.Windows.Forms.ListBox sondern der neue ListBoxType steht. (Variable und Instanzierung = 2 Zeilen Code insgesamt)

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

P
78 Beiträge seit 2006
vor 18 Jahren

ok versuche ich morgen!
Vielen Dank für die detailierte Beschreibung!

lustiger wurm....

grüße