Entwickler-Ecke

Multimedia / Grafik - C# Projekt anders gestalten....


tomycat - Mi 23.08.17 16:59
Titel: C# Projekt anders gestalten....
hallo,
ich habe da ein Mega Projekt hinter mir.
Jetzt möchte ich gerne, am Besten Button klick, dass sich alle Button z.b. alle Kanten abgerundet sind und eine dicke Umrandung haben.
Soooooo ungefähr wie Norton oder Antivr soll mein Projekt am Ende aussehen.

Ich weis nicht wo ich ansetzen soll? Nach was googlet man am besten? Hat jemand eine Tut Seite?


Delete - Mi 23.08.17 17:33

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mi 23.08.17 22:00

Simpelste Lösung wäre etwa so.
https://stackoverflow.com/questions/28486521/rounded-edges-in-button-c-sharp-winforms

Sei dir bewusst das so aber einfach nur die Ecken abgeschnitten werden. Wenn du was wirklich schönes willst musst du arbeit investieren und das zeichnen komplett selbst übernehmen und nicht nur ein wenig an den Ecken feilen. Wenn du nicht den Standardlook willst gilt eigentlich fast immer komplett selber zeichnen. Den StandardLook mit einem kleinen Twist gibt es eher nicht. Winforms(und die dahinterliegenden Common Controls) sind für einen einheitlichen systemweiten Look ausgelegt die dem Themeing des OS unterliegen.


Th69 - Do 24.08.17 09:31

In meinem Beitrag zu myCSharp.de - Eigene Button Klasse erstellen [http://www.mycsharp.de/wbb2/thread.php?postid=3669224#post3669224] hatte ich mal weitere Links aufgelistet.


Delete - Do 24.08.17 09:56

- Nachträglich durch die Entwickler-Ecke gelöscht -


doublecross - Fr 25.08.17 14:06

Hi,

also ich würde bei dem Thema auf eine WPF Oberfläche setzen. Diese wird ohnehin immer komplett unabhängig von den echten Windows Controls gezeichnet und die Definitonen wie dies zu geschehen hat können beliebig geändert werden. In einem Buch habe ich mal gesehen, das der Autor Sternförmige Button definierte, ich weiß aber nicht mehr welches es war.

Ein Beispiel für einen abgerundeten Button das ich auf die schnelle ergoogled [https://social.msdn.microsoft.com/Forums/en-US/511f354d-8cc6-4149-8b3a-e7084eb71db7/button-with-rounded-corners?forum=wpf] habe wäre:


XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
<Button x:Name="btnBack" Grid.Row="2" Width="300"
                            Click="btnBack_Click">
                    <Button.Template>
                        <ControlTemplate>
                            <Border CornerRadius="10" Background="#463190">
                                <TextBlock Text="Retry" Foreground="White" 
                                           HorizontalAlignment="Center"                                           
                                           Margin="0,5,0,0"
                                           Height="40"
                                           FontSize="20"></TextBlock>
                            </Border>
                        </ControlTemplate>
                    </Button.Template>
                </Button>


Chiyoko - So 27.08.17 00:48

Wenn deine Anwendung einen bestimmten Stil bekommen soll, könntest du auch Grafiken benutzen und den Transparency Key setzen.
Das ginge selbst dann, wenn die Buttons undefinierte Größen haben (z.b. mit Frames).

Beispiel:
user defined image [https://www.imagebanana.com/s/797/OcaxAbin.html]


Zu WPF würde ich auch tendieren, sofern man sich damit anfreunden mag.


tomycat - Do 31.08.17 20:37

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Guten Tag tomycat,

schau dir dazu die Funktionen CreateRoundRectRgn() [https://msdn.microsoft.com/en-us/library/windows/desktop/dd183516(v=vs.85).aspx] und SetWindowRgn() [https://msdn.microsoft.com/de-de/library/windows/desktop/dd145102(v=vs.85).aspx] an.
In der ersten Funktion wird die Form/Rundung bestimmt. Der Rückgabetyp ist laut Doku ein HRGN, dürfte in C# einem IntPtr entsprechen.
Der zweiten Funktion gibt man das Handle des Buttons mit, sowie den Rückgabewert der ersten Funktion.

Die dicke Umrandung zeichnest du z.B. mit Graphics.DrawRectangle() [https://msdn.microsoft.com/de-de/library/sx8yykw8(v=vs.110).aspx].

Mehr brauchst du nicht. Jetzt liegt es an dir.


thx, deine Antwort schmeckt mir am besten. :-)
ich habe ein bischen herumgegoogelt, kann mich mir ein Beispiel machen mit Graphics.DrawRectangle() oder mir ein link mit einenm Tut posten?


Delete - Fr 01.09.17 05:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


tomycat - Sa 02.09.17 20:55

@Frühlingsrolle
ich studiere gerade deinen Quellcode, ca.90 % ist er mir klar, will aber die 100 % ereichen. :-)
Was mache ich mit buttonEx1, die sind rot ?

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:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
        public class ButtonEx : Button
        {
            private byte _cornerRadian = 0;

            private Rectangle _rect = new Rectangle();
            private Color _rectColor = SystemColors.Control;
            private byte _rectWidth = 0;
            private Pen _pen = new Pen(SystemColors.Control);


            public ButtonEx() { }

            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                _rect = ClientRectangle;
                _rect.Inflate(-_rectWidth + 2, -_rectWidth + 2);
                _pen.Color = _rectColor;
                _pen.Width = _rectWidth;
                e.Graphics.DrawRectangle(_pen, _rect);
            }

            [Browsable(true)]
            public Color RectColor
            {
                get { return _rectColor; }
                set
                {
                    if (_rectColor != value)
                    {
                        _rectColor = value;
                        //_pen.Color = _rectColor; 
                        this.Refresh();
                    }
                }
            }

            [Browsable(true)]
            public byte RectWidth
            {
                get { return _rectWidth; }
                set
                {
                    if (_rectWidth != value)
                    {
                        _rectWidth = value;
                        //_pen.Width = _rectWidth; 
                        this.Refresh();
                    }
                }
            }

            [Browsable(true)]
            public byte CornerRadian
            {
                get { return _cornerRadian; }
                set
                {
                    if (_cornerRadian != value)
                    {
                        _cornerRadian = value;
                        IntPtr hRgn = CreateRoundRectRgn(00, Width, Height, _cornerRadian * 2, _cornerRadian * 2);  // eventuell (optische) Anpassungen vornehmen 
                        SetWindowRgn(Handle, hRgn, true);
                    }
                }
            }

            [DllImport("Gdi32.dll")]
            public static extern IntPtr CreateRoundRectRgn(
                int nLeftRect,
                int nTopRect,
                int nRightRect,
                int nBottomRect,
                int nWidthEllipse,
                int nHeightEllipse);

            [DllImport("User32.dll")]
            public static extern int SetWindowRgn(
                IntPtr hWnd,
                IntPtr hRgn,
                bool bRedraw);
        }

        // Aufruf
        
        private void button1_Click(object sender, EventArgs e)
        {
            buttonEx1.CornerRadian = 6;  // Kantenabrundung(-sradius)
            buttonEx1.RectColor = Color.Blue;  // blauer Rahmen innerhalb ...
            buttonEx1.RectWidth = 6;  // ..
        }
    }
}


