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

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von herbivore
Thema: JPEG-Dateigröße beeinflussen?!
Am im Forum: GUI: Windows-Forms

Hallo -acid-,

gemacht habe ich das noch nicht, aber meine Suche in der .NET-Doku nach "image jpeg quality" hat genau einen Treffer zu Tage gefördert und der sieht passend aus:

---schnipp---
Ein Encoder-Objekt, das mit der GUID für die Qualitäts-Parameterkategorie initialisiert wird.

public static readonly Encoder Quality;

Im folgenden Beispiel wird ein Bitmap-Objekt aus einer BMP-Datei erstellt. Die Bitmap wird in drei JPEG-Dateien mit unterschiedlichem Qualitätsniveau gespeichert.


using System;
using System.Drawing;
using System.Drawing.Imaging;
class Example_SetJPEGQuality
{
   public static void Main()
   {
      Bitmap myBitmap;
      ImageCodecInfo myImageCodecInfo;
      Encoder myEncoder;
      EncoderParameter myEncoderParameter;
      EncoderParameters myEncoderParameters;
      // Create a Bitmap object based on a BMP file.
      myBitmap = new Bitmap("Shapes.bmp");
      // Get an ImageCodecInfo object that represents the JPEG codec.
      myImageCodecInfo = GetEncoderInfo("image/jpeg");
      // Create an Encoder object based on the GUID
      // for the Quality parameter category.
      myEncoder = Encoder.Quality;
      // Create an EncoderParameters object.
      // An EncoderParameters object has an array of EncoderParameter
      // objects. In this case, there is only one
      // EncoderParameter object in the array.
      myEncoderParameters = new EncoderParameters(1);
      // Save the bitmap as a JPEG file with quality level 25.
      myEncoderParameter = new EncoderParameter(myEncoder, 25L);
      myEncoderParameters.Param[0] = myEncoderParameter;
      myBitmap.Save("Shapes025.jpg", myImageCodecInfo, myEncoderParameters);
      // Save the bitmap as a JPEG file with quality level 50.
      myEncoderParameter = new EncoderParameter(myEncoder, 50L);
      myEncoderParameters.Param[0] = myEncoderParameter;
      myBitmap.Save("Shapes050.jpg", myImageCodecInfo, myEncoderParameters);
      // Save the bitmap as a JPEG file with quality level 75.
      myEncoderParameter = new EncoderParameter(myEncoder, 75L);
      myEncoderParameters.Param[0] = myEncoderParameter;
      myBitmap.Save("Shapes075.jpg", myImageCodecInfo, myEncoderParameters);
   }
   private static ImageCodecInfo GetEncoderInfo(String mimeType)
   {
      int j;
      ImageCodecInfo[] encoders;
      encoders = ImageCodecInfo.GetImageEncoders();
      for(j = 0; j < encoders.Length; ++j)
      {
         if(encoders[j].MimeType == mimeType)
            return encoders[j];
      }
      return null;
   }
}
---schnapp---

HTH

herbivore

Thema: Enter/Eingabe statt Tab Taste...
Am im Forum: GUI: Windows-Forms

Hallo burning snow,

ich würde erstmal dafür plädieren, das Standard-Tasten wie Enter, Tab u.ä. ihre normale Funktion behalten. Also Tab für das Springen und Enter für das Aktivieren des DefaultButtons. Es muss m.E. schon sehr handfeste Gründe geben, dass zu ändern. Unbekannte Windows-Anwendungen sind ja auch deshalb so "leicht" zu bedienen, weil es eben gewisse Standards und Konvetionen gibt.

Sollte bei Dir so ein handfester Grund vorliegen, kriegst Du das Betätigen der Enter-Taste in den Ereignissen Control.KeyDown bzw. KeyPress bzw. KeyUp mit und kannst es dort entsprechend behanden.

HTH

herbivore

Thema: Context-Menu an NotifyIcon funzt net
Am im Forum: GUI: Windows-Forms

Hallo Bewareofthis,

wenn Dein Problem noch besteht, dann poste doch mal Code (möglichst kurz und nur die problematischen Stellen, aber ohne Änderungen direkt compilierbar). Ich würde dann mal schauen.

herbivore

Thema: Überwachenfenster VS 2003 ein Steuerelement?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo sadza79,

ich weiß es nicht, äußere aber mal die Vermutung, dass dies nicht der Fall ist. Es sollte aber auch kein unüberwindliches Problem sein sich, ein so ein Control unter Zuhilfenahme der Klassen TreeView und ListView selbst zu bauen.

HTH

herbivore

Thema: TextBox-Inhalte in Word-Dokument exportieren?
Am im Forum: Office-Technologien

Hallo rookie,

