System.Drawing.Drawing2D Probleme mit dem zeichnen, --- Matrix; Pixel auf mm

26/10/2007 - 20:31 von Petra Rohmer | Report spam
Hallo,

ich möchte folgendes machen

Ein Panel zeichnen und darin Koordinaten.
Wie mache ich das?

Probleme: Nullpunkt
Größe des Panels
Neben den Punkten steht jetzt die Schrift.
Die Schrift sollte kleiner sein.

Kann mir jemand weiterhelfen?
Danke.

Der angehàngte Code làuft halt nicht richtig.
private System.Windows.Forms.Panel panel_draw;
muss in eine Form1 Application eingefügt werden.
Die Events müssen verbunden werden.

Danke für Hilfe.
Grüße Petra


0,0 (900mm,900mm)
||
||
||
||
||
||
||
||

Nullpunkt muss definierbar sein.
Links,rechts (oben oder unten)

Ich brauche Funktionen
SetZeropoint (Left_Bottom)
SetZeropoint (Left_Top)
SetZeropoint (Right_Bottom)
SetZeropoint (Right_Top)

SetDimensionIn_MM(0,0,900,900)
oder
SetDimensionIn_MM(0,0,400,200)

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

using System.Drawing.Drawing2D;

namespace Grafik
{
public partial class Form1 : Form
{
public List<CODES> ListCodes;

public class CODES
{
private double x;
private double y;

private int boardNumber;

public double X
{
get { return x; }
set { x = value; }
}

public double Y
{
get { return y; }
set { y = value; }
}

public int BoardNumber
{
get { return boardNumber; }
set { boardNumber = value; }
}

public void Init()
{
X = 0;
Y = 0;
boardNumber = 0;
}
}

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ListCodes = new List<CODES>();
CODES obj;

int boardnumber = 0;
for (int j = 0; j < 4; j++)
{
for (int i = 0; i < 5; i++)
{
boardnumber++;
obj = new CODES();
obj.Init();
obj.X = obj.X + (j * 30);
obj.Y = obj.Y + (i * 15);
obj.BoardNumber = boardnumber;
ListCodes.Add(obj);
}
}
}

float ScaleX, ScaleY;

private void MapMillimetersToPixels(Graphics gfx, Rectangle
rectPixels, Rectangle rectMm)
{
Matrix matrix = new Matrix();
ScaleX = (float)rectPixels.Width / rectMm.Width;
ScaleY = (float)rectPixels.Height / rectMm.Height;
matrix.Scale(ScaleX, ScaleY);
matrix.Translate(rectPixels.Left - ScaleX * rectMm.Left,
rectPixels.Top - ScaleY * rectMm.Top);

gfx.Transform = matrix;
}

private int MillimetersToPixels_X(double value)
{
return Convert.ToInt32(ScaleX * value);
}

private int MillimetersToPixels_Y(double value)
{
return Convert.ToInt32(ScaleY * value);
}

public void DrawPanel(List<CODES> listCodes, PaintEventArgs e)
{
Graphics gfx; // the Graphics instance; for example, taken from
PaintEventArgs
gfx = e.Graphics;

Rectangle rectMM = new Rectangle( 0, 0, 400, 200 );
Rectangle rectPixel = new Rectangle( 0, 0, 490, 490 );

rectPixel = panel_draw.DisplayRectangle;
MapMillimetersToPixels( gfx, rectPixel, rectMM );

// panel_draw.RectangleToClient( rectPixel );

//MapMillimetersToPixels( gfx, rectPixel, rectMM );

// gfx.DrawRectangle( Pens.Red, 0, 0,MillimetersToPixels_X( 200 ),
MillimetersToPixels_Y( 77 ) );
gfx.DrawRectangle( Pens.Red, 5, 5, MillimetersToPixels_X( 200
),MillimetersToPixels_Y(77) );

//Point[] rgpt; // some array of points
//rgpt = new Point[20];
//int ipointCur = 0;
Point ptCur; // = rgpt[ipointCur];
string strPoint;// = "P" + ipointCur;

//for ( int j = 0; j < 20; j++ )
//{
// rgpt[j].X = 50;
// rgpt[j].Y = (j*6 ) + 20;
//}

ptCur = new Point();
foreach ( CODES code in listCodes )
{
ptCur.X = MillimetersToPixels_Y(code.X);
ptCur.Y = MillimetersToPixels_Y(code.Y);

// These two lines of code draw the cross
gfx.DrawLine( Pens.Black, ptCur.X - 5, ptCur.Y, ptCur.X +
5,ptCur.Y );
gfx.DrawLine( Pens.Black, ptCur.X, ptCur.Y - 5, ptCur.X,ptCur.Y
+ 5 );

// This block of code draws the label for the point
using ( Brush brush = new SolidBrush( ForeColor ) )
{
strPoint = "P" + code.BoardNumber + "(" + code.X +"," +code.Y
+ ")";
gfx.DrawString( strPoint, Font, brush, ptCur.X + 10,ptCur.Y );
}
}
//rectPixel = panel_draw.DisplayRectangle;
//MapMillimetersToPixels( gfx, rectPixel, rectMM );

}

private void panel_draw_Paint(object sender, PaintEventArgs e)
{
DrawPanel(ListCodes, e);
}
}
}
 

Lesen sie die antworten

#1 Frank Dzaebel
26/10/2007 - 21:54 | Warnen spam
Hallo Petra,

ich möchte folgendes machen
Ein Panel zeichnen und darin Koordinaten.
Wie mache ich das?



Zunàchst würde ich erstmal an freien Code
oder freie Chart Controls bei soetwas denken:

[A flexible charting library for .NET - The Code Project - C# Programming]
http://www.codeproject.com/csharp/ZedGraph.asp

[Cristi Potlog's Chart Control for .NET - The Code Project - C# Controls]
http://www.codeproject.com/cs/miscc...ontrol.asp

[3D Pie Chart - The Code Project - C# Programming]
http://www.codeproject.com/csharp/J...eChart.asp

___________________
Wenn Dir das nicht zusagt, dann können wir ja nochmal
über Deinen Code reden.
Vielleicht ist auch folgende Methode für Dich interessant:

float zollAlsMillimeter = 25.4F;

PointF MillimeterConvert(Graphics g, PointF p)
{ p.X *= g.DpiX / zollAlsMillimeter;
p.Y *= g.DpiY / zollAlsMillimeter;
return p;
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen