my CSharp .de
»
Community
|
Diskussionsforum
Michael Schuler
myCSharp.de - Member
Dabei seit:
29.08.2004
Beiträge: 329
Herkunft: Zürich, Schweiz
Themenstarter:
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
02.08.2005 - 07:57
private Nachricht
|
Beiträge des Benutzers
-acid-
myCSharp.de - Member
Dabei seit:
07.05.2004
Beiträge: 885
Herkunft: Hessen
Du könntest doch die Listbox nehmen, dort Objekte erzeugen und mit einem Bild Icon versehen, welches das Bild darstellt.
02.08.2005 - 08:03
private Nachricht
|
Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member
Dabei seit:
29.08.2004
Beiträge: 329
Herkunft: Zürich, Schweiz
Themenstarter:
Du meinst die ListView? Habe ich probiert, doch hat ein sehr unschönes verhalten. Kann ich also nicht nehmen.
02.08.2005 - 09:20
private Nachricht
|
Beiträge des Benutzers
-acid-
myCSharp.de - Member
Dabei seit:
07.05.2004
Beiträge: 885
Herkunft: Hessen
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*
02.08.2005 - 11:17
private Nachricht
|
Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member
Dabei seit:
29.08.2004
Beiträge: 329
Herkunft: Zürich, Schweiz
Themenstarter:
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.
02.08.2005 - 11:25
private Nachricht
|
Beiträge des Benutzers
herbivore
myCSharp.de - Experte
Dabei seit:
11.01.2005
Beiträge: 49.486
Herkunft: Berlin
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
02.08.2005 - 18:11
private Nachricht
|
Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member
Dabei seit:
29.08.2004
Beiträge: 329
Herkunft: Zürich, Schweiz
Themenstarter:
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.
02.08.2005 - 19:20
private Nachricht
|
Beiträge des Benutzers
herbivore
myCSharp.de - Experte
Dabei seit:
11.01.2005
Beiträge: 49.486
Herkunft: Berlin
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
02.08.2005 - 19:23
private Nachricht
|
Beiträge des Benutzers
Michael Schuler
myCSharp.de - Member
Dabei seit:
29.08.2004
Beiträge: 329
Herkunft: Zürich, Schweiz
Themenstarter:
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.ä.
02.08.2005 - 19:26
private Nachricht
|
Beiträge des Benutzers
herbivore
myCSharp.de - Experte
Dabei seit:
11.01.2005
Beiträge: 49.486
Herkunft: Berlin
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
02.08.2005 - 19:33
private Nachricht
|
Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte
Dabei seit:
05.04.2005
Beiträge: 4.221
Herkunft: Zentralschweiz
@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...
02.08.2005 - 19:49
private Nachricht
|
Beiträge des Benutzers
herbivore
myCSharp.de - Experte
Dabei seit:
11.01.2005
Beiträge: 49.486
Herkunft: Berlin
Hallo Programmierhans,
nicht schlecht!
herbivore
PS: Im Testcode meinst du bestimmt *.bmp o.ä. statt *.*, gell?
02.08.2005 - 19:56
private Nachricht
|
Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte
Dabei seit:
05.04.2005
Beiträge: 4.221
Herkunft: Zentralschweiz
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...
02.08.2005 - 19:58
private Nachricht
|
Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte
Dabei seit:
05.04.2005
Beiträge: 4.221
Herkunft: Zentralschweiz
Zitat Original von michaelschuler
Funktioniert perfekt...
*freu*
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
02.08.2005 - 20:34
private Nachricht
|
Beiträge des Benutzers
-acid-
myCSharp.de - Member
Dabei seit:
07.05.2004
Beiträge: 885
Herkunft: Hessen
Also schlussendlich ist es genau das was ich ihm vermitteln wolte *g* Er sollte einfach die Bilder als Item übergeben
04.08.2005 - 09:40
private Nachricht
|
Beiträge des Benutzers
mogli73
myCSharp.de - Member
Dabei seit:
25.11.2007
Beiträge: 92
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??
21.03.2009 - 16:02
private Nachricht
|
Beiträge des Benutzers
winSharp93
myCSharp.de - Experte
Dabei seit:
19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart
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.
21.03.2009 - 16:10
private Nachricht
|
Beiträge des Benutzers
mogli73
myCSharp.de - Member
Dabei seit:
25.11.2007
Beiträge: 92
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???
21.03.2009 - 16:30
private Nachricht
|
Beiträge des Benutzers
winSharp93
myCSharp.de - Experte
Dabei seit:
19.01.2007
Beiträge: 5.742
Herkunft: Stuttgart
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.
21.03.2009 - 17:38
private Nachricht
|
Beiträge des Benutzers
mogli73
myCSharp.de - Member
Dabei seit:
25.11.2007
Beiträge: 92
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...
22.03.2009 - 09:29
private Nachricht
|
Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte
Dabei seit:
31.01.2008
Beiträge: 5.299
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.
22.03.2009 - 11:19
private Nachricht
|
Beiträge des Benutzers