Hintergrundbild vergrößern

Hallo,

ich lade mir eine Karte als Hintergrundbild und auf der zeichnet mir
das Programm ein paar Punkte ein. Jetzt würde ich gerne mit der Maus
Ausschnitte auswählen und sie mir vergrößert darstellen. Gibt es einen
speziellen Befehl oder hat jemand schon mal so etwas in der Art programmiert?

Wer kann mir helfen? Danke!

Gruß, Stefan

Hallo Stefan!

Ohne dass Du genau geschrieben hättest, wie es bis jetzt gemacht wird hört es sich so an, als hättest Du einfach das BackgroundImage-Property eines Forms auf ein Bild gesetzt und dann irgendwie (CreateGraphics() ?) drauf gemalt.
Wenn dem so ist, dann kannst Du alle weiteren Aktionen vergessen, da sich das Hintergrundbild nicht merkt, wenn etwas darauf gemalt wird.

Meiner Meinung nach das einzig senkrechte ist, sich ein eigenes Control dafür zu schreiben.
Leite Dir z.B. von Panel eine Klasse ab und füge ein Image-Property für die Karte hinzu. Überschreibe dann die OnPaint-Methode und dort zeichnest Du dann mittels DrawImage des übergebenen Graphics-Objekts Dein Bild entsprechend skaliert. Und anschließend dann die weiteren Markierungen („Punkte“), aber eben alles in der OnPaint-Methode!
Die Ableitung von Panel bringt Dir außerdem den Vorteil, dass Du damit die ganze Scrollerei (die Du vermutlich beim Zoom ohnehin brauchst) schon mit geliefert bekommst.

Gruß,
Martin

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Martin!

Hallo Stefan!

Ohne dass Du genau geschrieben hättest, wie es bis jetzt
gemacht wird hört es sich so an, als hättest Du einfach das
BackgroundImage-Property eines Forms auf ein Bild gesetzt und
dann irgendwie (CreateGraphics() ?) drauf gemalt.
Wenn dem so ist, dann kannst Du alle weiteren Aktionen
vergessen, da sich das Hintergrundbild nicht merkt, wenn etwas
darauf gemalt wird.

Stimmt genau, so habe ich es gemacht…
Habe deinen Weg versucht und komme leider nicht so ganz klar damit!
Gibt es evtl. ein Beispielprogramm?

Meiner Meinung nach das einzig senkrechte ist, sich ein
eigenes Control dafür zu schreiben.
Leite Dir z.B. von Panel eine Klasse ab und füge ein
Image-Property für die Karte hinzu.

Das Überschreiben kann ich. :wink:
Hast du bzw. gibt es anschauliche Beispiele zu den einzelnen Teilen?

Überschreibe dann die
OnPaint-Methode und dort zeichnest Du dann mittels DrawImage
des übergebenen Graphics-Objekts Dein Bild entsprechend
skaliert. Und anschließend dann die weiteren Markierungen
(„Punkte“), aber eben alles in der OnPaint-Methode!
Die Ableitung von Panel bringt Dir außerdem den Vorteil, dass
Du damit die ganze Scrollerei (die Du vermutlich beim Zoom
ohnehin brauchst) schon mit geliefert bekommst.

Gruß,
Martin

Vielen Dank,
Stefan

Das wäre z.B. ein Anfang:

