Warum soll man dann nicht mit ner antwort auf ne Frage rechnen?
Dann stell doch mal eine konkrete Frage. Wie Du für Dich am einfachsten in GDI einsteigen kannst, wird Dir niemand, der Dich nicht näher kennt, beantworten können. Es ist ja nicht mal klar was Du für Vorkenntnisse hast. Zwischen den Zeilen lesend würde ich sagen, das Du keine Eigeninitiative aufbringen kannst und nicht gewillt bist selbst in ein Thema einzuarbeiten.
Das von Dir gepostete Tutorial ist vllt. nicht optisch hübsch, liefert aber auf die schnelle einige Informationen mit denen man weiter suchen kann. Die Artikel aus CodeProject helfen jemanden der wirklich Interesse hat ebenso weiter.
Google: C# GDI+ Tutorial Liefert weitere schöne Informationen für einen Einstieg.
Wenn Du gute Antworten willst, stell vernünftige Fragen:
http://www.tty1.net/smart-questions_de.html
Unix-Tom schrieb:
string var = Convert.ToString(a)+Convert.ToString(b)+Convert.ToString(c)
Ist einer der vielen Möglichkeiten.
Joar, und zwar wahrscheinlicht die schlechteste.
Zum Konkatenieren gibt es im Prinzip drei Möglichkeiten, die man in Erwägung ziehen sollte:
• System.Text.StringBuilder ,
• string.Format ,
• string.Concat .
Letztere entspricht dabei zwar im Prinzip dem, was Du geschrieben hast, die expliziten Konvertierungen fallen aber weg. Dafür tritt Autoboxing in Kraft, das ist aber nicht schlimm.
Wenn man Werte konkateniert, die bereits Strings sind, dann kann man natürlich auch den +-Operator verwenden.
`String.Format` lohnt sich vor allem, wenn man eben (wie der Name schon sagt), eine Ausgabe formatieren will.
`StringBuilder` ist vor allem für das effiziente Erstellen sehr großer Strings geeignet. Es handelt sich essenziell um einen String, der verändert werden kann (und der Speicher reserviert, um Anhängen schneller zu machen).
ich habe was besseres fuer dich gefunden.
mit filesystemwatcher findest du welche datei geaendert wird. dann speicherst du alle geaenderte dateien in einer txt datei.
beispielcode hier
public class Watcher
{
public static void Main()
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name="FullTrust")]
public static void Run()
{
string[] args = System.Environment.GetCommandLineArgs();
// If a directory is not specified, exit program.
if(args.Length != 2)
{
// Display the proper way to call the program.
Console.WriteLine("Usage: Watcher.exe (directory)");
return;
}
// Create a new FileSystemWatcher and set its properties.
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[1];
/* Watch for changes in LastAccess and LastWrite times, and
the renaming of files or directories. /
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Only watch text files.
watcher.Filter = ".txt";
// Add event handlers.
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Begin watching.
watcher.EnableRaisingEvents = true;
// Wait for the user to quit the program.
Console.WriteLine("Press \'q\' to quit the sample.");
while(Console.Read()!='q');
}
// Define the event handlers.
private static void OnChanged(object source, FileSystemEventArgs e)
{
// Specify what is done when a file is changed, created, or deleted.
Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType);
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
// Specify what is done when a file is renamed.
Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
}
}
Wenn du unbedingt die Typsicherheit untergraben willst, dann vielleicht notfalls mit dem unsafe-Krams?
Und dir ist klar, dass im Fall von
object a = 1.5;
der Wert geboxt wird? Es ist also nicht soetwas, wie ein void-Zeiger solltest du das denken.
unsafe {
var value = 1.5;
var asBytePointer = (byte*)&value;
}
Arrays oder Teile einer Klasse musst du erst festpinnen, damit es nicht vom GC während deiner Arbeit wild im Speicher rumgeschoben wird und deine Zeiger somit plötzlich ungültig würden:
unsafe
{
var array = new double[50];
fixed (double* address = array)
{
// hier benutzen
}
}
hab mit XDocument selber zwar noch nicht gearbeitet - aber laut msdn duerfte das kein problem sein:
theDocument.Element("root").XXX
(aus er konstruktor anleitung in der msdn gezogen)
@J.Wiegand:
du kannst z.b. ein flow-panel verwenden in das du alle anderen "sub-panels" reinsteckst. dann hast du die im designer getrennt.
wenn im betrieb dann immer nur ein "sub-panel" sichtbar ist dann "verkümmert" das flow-panel quasi zu einem normalen panel.
natürlich musst du im designer den dialog immer noch grösserzeihen um das 2., 3. etc. panel zu sehen, aber zumindest muss man nicht 3 oder 4 panels "übereinanderstacken", was wirklich unzumutbar wäre.
Hi
I think this should not a problem
in the canvas the good thing is that you can work from the bottom left direction and position with the margin property
for me I think this should be possible
Store all ellipses in a list sort like you want
and create a method which shows the rectangles
For example
show()
{
Delete all children in canvas
for each ellipse in ellipseList
Show ellipse with margin
}
Now you react for e mouse wheel event {I think there is one} and on this in-/decrease a "zoom level" - this can be an integer, and in the "show" method, calculate with this "zoomlevel" the new margins and rectangle sizes, for example
elipse.margin = new Thikness(X * zoomlevel, Y * zoomlevel, 0, 0)
the easiest is if you store the ellipses as an own object which contains only the X and the Y coordinates, they you can use in the canvas as the margin, and paint the "point" from this point minus some pixels for the upper left position
show()
{
Delete all children in canvas
for each ellipse in ellipseList
{
Margin = X * zoomlevel, Y * zoomlevel, 0, 0 // position by zoomlevel
ElipseUpperLeft = (X - 5) * zoomlevel, (Y - 5) * zoomlevel // point size by zoomlevel
Show Ellipse "ElipseUpperLeft" with "Margin"
}
}
// just an idea {o;
//edit
please keep in mind that "zoomlevel" should never be zero, because than all points will be paintet in the corner