Delete - Sa 02.09.17 21:40

- Nachträglich durch die Entwickler-Ecke gelöscht -


tomycat - Sa 02.09.17 22:10


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  private void button1_Click(object sender, EventArgs e)
        {
            ButtonEx button1x = new ButtonEx();
            button1x.CornerRadian = 2;  // Kantenabrundung(-sradius)
            button1x.RectColor = Color.Blue;  // blauer Rahmen innerhalb ...
            button1x.RectWidth = 2;  // ..
            Controls.Add(button1x);
        }


thx, hmmmm ich habe ca.200 Button viele Textboxen und die Postionen passen sich nach verschiedenen usern an. Ich suche eine Lösung für:
Ich erstelle ein neues Projekt, ziehe 10 Buttons in mein Projekt, Button1 soll alle Buttons (umrandung / Ecken abrunden ) verändern. Ich will statische Buttons verändern. :-)


Delete - So 03.09.17 03:03

- Nachträglich durch die Entwickler-Ecke gelöscht -


tomycat - Mo 04.09.17 20:10

zu meinem Grundwissen:
Ich ziehe einen Button von der Toolbox in meine Form1
Dann schreibe ich Button1. und dann kommt meine Auswahl wie versteken unsichbar... Postion.
Leider kommt kein Button1.CornerRadian Da endet mein Grundwissen.:-)


Ralf Jansen - Mo 04.09.17 20:32

Zitat:
Ich ziehe einen Button von der Toolbox in meine Form1


Ähm du hast da einen neuen Button. Also ziehst du diesen (ButtonEx) auf die Form und keinen Button. Falls es dir nicht bewusst ist. Um das Button Verhalten zu ändern musst du alle Buttons gegen ButtonEx austauschen.


Delete - Di 05.09.17 01:04

- Nachträglich durch die Entwickler-Ecke gelöscht -


Delete - Fr 08.09.17 05:59

- Nachträglich durch die Entwickler-Ecke gelöscht -