eine genaue Antwort kann ich Dir leider nicht geben. Ich kann jedoch sagen, dass der Weg der Wahl vermutlich die Ansteuerung von Word per DDE ist.

HTH

herbivore

Thema: Zufallszahlen, die sich nicht wiederholen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

EDIT (2009): Der Original-Beitrag ist schon älter. ArrayList gehört mittlerweile in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Stattdessen sollte man List<T> und alle anderen typisierten Collections aus System.Collections.Generic verwenden.

Die hier vorgeschlagene Lösung mit dem RemoveAt ist allerdings sowieso ungünstig, wie sich im weiteren Verlauf des Threads zeigt. Weiter unten werden bessere Lösungen vorgeschlagen.


Hallo Jaden,

kopiere vorab Dein Array in eine ArrayList

Erzeuge eine Zufallszahl zwischen 0 und ArrayList.Count-1. Dann kannst du den gelieferten Wert als Index verwenden, um das gewünschte Element zu ermitteln. Anschließend löscht du das Array-Element an dieser Stelle mit ArrayList.RemoveAt und generierst die nächste Zufallszahl zwischen 0 und ArrayList.Count-1, wobei Count selbst ja jetzt um eins kleiner ist.


EDIT (2012): Die folgende Variante arbeitet mit linearem Aufwand und Gleichverteilung:

kopiere vorab Array.Length in die Variable valuesLeft.

Erzeuge eine Zufallszahl zwischen 0 und valuesLeft-1. Dann kannst du den gelieferten Wert als Index verwenden, um das gewünschte Element zu ermitteln. Anschließend kopierst du das Array-Element vom Index valuesLeft an diese Stelle und generierst die nächste Zufallszahl zwischen 0 und valuesLeft-1, wobei du valuesLeft vorher um eins verringerst.

Einfacher ist es jedoch die fertige Shuffle-Methode zu verwenden, die nach einem ähnlichen Prinzip funktioniert, siehe [Snippet] Zufallszahlen, die sich nicht wiederholen. Dort wird auch noch eine andere Möglichkeit aufgezeigt, die sich besser eignet, wenn man aus einer großen Liste oder einem großen Wertebereich nur wenige Zufallszahlen (aber trotzdem ohne Wiederholung) auswählen will.


HTH

herbivore

Thema: OpenFileDialog und Filestream ?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Rope,

soweit ich das sehe, gibt es auch keinen Zusammenhang zwischen dem OpenFileDialog und dem FileStream, abgesehen davon, dass durch das Wählen einer Datei im FileOpenDialog das Arbeitsverzeichnis geändert wird. Da Du beim Öffnen des FileStreams jedoch keinen absoluten Pfad angegeben hast, sondern nur einen Dateinamen wird versucht, die Datei an einem anderen Ort zu öffen.

Erschwerend kommt hinzu, dass du die Datei mit FileMode.Open öffnest, was bedeutet, dass das Betriebssystem eine vorhandene Datei öffnen soll. Da Du die Datei aber schreiben willst, wäre wohl File.ModeCreate sinnvoller, was bedeute, dass das Betriebssystem eine neue Datei erstellen soll oder - wenn die Datei bereits vorhanden ist - diese überschreiben.

Einfacher wäre es ohnehin den FileStream ganz zu vergessen und einfach StreamWriter sw = new StreamWriter("Root.csv"); zu verwenden.

Der OpenFileDialog öffnet übrigens die ausgewählten Dateien nicht, sondern stellt dir nur den Zugriff auf die Auswahl in ofd.FileName (bzw. ofd.FileNames) zur Verfügung. ofd.FileName kannst du dann in new StreamWriter(ofd.FileName) verwenden, um die Datei zu öffnen (was dann aber wohl auch in b1click und nicht in b2click passieren sollte).

HTH

herbivore

Thema: Optimierungsideen für die Darstellung von sehr vielen Controls?
Am im Forum: GUI: Windows-Forms

Hallo Lynix,

nach den beiten Beiträgen von Xqgene und Pulpapex kann ich es mir einfach machen. Der Beitrag von Xqgene beantwortet Deine ursprüngliche GUI-bezogene Frage. Der Beitrag von Pulpapex beantwortet Deine aktuelle Frage:

Zitat
Oder wie soll ich z.B. einer Kiste die auf einem bestimmten Feld steht eine Aktion zuweisen, wenn die Kiste kein Objekt ist sondern nur eine Graphik an einer Position innerhalb meines Spielfelds oder wegen mir Picturebox?

