Autor Beitrag
Fanalys
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 26.12.11 20:26 
Hallo,
ich bin ein Anfänger in Visual C# und habe mir vorgenommen ein Screenshot Programm zu schreiben. Ich habe aber bis jetzt nur, dass der Screenshot erstellt wird, gespeichert und dann die Vorschau erscheint. Ich möchte aber, dass der Screenshot erstellt wird, die Vorschau angezeigt wird, eine Messagebox erscheint die fragt, ob der Screenshot gespeichert werden soll oder nicht und dann halt gespeichert wird oder nicht!

Also:
1. Screenshot machen
2. Vorschau des Screenshots
3. Speichern ??? (Messagebox)
4. Speichern oder halt nicht

Bis jetzt vorhandener Code:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Imaging;

namespace Captue_the_Screen
{
    public partial class Form1 : Form
    {
        private static Bitmap bmp;
        private static Graphics gfx;
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //  **************************************************
            //  Screenshot wird erstellt.
            //  **************************************************
            this.Hide();
            Thread.Sleep(300);
            bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            gfx = Graphics.FromImage(bmp);
            gfx.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 00, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            //  **************************************************
            //  Screenshot wurde erstellt
            //  und soll jetzt gespeichert
            //  werden.
            //  **************************************************
            this.Show();
            Thread.Sleep(300);
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    //  **************************************************
                    //  Kein Fehler aufgetreten.
                    //  Bild wird gespeichert.
                    //  **************************************************
                    bmp.Save(saveFileDialog1.FileName, ImageFormat.Png);
                    MessageBox.Show("Screenshot wurde erfolgreich gespeichert!""Erfolgreich gespeichert");
                    //  **************************************************
                    //  Bild wird in die PictureBox
                    //  geladen.
                    //  **************************************************
                    Thread.Sleep(100);
                    pictureBox1.Image = Bitmap.FromFile(saveFileDialog1.FileName);
                }
                catch
                {
                    //  **************************************************
                    //  Fehler aufgetreten.
                    //  **************************************************
                    MessageBox.Show("Ein Fehler ist aufgetreten!""Fehler");
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //  **************************************************
            //  Programm wird beendet
            //  **************************************************
            this.Close();
        }
    }
}


Bitte um Hilfe!

MFG
Fanalys
Troubadix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 28
Erhaltene Danke: 9

WIN 7
C# (VS2010 Express)
BeitragVerfasst: Mo 26.12.11 21:05 
Hallo Fanalys,

auch wenn ich selbst noch Neuling hier bin, da ich der Erste bin der Antwortet: Herzlich willkommen im C-Sharp-Forum.

Da man hier eher Hilfe zur Selbsthilfe gibt, werde ich erstmal keinen fertigen Code hier rein setzen.

Um das Bild früher in die Vorschau zu bringen, musst Du eigentlich nur deiner Picturebox die Bitmap zuweisen die du vom Bildschirm erstellt hast. Das machst Du am besten direkt bevor oder nachdem du das Fenster wieder eingeblendet hast.

Danach machst du dann auch deine MessageBox zum nachfragen auf. Das Ergebnis kannst Du genau so abfragen wie beim SaveFileDialog (allerdings gibt es bei der MessageBox kein ShowDialog() sondern nur Show()). Wie Du die Buttons in die Messagebox bringst siehst Du hier: MessageBox.Show-Methode (String, String, MessageBoxButtons)

Ich hoffe das hilft Dir weiter. Wenn Du irgenwo nicht weiter kommst einfach noch mal nachfragen.

Gruß
Troubadix

Für diesen Beitrag haben gedankt: storestore
Fanalys Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 27.12.11 19:50 
Hallo Troubadix,
vielen Dank für den netten Willkommensgruss und die schnelle Antwort.

Ich brauche nochmal eure Hilfe!

Troubadix:
Danach machst du dann auch deine MessageBox zum nachfragen auf. Das Ergebnis kannst Du genau so abfragen wie beim SaveFileDialog (allerdings gibt es bei der MessageBox kein ShowDialog() sondern nur Show()). Wie Du die Buttons in die Messagebox bringst siehst Du hier: MessageBox.Show-Methode (String, String, MessageBoxButtons)

Vielen Dank, das habe ich hingekriegt!

Troubadix:
Um das Bild früher in die Vorschau zu bringen, musst Du eigentlich nur deiner Picturebox die Bitmap zuweisen die du vom Bildschirm erstellt hast. Das machst Du am besten direkt bevor oder nachdem du das Fenster wieder eingeblendet hast.

Wie weiße ich denn der Picturebox die Bitmap zu?


Vielen Dank im Vorraus
Fanalys
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4803
Erhaltene Danke: 1060

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 28.12.11 10:32 
Hallo und (nochmals 'offiziell') :welcome:

du weist der PictureBox doch bisher auch schon ein Bitmap zu (nur eben das geladene aus der Datei), d.h. Troubadix meint einfach
ausblenden C#-Quelltext
1:
pictureBox1.Image = bmp;					


P.S. Thread.Sleep() sollte man (eigentlich) niemals in dem Hauptthread (GUI) einer WinForms-Anwendung verwenden (im Gegensatz zu einem Konsolenprogramm), da es die GUI blockiert (und Windows dann irgendwann die Meldung "das Programm reagiert nicht" anzeigt).
Dazu gibt es unter Warum blockiert mein GUI? und Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) zwei Artikel (bzw. FAQs aus einem anderen C#-Forum) dazu.

Und du solltest dir angewöhnen - gleich beim Erzeugen - die Form- und Controlvariablen besser zu benennen (anstatt Form1, pictureBox1 etc.), z.B. CaptureForm, pictureBoxScreenshot etc.
Außerdem hast du "Captue_the_Screen" falsch geschrieben - da fehlt ein 'r' ;-)
Troubadix
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 28
Erhaltene Danke: 9

WIN 7
C# (VS2010 Express)
BeitragVerfasst: Mi 28.12.11 13:23 
Hallo!

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
P.S. Thread.Sleep() sollte man (eigentlich) niemals in dem Hauptthread (GUI) einer WinForms-Anwendung verwenden...

Ich kenne das Beispiel, dass Fanalys hier verwendet hat. Diese Sleep() sind da drin um Windows zeit zu geben das Fenster aus- bzw. einzublenden. Gerade beim Ausblenden soll das verhindern, dass das eigene Fenster mit auf den Screenshot kommt. Meiner Meinung nach macht dass in dem Fall auch Sinn. Ansonsten geb ich dir natürlich Recht, dass es eher ungünstig ist Sleep() im GUI-Thread zu verwenden.

Gruß
Troubadix