Autor Beitrag
Csharp-programmierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 15.09.16 17:42 
Hallo Forum,
ich arbeite an einem 27" Monitor. Wenn ich hier WinForm designe, möchte ich, dass das Programm schön groß ist. Wenn ich diese Anwendung nun auf meinem Laptop abspiele, sieht es schei*** aus, weil alles zu groß ist. Wie kann man das Programm an den Monitor anpassen?

Screenshot_13

Dann habe ich rechts noch so viel Platz, den man super nutzen kann, aber auf dem Laptop sieht dass dann viel zu überdimensioniert aus.
Einloggen, um Attachments anzusehen!
_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.09.16 17:51 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 15.09.16 18:02 
Ich meine die einzelnen Elemente darauf, dann sie auf einem kleinen Bildschirm automatisch kleiner gemacht werden. Geht das irgendwie?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 15.09.16 18:23 
Ähm die Größe von Bedienelementen ob die jemanden zu klein oder zu groß sind ist doch nicht das Problem deiner Anwendung. Das ist eine sehr individuelle Größe. Was für dich zu klein ist ist vielleicht für mich zu groß und das möglicherweise auf dem gleichen Monitor.

Es ist also etwas das ein User selbst für sich einstellen muß und das macht er in Windows nicht in den Anwendungen. Deine Anwendung sollte nur passend auf die Zoom Änderung von Windows bzw. dem User reagieren. Und die nicht ignoerieren oder noch noch schlimmer nur teilweise anwenden.

Wenn das mit dem Zoom in deiner Anwendung sauber funktioniert kannst du dich einem Idealzustand nur ungefähr nähern. Die Kombination aus Auflösung/Seitenverhältnis/Zoom u.s.w. sind so vielfältig das das nicht immer durch ein rein adaptives Layout toll aussehen kann. Z.b. benutze ich mein Surface meist hochkant. Möglicherweise passen dann drei deiner großen Knöpfe nicht nebeneinander. Wenn man schon so große Schaltflächen hat dann sollten die sauber umbrechen und nicht plötzlich Scrollbars auftauchen. Im Schlimmstenfall hast du dein Design so ausgelegt das es immer ein 16:9 Seitenverhältnis gibt. Nö kann natürlich auch 9:16 oder gleich ganz anders sein.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 15.09.16 18:43 
Und wie mache ich es, damit die Anwendung auf Windows Zoom reagiert?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.09.16 19:00 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 15.09.16 19:21 
In dem du den AutoScaleMode von ContainerControls (Forms, Panels, UserControls alles was andere Controls enthalten kann) passend setzt(einheitlich also nicht DPI Scaling mit Font Scaling mischen).
Dann hast du eine gewisse Chance das Winforms das richtig macht. Nur gewisse Chance deshalb weil die Winforms zugrunde liegende Technik älter ist als das Scaling/Zooming Feature und Windows und deshalb geht viel schief weil der alte Quatsch nicht mehr wirklich gepflegt wird.

Letztlich gibt es nicht die Methode die immer funktioniert (nicht in Winforms). Du musst regelmäßig überprüfen wie es in anderen Zoomstufen aussieht und dann je nach Problem controlspezifisch (was 3th Party Controls machen ist sowieso ein Hort steter Freude. Sei auf jegliche Überraschung gefasst) reagieren.
Und wenn du schon auf 2 Geräte schaust bedenke "bearbeite die Anwendung nicht auf Rechnern mit unterschiedlichen Zoomeinstellungen". Zumindest nicht die Winforms Teile. Die Zoomeinstellung hat Einfluß darauf wie die Form gespeichert wird. Am besten nur auf Rechner mit DPI Einstellung = 100% Winforms Formen designen. Den Hochskalieren funktioniert meist noch mittelprächtig, runterskalieren eher nie. Also Winforms bei 150% DPI Einstellungen designen und dann bei 100% betrachten/benutzen zu wollen ist in jedem nicht trivialen Formdesign ein kaum lösbares Problem.

@Frühlingsrolle: Autosizen geht vielleicht bei Labels(und sollte man da auch fast immer benutzen) aber eine Autosizing-TextBox wäre schon merkwürdig. So ein Design hab ich noch nicht gesehen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.09.16 20:24 
- Nachträglich durch die Entwickler-Ecke gelöscht -
berniebutt
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Di 04.10.16 13:57 
Du kannst die Funktion Scale() verwenden, z.B.
ausblenden C#-Quelltext
1:
2:
float scale = 1.15F;
this.Scale(scale)

Damit vergrösserst du die gesamte Form. Hol dir die aktuelle Bildschrmgrösse mit
ausblenden C#-Quelltext
1:
2:
int w = Screen.PrimaryScreen.Bounds.Width;
int h = Screen.PrimaryScreen.Bounds.Height;