Um es mal frech zu sagen: Ordne die Aktionen einer Kiste immer der Kiste und nie der grafischen Repräsentation der Kiste zu. Um es noch mal klarer zu sagen: Was eine Kiste kann, gehört in die Modellklasse Kiste, wie und wo die Kiste als Grafik auf den Schirm kommt, gehört im ersten Ansatz die die GUI-Klasse Tile. Also auch wenn Dein erster Tile-Ansatz performancemäßig funktioniert hätte, hätten da die Kiste-Aktionen nicht reingehört! Wenn man nun im zweiten Ansatz auf Playground statt Tile ausweicht, ändert sich dadurch an den Modellobjekten (Kiste &Co) gar nichts.

Oder um es mit René Magritte zu sagen: "Das ist keine Pfeife" ("Ceci n` est pas un pipe"):



sondern das Abbild einer Pfeife. Unterscheide immer die Objekte und ihre grafische Repräsentation.

Wie man von Tile zu Playground kommt, hat ja Xqgene schon beschrieben.

HTH

herbivore

Thema: Optimierungsideen für die Darstellung von sehr vielen Controls?
Am im Forum: GUI: Windows-Forms

Hallo Lynix,

ich habe jetzt auch mal ein kleines Programm geschrieben. Es erzeugt im Konstruktor des Forms ein Grid von PictureBoxen (10x10 Pixel) und fügt jede PictureBox direkt dem Form hinzu.