using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace Irgendwas
{
 /// 
 /// Zusammenfassung für ZoomImage.
 /// 
 public class ZoomImage : Panel
 {
 /// 
 /// Erforderliche Designervariable.
 /// 
 private System.ComponentModel.Container components = null;

 public ZoomImage()
 {
 // Dieser Aufruf ist für den Windows Form-Designer erforderlich.
 InitializeComponent();

 // TODO: Initialisierungen nach dem Aufruf von InitComponent hinzufügen
 }

 protected Image \_image;
 public Image Image 
 {
 get { return \_image; }
 set { \_image = value; }
 }

 /// 
 /// Verwendete Ressourcen bereinigen.
 /// 
 protected override void Dispose( bool disposing )
 {
 if( disposing )
 {
 if( components != null )
 components.Dispose();
 }
 base.Dispose( disposing );
 }

 #region Vom Komponenten-Designer generierter Code
 /// 
 /// Erforderliche Methode für die Designerunterstützung. 
 /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
 /// 
 private void InitializeComponent()
 {
 components = new System.ComponentModel.Container();
 }
 #endregion

 protected override void OnPaint(PaintEventArgs pe)
 {
 // Hier kannst Du Dich jetzt austoben.
 // z.B. Hintergrundbild zeichnen:
 if (\_image != null)
 {
 pe.Graphics.DrawImage(\_image, ClientRectangle);
 }

 // auf das Bild draufzeichnen (hier z.B. Linien)
 for (int i=0; i

Martin


> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>

Hallo Martin!

Vielen Dank für deine Hilfe!
Habe es soweit umsetzen können. Jetzt muss ich nur noch den Weg finden, wie ich mit der Maus Bereiche auswähle und dann vergrößert darstelle. Weist du zufällig, ob das Programm jetzt „weis“ was es gezeichnet hat? D.h. wenn ich mit der Maus einen Bereich auswähle, weis dann das Programm was in dem Bereich dargestellt wird, um das Ausgewählte dann zu vergrößern!?

Wenn es Dich interessiert ein vereinfachter Ausschnitt aus meinem Programm:

Imports System.IO
Imports System.Math
Imports System.Data.SqlClient.SqlConnection
Imports System.Data.SqlClient
Imports System.IO.Path
Imports System.Security.Permissions
Imports System.Diagnostics
Imports System.ComponentModel
Imports Microsoft.VisualBasic
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Collections
Imports System.Data
Imports System

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Vom Windows Form Designer generierter Code "

Public Sub New()
MyBase.New()

’ Dieser Aufruf ist für den Windows Form-Designer erforderlich.
InitializeComponent()

’ Initialisierungen nach dem Aufruf InitializeComponent() hinzufügen

End Sub

’ Die Form überschreibt den Löschvorgang der Basisklasse, um Komponenten zu bereinigen.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

’ Für Windows Form-Designer erforderlich
Private components As System.ComponentModel.IContainer

'HINWEIS: Die folgende Prozedur ist für den Windows Form-Designer erforderlich
'Sie kann mit dem Windows Form-Designer modifiziert werden.
'Verwenden Sie nicht den Code-Editor zur Bearbeitung.
Private Sub InitializeComponent()

'Form1

Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.AutoScroll = True
Me.ClientSize = New System.Drawing.Size(1248, 957)
Me.Name = „Form1“
Me.Text = „Form1“

End Sub

#End Region

Dim verweis As New eigene2

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
verweis.prop = New Bitmap(„V:\temp\Karte2.bmp“)
verweis.Width = Me.Size.Width
verweis.Height = Me.Size.Height

Me.Controls.Add(verweis) ’ ruft ihr OnPaint auf
End Sub

End Class

‘ meine eigene Klasse

Public Class eigene2
Inherits System.Windows.Forms.Panel
Protected karte As Image
Public Property prop() As Image ’ Eigenschaft
Get
Return karte
End Get
Set(ByVal Value As Image)
karte = Value
End Set
End Property
Protected Overrides Sub OnPaint(ByVal pe As PaintEventArgs)
Dim farbe As New SolidBrush(Color.DeepPink)
Dim i As Integer = 100
Dim j As Integer = 100
pe.Graphics.DrawImage(karte, 0, 0) ’ Karte als Hintergrund zeichnen
For i = 100 To 1000 Step 100
pe.Graphics.FillRectangle(farbe, New Rectangle(i, j, 10, 10)) 'Rechtecke zum Testen einzeichnen
Next
End Sub
End Class

Hallo Martin!

Vielen Dank für deine Hilfe!
Habe es soweit umsetzen können. Jetzt muss ich nur noch den
Weg finden, wie ich mit der Maus Bereiche auswähle und dann
vergrößert darstelle. Weist du zufällig, ob das Programm jetzt
„weis“ was es gezeichnet hat? D.h. wenn ich mit der Maus einen
Bereich auswähle, weis dann das Programm was in dem Bereich
dargestellt wird, um das Ausgewählte dann zu vergrößern!?

[…]

Was in Deiner Klasse wie gezeichnet wird, das bestimmst Du in der OnPaint-Methode.
Momentan zeichnest Du Test-Rechtecke, aber wo die sein sollen muss die OnPaint-Methode schliesslich auch wissen.
Genauso das Hintergrundbild.
Momentan wird’s unskaliert in die linke obere Ecke gezeichnet.
Wenn Du scrollst, dann liegt die linke obere Ecke des Bildes ja nicht mehr auf der linken oberen Ecke Deines Controls.
Und wenn Du zoomen willst, dann musst du auch mit einem DrawImage-Aufruf arbeiten, der das Bild skaliert zeichnet.

Martin