und rechne den Skalierungsfaktor aus. Sinnvoll wäre auch eine Anpassung der Schriftgrössen, wofür
du neue Fonts zuweisen musst. Ich mache das so, um Anwendungen sowohl auf dem Desktop als
auch auf dem Tablet sinnvoll anzuzeigen.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Do 13.10.16 20:42 
Ich habe jetzt den AutoScaling auf DPI gesetzt. Auf dem Lappi jedoch sieht alles viel zu groß aus :(

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Sa 15.10.16 12:17 
user profile iconberniebutt meinte, man kann das Problem mit dem Scale Faktor lösen. Dazu habe ich einfach eine ListView, eine TextBox und einen Button auf ein Benutzersteuerelement gelegt. Wenn man ich die TextBox eine Zahl eingibt, dann wird diese geparst, wenn man den Button drückt und anschließend wird die ListView mit diesem Faktor skaliert.

Gebe ich 1 ein, verändert sich die ListView nicht. Ist ja klar.
Gebe ich 2 ein, verdoppelt sich die ListView in der Größe, ich auch klar.
Gebe ich wieder 1 ein, verschwindet die ListView von der Form, was ich nicht verstehe :(

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 15.10.16 16:34 
- Nachträglich durch die Entwickler-Ecke gelöscht -
berniebutt
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Mo 17.10.16 11:04 
Hinweis: Die Parse-Methode von float und double berücksichtigt für das
Dezimalzeichen die Ländereinstellung, also in DE das Komma! Eine Eingabe
1.00 liefert 100. Damit gerät die Skalierung ausserhalb des Bildschirms
und Dinge verschwinden.
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mo 17.10.16 16:06 
Naja.. Ich habe jetzt mal den Code von Frühlingsrolle kopiert und den Aufruf habe ich eine foreach Schleife gepackt...

ausblenden C#-Quelltext
1:
2:
3:
4:
foreach(var control in this.Controls)
{
        Methodenaufruf(control, 2f);
}


Und dann wieder auf 0.5f -> alles war verschwunden :gruebel:

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 17.10.16 16:33 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Di 18.10.16 16:53 
Ahh. Ich habe immer 0.5 statt 0,5 eingegeben. Demnach war das dann der Fehler... Naja jetzt funktioniert die Anwendung zum Teil.
In der DLL befinden sich auf einem UserControl 3 Panels nebeneinander, die wiederum Buttons usw. enthalten. Wenn ich das jetzt Skaliere, werden ja die Panels auch mit Skaliert, was dann einige Elemente aus dem Bildschirm wirft. Jetzt habe ich in die foreach Schleife eine If Abfrage gebaut, die guckt, ob c ein Panel ist oder nicht. Wenn es kein Panel ist, soll das Element skaliert werden, ansonsten nicht.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
private void button4_Click(object sender, EventArgs e)
        {
            float f = float.Parse(this.textBox1.Text);
            foreach(Control c in this.Controls)
            {
                if(c.GetType() != typeof(Panel))
                    MyScale(c, f);
            }
        }
        private void MyScale(Control control, float factor)
        {
            control.Width = (int)(control.Width * factor);
            control.Height = (int)(control.Height * factor);
            FontFamily fontFamily = control.Font.FontFamily;
            float fontSize = control.Font.Size;
            control.Font = new Font(fontFamily, fontSize * factor);
        }


Jeztz wird aber nur die Richtextbox im letzten Panel skaliert :(

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 18.10.16 17:12 
Zitat:
Jeztz wird aber nur die Richtextbox im letzten Panel skaliert :(


Dann liegt dieses Control nicht im Panel sondern über dem Panel.

Die Controls die in einem Panel liegen wirst du nur in der Controls Collection des Panels finden. Die Menge der Controls auf einer Form stellen keine Liste dar sondern einen Baum.
Also zum Beispiel Form.Controls enthält dein UserControl. UserControl.Controls enthält deine Panels. Das jeweilige Panel.Controls wiederum z.B. die Buttons auf diesem Panel usw.

Wenn du nur Panels direkt auf dem UserControl hast sollte deine Schleife nichts tun da in this.Controls dann nur Panels drin sind.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 18.10.16 21:01 
- Nachträglich durch die Entwickler-Ecke gelöscht -
raptor49
Hält's aus hier
Beiträge: 12

Win 10, Win 7, Open Suse
C# (VS 2017)
BeitragVerfasst: Di 18.10.16 22:35 
Für sowas gibts doch eigentlich UWP.


Zuletzt bearbeitet von raptor49 am Do 20.10.16 13:07, insgesamt 1-mal bearbeitet
Csharp-programmierer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 696
Erhaltene Danke: 10

Windows 8.1
C# (VS 2013)
BeitragVerfasst: Mi 19.10.16 20:03 
Vielen Dank! Jetzt funktioniert es mit den Größen der Steuerelemente. Aber wenn man die Größen jetzt überdimensioniert, kommt es zu Problemen mit den Locations. Einfach dann mit der Location das selbe machen, wie mit der Größe?

_________________
"Wer keinen Sinn im Leben sieht, ist nicht nur unglücklich, sondern kaum lebensfähig" - Albert Einstein