Form ändert nach starten des Programms den Style

  • C#

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von loeffel.

    Form ändert nach starten des Programms den Style

    Hallo Community,

    ich habe ein kleines Programm in C# und erstellt Windows Forms erstellt.
    Wenn ich auf den Button "Hole" klicke wird mittels GDI+ (Rectangle und Region) ein transparentes Rechteck auf der Form erzeug.
    Das funktioniert auch sehr gut.
    Sobald ich jedoch den Button "Hole" klicke ändert sich der Style meiner Form von modern (ich denke das nennt man WPF-Style) auf einen sehr alten Style (grau/ blau und Fenster nicht mit abgerundeten Ecken sondern spitzen Ecken).
    Woran liegt das und noch wichtiger wie kann ich das verhindern.
    Ich nutze Windows 10 mit allen Updates und Visual Studio 2017 mit allen Updates (SchulVersion).
    Ich hoffe dass Ihr mir da helfen könnte und bedanke mich schon jetzt.

    Hier der Source Code:

    C#-Quellcode

    1. private void Hole()
    2. {
    3. Size sz = new Size(485, 293);
    4. Point pt = new Point(80, 10);
    5. Rectangle rect = new Rectangle(pt, sz);
    6. Region region = new Region();
    7. rect.Inflate(-120, -100);
    8. region.Exclude(rect);
    9. Region = region;
    10. }


    Viele Grüße,
    Sebastian
    Bilder
    • U1.PNG

      4,65 kB, 467×283, 54 mal angesehen
    • U2.PNG

      13,65 kB, 484×294, 52 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @SebastianHuggbard Willkommen im Forum. :thumbup:
    Unter Windows 10 sehen die Formen im Designer deutlich anders aus als während der Laufzeit, das ist eben so.
    Auch die Größe der Form ist anders.
    Wenn Du kannst, probiere das in Windows 7 aus.
    Und:
    Das Forum bietet eine schmucke Funktionalität zum Anhängen von Bildern und anderen Dateien:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany vielen Dank für Dein Willkommen.
    Klar, dass die Formen im Designer anders aussehen.
    Es ist so wenn ich das Programm aus dem Studio heraus starte sieht die Form aus wie sie soll erst wenn ich den Button "Hole" drücke, dann ändert sie Ihr Aussehen, !!!!während der Laufzeit!!!!, auf altmodisch.
    Dieses Verhalten ist doch völlig unnormal!???

    Vielen Dank für Deine schnelle Antwort,
    Sebastian

    SebastianHuggbard schrieb:

    region.Exclude()
    Klar.
    Was ganz genau macht der Befehl Region.Exclude()?
    docs.microsoft.com/en-us/dotne…?view=dotnet-plat-ext-6.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Ich hoffe ich habe das richtig verstanden.
    Es wird nur der Teil geupdated der nicht die Rectanglestruktur betrifft?

    Hätte ich bzw. muss ich das ganze im PaintEvent der Form machen mit GraphicsPath.
    Die Fragerei tut mir Leid aber ich bin noch nicht so lange mit dabei, C# Programmierung mein ich.

    Ich komm einfach nicht drauf!!!!

    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    SebastianHuggbard schrieb:

    Ich komm einfach nicht drauf!
    Was wird denn in dem "Hole" angezeigt?
    Wie sieht denn Dein Hintergrundbild aus?
    Was passiert, wenn Du Dein Fenster mit der Maus verschiebst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Oh, da haben wir uns überschnitten.
    Im Hole wird der Desktophintergrund angezeigt da es ja transparent ist.
    Ein Hintergrundbild auf der Form gibt es nicht. Wenn ich die Form verschiebe passiert gar nichts, Sie lässt sich anstandslos verschieben und durch das Loch sieht man den Desktop vorbeiziehen.

    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @ErfinderDesRades
    Werde googeln! Vielen Dank für die Antwort
    Googeln, es scheint wohl so zu sein, dass die Form Immer ihren Style ändert sobald Region = myRegion benutzt wird. Ich habe nichts gefunden bei dem Löcher (Kreis, Vierek, Dreieck etc.) in eine Form geschnitten werden und die Form im Windows Style angezeigt wir. Es wird immer mit Hintergrundbildern gearbeitet die anstelle der eigentlichen Form angezeigt werden.

    Das ist sehr schade ;( ;( ;( ;(

    Falls Ihr aber noch Tipps habt, wäre immer offen!

    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @SebastianHuggbard Was genau soll denn passieren?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany
    Wenn ich auf den Button "Hole in another Universe" klicke soll sich das rechteckige Loch in der Form öffnen und die Form soll einfach ihr modernes Windows 10 Layout behalten und nicht in ein altes Windows irgendwas mit einem dicken SingleFixed Border wechseln.



    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @SebastianHuggbard Probier mal, das der @ErfinderDesRades vorschlug:

    C#-Quellcode

    1. private void Form1_Paint(object sender, PaintEventArgs e)
    2. {
    3. this.TransparencyKey = Color.Aqua;
    4. Size sz = new Size(485, 293);
    5. Point pt = new Point(80, 10);
    6. Rectangle rect = new Rectangle(pt, sz);
    7. rect.Inflate(-120, -100);
    8. e.Graphics.FillRectangle(Brushes.Aqua, rect);
    9. }
    Die Farbe selbst ist hier egal: Color.Aqua, Brushes.Aqua, es muss nur dieselbe sein.
    ====
    Den Eventhandler erstellst Du im Designer, die Form musst Du dann noch invalidisieren (this.Invalidate();), damit die Form neu dartgestellt wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    Sorry dass ich gestern nicht dazu kam mich an den Pc zu setzen aber mein Kühler ist explodiert <X !

    @ErfinderDesRades
    Alles klar werd ich versuchen aber dann bin ich auf ein Viereck d.h. die Form des Panels festgelegt.Kreise etc. werden so nicht klappen, oder?. Stimmt das?

    @RodFromGermany
    Wo findet das im invalidieren() statt? :S

    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @ErfinderDesRades
    @RodFromGermany

    8o Es funktioniert :thumbup:

    Ich habe einfach Deinen Code in mein FormPaint()-Ereignis geknallt :!:
    Aber warum funktioniert das ganze jetzt ohne invalidate() und wo müsste ich eigentlich das invalidate hinpacken?

    Eine Frage hab ich noch!
    Wenn ich möchte dass das durchsichtige Rechteck erst nach Klick auf einen Button erscheint wie mache ich das. Ich kann das Form_Paint() Ereignis doch nicht aus einem Button_Klick() Ereignis heraus aufrufen?.


    Vielen Dank an Euch beide!


    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SebastianHuggbard“ ()

    SebastianHuggbard schrieb:

    wo müsste ich eigentlich das invalidate hinpacken?
    In die Button_Click(), wenn Du mit Paint arbeitest.
    Poste mal Deinen relevanten Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was ich erreichen möchte ist, dass erst nach dem Klick auf den Button das Loch auf der Form sichtbar bzw. dargestellt wird! So wie es jetzt ist kann das nätürlich nicht klappen da das FormPaint() aufgerufen wird wenn die Form gezeichnet wird und nicht erst nach meinem Klick!
    Ich dachte ich müsste OnPaint(...) überschreiben aber dann bekomme ich der Funktion Hole() den Fehler dass e (e.Graphics.FillRectangle(Brushes.Aqua, rect);)nicht zugewiesen ist, was im übrigen auch völlig logisch ist.
    Aber wie mache ichs richtig????

    Hier mein Code:

    C#-Quellcode

    1. protected override void OnPaint(PaintEventArgs e)
    2. {
    3. base.OnPaint(e);
    4. }
    5. private void CmdTest_Click(object sender, EventArgs e)
    6. {
    7. Hole();
    8. this.Invalidate();
    9. }
    10. private void Hole()
    11. {
    12. Size sz = new Size(485, 293);
    13. Point pt = new Point(80, 10);
    14. Rectangle rect = new Rectangle(pt, sz);
    15. TransparencyKey = Color.Aqua;
    16. rect.Inflate(-120, -100);
    17. e.Graphics.FillRectangle(Brushes.Aqua, rect);
    18. }



    Viele Grüße,
    Sebastian

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „SebastianHuggbard“ ()

    @SebastianHuggbard Paint wie es gedacht ist funktioniert nur im Paint-Ereignis, das hab ich Dir in Post #12 beschrieben.
    Wenn, dann so:
    Spoiler anzeigen

    C#-Quellcode

    1. protected override void OnPaint(PaintEventArgs e)
    2. {
    3. base.OnPaint(e);
    4. Size sz = new Size(485, 293);
    5. Point pt = new Point(80, 10);
    6. Rectangle rect = new Rectangle(pt, sz);
    7. TransparencyKey = Color.Aqua;
    8. rect.Inflate(-120, -100);
    9. e.Graphics.FillRectangle(Brushes.Aqua, rect);
    10. }
    11. private void CmdTest_Click(object sender, EventArgs e)
    12. {
    13. this.Invalidate();
    14. }
    Vielleicht schwebt Dir so was vor, Form mit CheckBox und Paint-Event:
    Spoiler anzeigen

    C#-Quellcode

    1. [/spoiler][spoiler]using System.Drawing;
    2. using System.Windows.Forms;
    3. namespace WindowsFormsApp1
    4. {
    5. public partial class MainForm : Form
    6. {
    7. public MainForm()
    8. {
    9. this.InitializeComponent();
    10. }
    11. private void CheckBox1_CheckedChanged(object sender, System.EventArgs e)
    12. {
    13. this.Invalidate();
    14. }
    15. private void MainForm_Paint(object sender, PaintEventArgs e)
    16. {
    17. if (this.checkBox1.Checked)
    18. {
    19. Size sz = new Size(485, 293);
    20. Point pt = new Point(80, 10);
    21. Rectangle rect = new Rectangle(pt, sz);
    22. TransparencyKey = Color.Aqua;
    23. rect.Inflate(-120, -100);
    24. e.Graphics.FillRectangle(Brushes.Aqua, rect);
    25. }
    26. }
    27. }
    28. }


    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

    @RodFromGermany

    Vielen Dank für Deine Hilfe. Ich muss Paint() gar nicht überschreiben. Ich hab jetzt eine zusätzliche Funktion Hole geschrieben und die Variablen auf Klassenebene definiert. Später kann ich dann z.B. einen Timer einbauen der das Loch langsam vergrößert ;) .

    C#-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. private static Size sz = new Size(0, 0);
    4. private static Point pt = new Point(300,150);
    5. Rectangle rect = new Rectangle(pt, sz);
    6. Boolean cmdClicked = false;
    7. public Form1()
    8. {
    9. InitializeComponent();
    10. }
    11. protected override void OnPaint(PaintEventArgs e)
    12. {
    13. base.OnPaint(e);
    14. if(cmdClicked == true)
    15. {
    16. e.Graphics.FillRectangle(Brushes.Aqua, rect);
    17. cmdClicked = false;
    18. }
    19. }
    20. private void CmdTest_Click(object sender, EventArgs e)
    21. {
    22. Hole();
    23. cmdClicked = true;
    24. this.Invalidate();
    25. }
    26. private void Hole()
    27. {
    28. TransparencyKey = Color.Aqua;
    29. rect.Inflate(100, 100);
    30. }
    31. }


    Vielen Dank für Deine Hilfe und viele Grüße,
    Sebastian

    SebastianHuggbard schrieb:

    C#-Quellcode

    1. TransparencyKey = Color.Aqua;
    Diese Zeile kannst Du in den Konstruktor schreiben.
    Das hatte ich oben nur wegen der Kompaktizität des Snippets in die Prozedur geschrieben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!