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 syntagma
Thema: Form ohne Focus immer im Vordergrund anzeigen
Am im Forum: GUI: Windows-Forms

Könnte sein, dass evtl. Outlook hier auch noch an den Fenstern rumfummelt. Beispielsweise habe ich bei mir furchtbare Schriftdarstellung (ohne Antialiasing). Vielleicht müsste man Outlook-seitig noch was einstellen, aber mir fehlt schlicht die Erfahrung damit.

Thema: Icon anheften
Am im Forum: GUI: WPF und XAML

Hallo

Nur für den Fall, dass jemand auch dieses ekelige Problem hat und die oben genannte Antwort nicht fruchtet:

EXE darf nicht auf Netzlaufwerk oder Wechsel-Platte sein!!

Greets

Thema: Imagemap in WindowsFormsApplication in c# (keine Webapplication!)
Am im Forum: GUI: Windows-Forms

Also das UserControl ist dafür nicht geeignet, deshalb eine Ableitung von ImageBox, obwohl du auch einfach von Control ableiten kannst und dabei das BackgroundImage als Bild-Eigenschaft verwenden kannst.

Das Control sähe in etwa so aus:

class ImageMapControl : Control
   {
      public event EventHandler<ImageMapEventArgs> AreaClicked; // Event für das Form

      public List<ImageMapArea> Areas { get; private set; } // Area Liste

      public ImageMapControl() // Konstruktor
      {
         Areas = new List<ImageMapArea>();
      }

      protected virtual void OnAreaClicked(ImageMapArea area) // Event feuern
      {
         if(AreaClicked != null)
            AreaClicked(this, new ImageMapEventArgs(area));
      }

      protected override void OnMouseUp(MouseEventArgs e) // Nach Klick
      {
         ImageMapArea area = HitTest(e.X, e.Y);
         if(area != null)
            OnAreaClicked(area);
         base.OnMouseUp(e);
      }

      private ImageMapArea HitTest(int X, int Y)
      {
         ImageMapArea result = null;
         var query = from ImageMapArea a in Areas
                     where
                     X ≥ a.X && X ≤ a.X + a.Width &&
                     Y ≥ a.Y && Y ≤ a.Y + a.Height
                     select a;
         
         if(query.Count() > 0)
            result = query.First();

         return result;
      }
   }

   class ImageMapArea
   {
      public string ID { get; set; }
      public int X { get; set; }
      public int Y { get; set; }
      public int Width { get; set; }
      public int Height { get; set; }
   }

   class ImageMapEventArgs : EventArgs
   {
      public ImageMapArea ImageMapArea { get; private set; }
      public ImageMapEventArgs(ImageMapArea area)
      {
         ImageMapArea = area;
      }
   }

Zur Kontrolle kannst du auch noch alle Areas visualisieren:

      protected override void OnPaint(PaintEventArgs e)
      {
         foreach(ImageMapArea a in Areas)
         {
            e.Graphics.DrawRectangle(System.Drawing.Pens.Black, new System.Drawing.Rectangle(
               a.X, a.Y, a.Width, a.Height));
         }
         base.OnPaint(e);
      }

Durch die HitTest Methode könntest du auch noch in OnMouseMove() prüfen ob darunter ein Link liegt und dann den Cursor als Händchen darstellen.

      protected override void OnMouseMove(MouseEventArgs e)
      {
         ImageMapArea area = HitTest(e.X, e.Y);
         Cursor = (area != null ? Cursors.Hand : Cursors.Default);
         base.OnMouseMove(e);
      }

Auf deiner Form hängst du nun dieses Control rauf, bestückst das Teil mit deinem Bild und hackst die Positionen der Links rein.

   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
         imageMap1.AreaClicked += new EventHandler<ImageMapEventArgs>(imageMap1_AreaClicked);
         imageMap1.Areas.Add(new ImageMapArea() { ID = "929", X = 30, Y = 95, Width = 30, Height = 18 });
      }

      void imageMap1_AreaClicked(object sender, ImageMapEventArgs e)
      {
         MessageBox.Show(e.ImageMapArea.ID);
      }
   }

Wenn die Bestimmung der Links zu aufwändig ist, könnte man eine Erfassung per Maus direkt im Control realisieren, zb mit CTRL+Maustaste und die Daten in ein File serialisieren. Aber etwas solltest du schon noch selber machen ;)

Thema: Imagemap in WindowsFormsApplication in c# (keine Webapplication!)
Am im Forum: GUI: Windows-Forms

Hi

Es stellen sich dabei natürlich grundsätzliche Fragen, wie zB

1. Als Hintergrund dient eine Bitmap (jpg, png, oder ähnliches), ja?
2. Ist das Hintergrundbild fix oder gibt es verschiedene Bilder mit verschiedenen Bereichen?
3. Sind die Bereiche rechteckig und regelmässig wie ein Raster angeordnet, sodass man diese berechnen könnte?

Falls du dich in die Thematik der WinForms-Control-Entwickung einlesen möchtest, empfehle ich hier das Kapitel Steuerelemente aus Visual C# 2008.

Darin findest du auch weitgehende Erläuterungen der WinForms und GDI+ Programmierung.

Als Lösungsansatz würde ich wohl mal ein Control erstellen, welches von ImageBox abgeleitet ist. Falls die Bereiche rastermässig angeordnet sind - also regelmässig - kannst du durch Überschreiben der OnMouseUp()-Methode die X/Y-Koordinaten auslesen und anhand der Bereichsgrösse die Zelle berechnen.

Falls es keine regelmässigen Bereiche sind, dann wirds etwas komplizierter: Erstelle dann eine Hilfsklasse für einen einzelnen Bereich, zB:

class ImageArea
{
    public string ID {get; set;}
    public int X {get; set;}
    public int Y {get; set;}
    public int Width {get; set;}
    public int Height {get; set;}
}

Im Control kannst du dann eine Eigenschaft zB 'ImageAreas' implementieren:

public List<ImageArea> ImageAreas {get; private set;} // Im Konstruktor initialisieren!

über diese kannst du dann manuell alle Bereiche hinzufügen, circa so:

this.ImageAreas.Add(new ImageArea() {ID="A1", X=1, Y=1, Width=10, Height=15});
etc.

In der OnMouseUp()-Überschreibung kannst du per Linq die entsprechende Area ermitteln, etwa so (e.X und e.Y sind EventArgumente von OnMouseUp):

var query = from ImageArea area in ImageAreas 
                  where 
                      e.X ≥ area.X && e.X ≤ area.X + area.Width &&
                      e.Y ≥ area.Y && e.Y ≤ area.Y + area.Height
                      select area;

if(query.Count() > 0) 
{
    MessageBox.Show(query.First().ID); 
}

Der Code ist jetzt nicht getestet, also einfach mal so rein gehackt. Ich hoffe du kannst damit was anfangen! Sonst frag einfach, wo es nicht verständlich ist.

Gruss syntagma