Bei 10x10 Controls benötigt das Programm zum Starten unter 0,5 Sekunden (bis es komplett dargestellt ist. Bei 50x50 Control dauert der gleiche Vorgang schon 4,5 Sekunden und das Fenster reagiert sehr träge, wenn es neu gezeichnet werden muss. Bei 100x100 bricht das Programm mit einer Exception ab.

Damit dürfte die Variante, bei der jedes Tile ein eigenes Control aus meiner Sicht (zumindest bei der jetzigen Windows- und Rechnergeneration) aus dem Rennen sein.

Also zurück zu dem von Xqgene vorgeschlagenem Spielfeld-Control. Schon in seiner ersten Nachricht beschreibt er ziemlich genau, was du machen musst. Du musst halt in den EventHandlern aus den gelieferten Koordinaten selbst ausrechnen, welches Tile betroffen ist, und dann so reagieren, wie es für dieses Tile vorgesehen ist. Andersherum musst Du beim Zeichnen von Tiles zu den Koordinaten innerhalb des Tiles die Offsets vom Spielfeldrand zu dem entsprechenden Tile hinzurechnen.

HTH

herbivore

Thema: enum Member zuweisen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

man könnte noch ergänzen, dass durch das ': int' keine Vererbung stattfindet (welche die fehlerhafte Zuweisung dann ja erlauben würde), sondern lt. Doku nur "der zugrunde liegende Typ, durch den der Speicher festgelegt wird, der für die einzelnen Enumeratoren reserviert wird" festgelegt wird. Und da int Default ist, kann das ': int' ganz entfallen.

HTH

herbivore

Thema: Optimierungsideen für die Darstellung von sehr vielen Controls?
Am im Forum: GUI: Windows-Forms

Hallo Lynix,

keine Ahnung, ob mein Vorschlag was an der Performance ändert und ich weiß auch nicht genau, was du in den Tiles so veranstalten willst, aber ich wollte trotzdem auf die Control-Klasse PictureBox, die ein Image (z.B. Bitmap) darstellen, kann hinweisen. Wenn die Tiles nur Images/Bitmaps darstellen sollen, kannst du dir so das "Selberzeichnen" deines Usercontrols sparen. Wenn die Möglichten einer PictureBox nicht ausreichen, wäre PictureBox zumindest eine überlegenswerte Basisklasse für Dein Control.

Wenn alle Stricke reißen, kannst du statt der vielen Tiles auch eine große PictureBox für das Spielfeld verwenden (das Prinzip Spielfeld statt Tiles wurde ja schon vorgeschlagen). Das Zeichnen in das der PictureBox zugeordneten Image kannst du mit der Klasse Graphics erledigen.

Ich sehe denn Vorteil in der PictureBox darin, dass man sich auf einer Zeichenfläche (Image) austoben kann und sich um den ganzen Darstellungs-, Invalidate-, Paint-, ClipRectangle-Kram gar nicht kümmern muss (na ok, Invalidate braucht u.U. man immer noch, kann sich aber günstigenfalls auf die Version ohne Parameter beschränken).

HTH

herbivore

Thema: Mehrer Tasten gleichzeitig
Am im Forum: GUI: Windows-Forms

Hallo psyco,

ich denke, dass kannst Du nur "mitrechnen" (mit allen Problemen der Akkuratesse die so ein Mitrechnen mit sich bringt). Du wirst ja von Windows über das Drücken (Form.KeyDown-Ereignis) und das Loslassen (Form.KeyUp-Ereignis) separat informiert. Lediglich für Ctrl, Alt und Shift kann man den momentanen Status problemlos mit Form.ModifierKeys abfragen.

HTH

herbivore

Thema: ContextMenü->Click ListView wird markiert
Am im Forum: GUI: Windows-Forms

Hallo Maddinel,

soweit ich das sehe, ist das das Windows-Standard-Verhalten, dass der Eintrag, auf den Du rechtsklickst, markiert bzw. selektiert wird. Du kannst das aber nachträglich rückängig machen, in dem du die Selektion per Programm entfernst oder die alte Selektion wiederherstellst, z.B. in den Aktionen, die hinter dem Menü liegen (werden). Zum ändern der Selektion kannst Du ListViewItem.Selected benutzen. Wenn Du die alte Selektion wiederherstellen willst, musst du diese natürlich wissen. Dabei hilft ListView.SelectedIndexChanged um über alle Änderungen an der Selektion auf dem Laufenden zu bleiben.

HTH

herbivore

Thema: Size vs. ClientSize bei eigenem Control
Am im Forum: GUI: Windows-Forms

Hallo Pulpapex,

ich habe jetzt das Control.CreateParams.ExStyle-Flag WS_EX_CLIENTEDGE aus der Win32-Header-Datei winuser.h benutzt. Dadurch ist die ClientSize jetzt die 4 Pixel kleiner *und* der Rahmen, den ich um die ClientArea zeichnen wollte, wird von Windows automatisch gezeichnet. Vielen Dank für diesen entscheidenden Hinweis!

Falls jemand das gleiche Problem hat, hier mein Code:


protected override CreateParams CreateParams
{
   get {
      // Definition des Extended Window Styles aus winuser.h (Win32)
      const int WS_EX_CLIENTEDGE = 0x200;

      CreateParams cp = base.CreateParams;
      cp.ExStyle |= WS_EX_CLIENTEDGE;

      return cp;
   }
}
Zitat
Wofür wird ClientSize in deinem Fall denn genau benötigt?

Naja, es soll halt ein allgemein verwendbares Control werden. Daher möchte ich, dass man durch Setzen von ClientSize die effektive Größe des Controls festlegen kann. Das Control soll also, ohne Berechnung von Rahmendicken seitens des Aufrufers, die richtige Größe bekommt.
Zitat
Es gibt noch die Methode UpdateBounds.

Die hatte bei meiner Suche nach den diversen Möglichkeiten der Größenänderung glatt übersehen. Jedenfalls tut die Methode genau das, was ich im ersten Ansatz wollte. Man kann damit die ClientSize kleiner festlegen als Size. Allerdings ist damit alleine - wie du ja schon schreibst - noch nicht alles erschlagen. Man müsste also in SizeChanged die unterschiedliche Größe immer wieder neu setzen - wobei einem leider die Information fehlt, ob man von ClientSize nach Size oder umgekehrt rechnen muss. Und selbst, wenn man das wüsste, schlägt die Änderung nicht auf die zugrundeliegende Win32-Ebene durch - mit ungeklärten Auswirkungen auf dortige Koordinatenberechnungen.

Aber zu Glück sind die UpdateBounds-Überlegungen nur hypothetisch, da die Windows-Styles mein aktuelles Problem vollständig erschlagen.

Vielen Dank!

herbivore

Thema: Size vs. ClientSize bei eigenem Control
Am im Forum: GUI: Windows-Forms

Hallo Pulpapex,

vielen Dank für den Beitrag. Leider geht es so nicht. Erstens sind Size und ClientSize in Control nicht als virtual definiert, also nix mit override und zweitens - was noch wichtiger ist - wird durch die jeweils zweite Zuweisung der Effekt der jeweils ersten aufgehoben, da das Verhalten der Oberklasse (base) meiner Klasse ja gerade eben ist, beide Größen auf denselben Wert zu setzen.

Trotzdem danke!

herbivore

Thema: Size vs. ClientSize bei eigenem Control
Am im Forum: GUI: Windows-Forms

Hallo Community,

bei manchen Controls ist Size gleich ClientSize (z.B. PictureBox), bei manchen ist die ClientSize kleiner als Size, weil das Control z.B. einen Rahmen hat (z.B. TextBox). Ich möchte ein solches Control mit Rahmen schreiben, leite aber von einem Control ab, bei dem Size gleich ClientSize ist.

Was muss ich tun, damit beim Setzen von Size bzw. ClientSize, das jeweils andere die korrekte Größe bekommt?

Wenn ich das bei meinem Control die Größe ändere, sind auf Grund des geerbten Verhaltens beide Größen erstmal gleich. Die ClientSize soll aber in beiden Richtungen um 4 Pixel kleiner sein als Size. Experimente mit SetClientSizeCore und SetBoundsCore führten bisher leider nicht zum Erfolg.

Vielen Dank!

herbivore