private void buttonExportAsPng_Click(object sender, RoutedEventArgs e) { this.StatusText = "Starting export."; if (this.IsRunning) { this.StatusText = "Please wait until current process is completed."; return; } if (!System.IO.File.Exists(this.Settings.MapFilePath)) { this.StatusText = "Please select a map file first."; return; } var dlgresult = m_SaveFileDialog.ShowDialog(); if (dlgresult.Value == true) { string imagefilename = this.m_SaveFileDialog.FileName; this.Settings.ImageFilePath = imagefilename; // Ausgabedatei prüfen, ob Ordner existiert und Dateiname mit .png endet string outputFolder = System.IO.Path.GetDirectoryName(imagefilename); if (!Directory.Exists(outputFolder)) { Directory.CreateDirectory(outputFolder); } if (!imagefilename.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) { imagefilename += ".png"; } this.m_Stopwatch.Restart(); this.IsRunning = true; var bw = new BackgroundWorker(); bw.DoWork += (s, a) => { var pois = POI.FromCsvFile(this.Settings.PoiFilePath); //var waypoints = Util.GetPOIsFromSavegame(this.Settings.MapFilePath); string directory = System.IO.Path.GetDirectoryName(this.Settings.MapFilePath); string ttpfilename = System.IO.Path.GetFileNameWithoutExtension(this.Settings.MapFilePath) + ".ttp"; ttpfilename = System.IO.Path.Combine(directory, ttpfilename); var waypoints = POI.FromTtpFile(ttpfilename); pois = pois.Concat(waypoints); var map = new MapRenderer(); map.TileSize = (int)this.Settings.SelectedTileSize; map.RenderBackground = this.Settings.RenderBackground; map.RenderGrid = this.Settings.RenderGrid; map.GridSize = this.Settings.GridSize; map.GridColor = System.Drawing.Color.FromArgb(this.Settings.AlphaValue, System.Drawing.Color.FromName(this.Settings.SelectedGridColorName)); map.RenderRegionNumbers = this.Settings.RenderRegionNumbers; map.RegionFontName = this.Settings.RegionFontName; map.RegionFontEmSize = this.Settings.RegionFontEmSize; map.RenderWaypoints = this.Settings.RenderWaypoints; map.WaypointFontColor = System.Drawing.Color.FromName(this.Settings.SelectedWaypointFontColorName); map.WaypointFontName = this.Settings.WaypointFontName; map.WaypointFontEmSize = this.Settings.WaypointFontEmSize; map.UseDataStore = this.Settings.UseDataStore; map.RenderWholeMap(this.Settings.MapFilePath, imagefilename, pois, (IProgressService)this); }; bw.RunWorkerCompleted += (s, a) => { this.m_Stopwatch.Stop(); this.IsRunning = false; if (a.Error != null) { this.StatusText = a.Error.GetType().ToString() + ": " + a.Error.Message.ToString(); } else { this.StatusText = String.Format("Done in {0}.", this.m_Stopwatch.Elapsed); } }; bw.RunWorkerAsync(); this.m_SaveFileDialog.InitialDirectory = System.IO.Path.GetDirectoryName(this.m_SaveFileDialog.FileName); } else { this.StatusText = "Export aborted."; } }
public static int Main(string[] args) { // Applikation ist "Windows-Anwendung" -> losgelöst von bestehender Konsole // App wird geladen, damit der MapRenderer Zugriff auf die Ressourcen hat. App app = new App(); if (args != null && args.Length > 0) { bool attached = false; bool helpRequested = false; try { // mit bestehender Konsole verbinden, sonst neue erstellen attached = AttachConsole(-1); if (!attached) { ShowConsoleWindow(); } // weil gelöst von aktueller Konsole war, steht jetzt der Prompt in der Zeile -> Zeile leeren int pos = Console.CursorLeft; Console.CursorLeft = 0; Console.Write(new String(' ', pos)); Console.CursorLeft = 0; // Argumente parsen AppSettings set = CommandLine <AppSettings> .Parse(args); // wenn Hilfe angefordert, dann diese ausgeben if (args.Contains("/?") || args.Contains("--help") || args.Contains("-h")) { CommandLine <AppSettings> .PrintHelp(); helpRequested = true; } else { IProgressService progress = new ConsoleOutput(); var mapfilename = System.IO.Path.GetFileNameWithoutExtension(set.MapFilePath); var mapdirectory = System.IO.Path.GetDirectoryName(set.MapFilePath); if (String.IsNullOrEmpty(set.ImageFilePath)) { set.ImageFilePath = System.IO.Path.Combine(mapdirectory, mapfilename + ".png"); } var pois = POI.FromCsvFile(set.PoiFilePath); // PlayerProfile hat den Namen der Map-Datei, nur mit der Endung .ttp string ttpfilename = System.IO.Path.Combine(mapdirectory, mapfilename + ".ttp"); var waypoints = POI.FromTtpFile(ttpfilename); pois = pois.Concat(waypoints); var map = new MapRenderer(); map.TileSize = (int)set.SelectedTileSize; map.RenderBackground = set.RenderBackground; map.RenderGrid = set.RenderGrid; map.GridSize = set.GridSize; map.GridColor = System.Drawing.Color.FromArgb(set.AlphaValue, System.Drawing.Color.FromName(set.SelectedGridColorName)); map.RenderRegionNumbers = set.RenderRegionNumbers; map.RegionFontName = set.RegionFontName; map.RegionFontEmSize = set.RegionFontEmSize; map.RenderWaypoints = set.RenderWaypoints; map.WaypointFontColor = System.Drawing.Color.FromName(set.SelectedWaypointFontColorName); map.WaypointFontName = set.WaypointFontName; map.WaypointFontEmSize = set.WaypointFontEmSize; map.UseDataStore = set.UseDataStore; map.RenderWholeMap(set.MapFilePath, set.ImageFilePath, pois, progress); } } catch (Exception ex) { var oldfore = Console.ForegroundColor; var oldback = Console.BackgroundColor; Console.ForegroundColor = ConsoleColor.Red; Console.BackgroundColor = ConsoleColor.Black; Console.WriteLine(ex.Message); Console.ForegroundColor = oldfore; Console.BackgroundColor = oldback; } finally { /* * Der auskommentierte Code sollte das Problem beheben, dass die Konsole nicht wieder auf den Prompt zurückspringt. * Grund für das Verhalten: Applikation ist eine "Windows-Anwendung" * Das Verhalten des Workarounds ist aber unlogisch, da einfach die Konsole aktiviert wird und damit das aktuelle Fenster seinen Fokus verliert. * Besonders nervig, falls man grade in einem anderen Fenster etwas tippt. * * Wird die Anwendung über einen Shortcut gestartet, dann tritt das Verhalten nicht auf und die Konsole schließt sich automatisch. */ //var hnd = GetConsoleWindow(); //bool res = false; //if (hnd != IntPtr.Zero) // res = SetForegroundWindow(hnd); if (!helpRequested) { Console.WriteLine("Please press Enter."); } if (attached) { FreeConsole(); } //if (res != false) if (helpRequested) { // normalen prompt wieder holen // HACK from http://stackoverflow.com/questions/1305257/using-attachconsole-user-must-hit-enter-to-get-%20regular-command-line/2463039#2463039 System.Windows.Forms.SendKeys.SendWait("{ENTER}"); } } } else { app.Run(new MainWindow()); } app.Shutdown(0); return(0); }