DPI Form anpassen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Westerwälder.

    DPI Form anpassen

    Guten Morgen,

    habe am Wochenende versucht, meine Anwendung an einen HDMI Monitor (28 Zoll) anzupassen.
    Einstellung: 3.840 x 2.160; Skalierung 200%

    Die Einträge in der Mainifest und App.config habe ich gemacht und die Anwendung startet auch mit der hohen Auflösung.

    Da das Programm von mehreren Personen genutzt wird, gibt es ein Setting für Schriftname und Schriftgrösse.
    Bevor eine Form sichtbar wird, durchläuft es eine Sub und weisst der Form die Schrift zu.

    Die Formen haben zu 90% den gleichen Aufbau.
    Auf der Form liegt ein TableLayoutPanel.
    2 Spalten, jeweils 50%.

    Zeile1: Absolut 20 Pixel (Inhalt: ToolStripmenu; Dock Fill)
    Zeile2: Absolut 30 Pixel (Inhalt: Panel, Dock Fill)
    Zeile3: 100% (Inhalt Spalte1: Datagridview, Spalte2: Panel; beide Dock Fill)

    Die Controls bzw. das Toolstripmenue in den Zeilen 1 und 2 (Absolut) passen sich nicht wirklich an.
    Oft liegt in Zeile 2 ein TabControl. Die Darstellung ist auch hier fehlerhaft.

    Spoiler anzeigen


    VB.NET-Quellcode

    1. Public Sub Form_Initalisieren(ByVal WinForm As Form, Optional Journalschreiben As Boolean = True, Optional Ladungsanzeige As Boolean = False)
    2. AppForm = WinForm
    3. If FormLadung.Visible Then FormLadung.Close()
    4. If Ladungsanzeige Then
    5. FormLadung.Label_Ausgabe.Text = "Öffne " & WinForm.Text & " ..."
    6. FormLadung.Show()
    7. FormLadung.Label_Ausgabe.Refresh()
    8. End If
    9. With WinForm
    10. .Visible = False
    11. .Opacity = 0
    12. .Visible = True
    13. .Font = Schrift
    14. .ShowInTaskbar = False
    15. ' .AutoScaleMode = AutoScaleMode.Dpi
    16. End With
    17. ' ControlsDurchlaufen(WinForm)
    18. ' Exit Sub
    19. For Each Element As Control In WinForm.Controls
    20. Element.Font = Schrift
    21. For Each Tpl As Control In Element.Controls
    22. Tpl.Font = Schrift
    23. For Each Pan As Control In Tpl.Controls
    24. Pan.Font = Schrift
    25. Next Pan
    26. Next Tpl
    27. Next Element
    28. For Each TSM As ToolStrip In WinForm.Controls.OfType(Of ToolStrip)()
    29. TSM.BackColor = Farbe_Toolstrip
    30. TSM.Font = Schrift
    31. For Each TSLabel As ToolStripLabel In TSM.Items.OfType(Of ToolStripLabel)
    32. If TSLabel.Name = "TS_Copyright" Then
    33. TSLabel.Text = Vorlagen.Copyright_Kurz
    34. TSLabel.ToolTipText = Vorlagen.Copyright_Lang
    35. End If
    36. Next TSLabel
    37. SystemToolstrip_Formatieren(TSM, Schrift, Farbe_Toolstrip)
    38. Next TSM
    39. For Each TLPanel As TableLayoutPanel In WinForm.Controls.OfType(Of TableLayoutPanel)
    40. TLPanel.Font = Schrift
    41. For Each TDGV As DataGridView In TLPanel.Controls.OfType(Of DataGridView)
    42. With TDGV
    43. .DefaultCellStyle.Font = Schrift
    44. .ColumnHeadersDefaultCellStyle.Font = Schrift
    45. End With
    46. Next TDGV
    47. 'For Each MePanel As Panel In TLPanel.Controls.OfType(Of Panel)
    48. ' MePanel.Font = Schrift
    49. 'Next MePanel
    50. For Each TSM As ToolStrip In TLPanel.Controls.OfType(Of ToolStrip)()
    51. 'For Each PPanel As Panel In TLPanel.Controls.OfType(Of Panel)
    52. ' PPanel.Font = Schrift
    53. ' For Each TTBox As TextBox In PPanel.Controls.OfType(Of TextBox)
    54. ' TTBox.Font = Schrift
    55. ' Next TTBox
    56. ' For Each TLabel As Label In PPanel.Controls.OfType(Of Label)
    57. ' TLabel.Font = Schrift
    58. ' Next TLabel
    59. 'Next PPanel
    60. TSM.BackColor = Farbe_Toolstrip
    61. TSM.Font = Schrift
    62. For Each TSLabel As ToolStripLabel In TSM.Items.OfType(Of ToolStripLabel)
    63. If TSLabel.Name = "TS_Copyright" Then
    64. TSLabel.Text = Vorlagen.Copyright_Kurz
    65. TSLabel.ToolTipText = Vorlagen.Copyright_Lang
    66. End If
    67. Next TSLabel
    68. SystemToolstrip_Formatieren(TSM, Schrift, Farbe_Toolstrip)
    69. Next TSM
    70. Next TLPanel
    71. If Journalschreiben Then Journal.Programm.Schreiben("Öffne App " & WinForm.Name)
    72. End Sub
    73. Public Sub SystemToolstrip_Formatieren(ByVal SysToolStrip As ToolStrip, ByVal SchriftTS As Font, ByVal FarbeTS As Color)
    74. SysToolStrip.BackColor = FarbeTS
    75. SysToolStrip.Font = SchriftTS
    76. Dim HForm As Form = SysToolStrip.FindForm
    77. For Each _Label In SysToolStrip.Items.OfType(Of ToolStripLabel)()
    78. With _Label
    79. .BackColor = FarbeTS
    80. .Font = Font.FromHfont(SchriftTS.ToHfont)
    81. End With
    82. Next
    83. For Each _Seperator In SysToolStrip.Items.OfType(Of ToolStripSeparator)()
    84. With _Seperator
    85. .BackColor = FarbeTS
    86. .ForeColor = FarbeTS
    87. End With
    88. Next
    89. For Each _Textbox In SysToolStrip.Items.OfType(Of ToolStripTextBox)()
    90. With _Textbox
    91. .BackColor = FarbeTS
    92. .Font = Font.FromHfont(SchriftTS.ToHfont)
    93. End With
    94. Next
    95. For Each _Button In SysToolStrip.Items.OfType(Of ToolStripButton)()
    96. With _Button
    97. .BackColor = FarbeTS
    98. .Font = Font.FromHfont(SchriftTS.ToHfont)
    99. End With
    100. Next
    101. For Each _Combobox In SysToolStrip.Items.OfType(Of ToolStripComboBox)()
    102. With _Combobox
    103. .BackColor = FarbeTS
    104. .Font = Font.FromHfont(SchriftTS.ToHfont)
    105. End With
    106. Next
    107. For Each _DDButton In SysToolStrip.Items.OfType(Of ToolStripDropDownButton)()
    108. With _DDButton
    109. .BackColor = FarbeTS
    110. .Font = Font.FromHfont(SchriftTS.ToHfont)
    111. End With
    112. For Each _MenueItem In _DDButton.DropDownItems.OfType(Of ToolStripMenuItem)()
    113. With _MenueItem
    114. .BackColor = FarbeTS
    115. .Font = Font.FromHfont(SchriftTS.ToHfont)
    116. End With
    117. SystemToolStrip_Formatieren_SubItems(_MenueItem, HForm, SchriftTS, FarbeTS)
    118. Next
    119. Next
    120. For Each _Splitbutton In SysToolStrip.Items.OfType(Of ToolStripSplitButton)()
    121. With _Splitbutton
    122. .BackColor = FarbeTS
    123. .Font = Font.FromHfont(SchriftTS.ToHfont)
    124. End With
    125. For Each _MenueItem In _Splitbutton.DropDownItems.OfType(Of ToolStripMenuItem)()
    126. With _MenueItem
    127. .BackColor = FarbeTS
    128. .Font = Font.FromHfont(SchriftTS.ToHfont)
    129. End With
    130. SystemToolStrip_Formatieren_SubItems(_MenueItem, HForm, SchriftTS, FarbeTS)
    131. Next
    132. Next
    133. End Sub
    134. Private Sub SystemToolStrip_Formatieren_SubItems(ByVal Eintrag As ToolStripMenuItem, HForm As Form, ItemSchrift As Font, ItemFarbe As Color)
    135. For Each _SubMenueItem In Eintrag.DropDownItems.OfType(Of ToolStripMenuItem)()
    136. With _SubMenueItem
    137. .BackColor = ItemFarbe
    138. .Font = Font.FromHfont(ItemSchrift.ToHfont)
    139. End With
    140. SystemToolStrip_Formatieren_SubItems(_SubMenueItem, HForm, ItemSchrift, ItemFarbe)
    141. Next
    142. End Sub




    Ändern des AutoScaleMode bringt auch keinen Erfolg.
    Bilder
    • Form.png

      110,08 kB, 3.840×2.160, 123 mal angesehen
    Gruß Markus
    @Westerwälder Du musst den Size der Font Deiner Forms mit dem DPI-Faktor multiplizieren.
    Leider gibt es Controls, die das ganze ignorieren.
    Ich hab mir da ne BaseClass zu gebaut:
    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Basisklasse zum Ignorieren der DPI-Settings des Betriebssystems.
    3. /// Formen, in denen DPI-abhängige Controls enthalten sind,
    4. /// müssen direkt von FormBase ableiten
    5. /// </summary>
    6. [System.ComponentModel.DesignerCategory("Code")]
    7. public class FormBaseNoDpi
    8. : Form
    9. {
    10. #region NoDpi Stuff
    11. /// <summary>
    12. /// Skalierungsfaktor, wird für separate Fonts in Dialogen benötigt
    13. /// </summary>
    14. protected float DpiFactor { get; private set; }
    15. /// <summary>
    16. /// Spezieller Konstruktor ohne Veränderung des Initial-Fonts
    17. /// </summary>
    18. /// <param name="flag">Flag zur Unterscheidung der Konstruktoren</param>
    19. public FormBaseNoDpi(bool flag)
    20. {
    21. this.DpiFactor = 1;
    22. }
    23. /// <summary>
    24. /// Spezieller Konstruktor zur Bereitstellung des Initial-Fonts
    25. /// </summary>
    26. public FormBaseNoDpi()
    27. {
    28. //this.DpiFactor = 96f / this.CreateGraphics().DpiX;
    29. using (Graphics g = this.CreateGraphics())
    30. {
    31. this.DpiFactor = 96f / g.DpiX;
    32. }
    33. //if (this.Font != null)
    34. //{
    35. // // Dies knallt beim Instanziieren von z.B. TextBoxen!!!
    36. // this.Font.Dispose();
    37. //}
    38. // Make the GUI ignore the DPI setting
    39. this.Font = new Font(this.Font.Name, 8.25f * this.DpiFactor, this.Font.Style, this.Font.Unit, this.Font.GdiCharSet, this.Font.GdiVerticalFont);
    40. }
    41. #endregion NoDpi Stuff
    42. }
    Wenn Du separate Fonts erstellst, müssen die auch diesen Faktor bekommen.
    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!
    Hallo Rod,

    habe das so berechnet und erhalte einen Faktor von 0.5.
    Die Schriftgrösse halbiert sich, die Controls bleiben wie beschrieben.

    VB.NET-Quellcode

    1. If DPIFaehig Then
    2. SchriftGroesse = CInt(SchriftGroesse * DPIFaktor)
    3. End If
    4. Schrift = New Font(SchriftName, SchriftGroesse, FontStyle.Regular, GraphicsUnit.Point)


    Die Schriftgrösse ist als Integer definiert. Habe deine Version (8.25F * Dipfactor) versucht, ändert sich auch nur die Schriftgrösse.

    Wie kann ich diesen Wert protected float DpiFactor { get; private set; } an eine andere Klasse übergeben?
    Gruß Markus

    Westerwälder schrieb:

    an eine andere Klasse übergeben?
    Falls die andere Klasse eine Form ist:
    Schieb die als neue Basisklasse zwischen Form und Form1:
    Statt

    VB.NET-Quellcode

    1. Form1 Inherits Form

    machst Du

    VB.NET-Quellcode

    1. Form1 Inherits FormBaseNoDpi
    Andere Fälle sollten nicht vorkommen.
    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!
    @Westerwälder Wozu braucht eine Nicht-GUI-Klasse diesen Faktor?
    Wenn diese Klasse instanziiert wird, kannst Du doch den Faktor aus der aktuellen Form rüberreichen.
    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!
    Ok, wenn ich das richtige verstehe hat jede Form einen anderen DPI-Faktor.
    Nun möchte ich ja nicht auf jede Form (sind jede Menge) die Klasse legen.

    Jede Form durchläuft vor dem Öffnen die

    Public Sub Form_Initalisieren(ByVal WinForm As Form, Optional Journalschreiben As Boolean = True, Optional Ladungsanzeige As Boolean = False) (Code oben im Spoiler Post #1 enthalten)

    Ist es denn möglich die ankommende Form in dieser Sub an deine Klasse zu übergeben und damit den DPIFactor zu bekommen?
    Mit diesem könnte dann in der Monitorklasse weiter gearbeitet werden.

    Habe folgendes in deiner Klasse hinzugefügt:

    VB.NET-Quellcode

    1. Public Function DPIFaktor(ByVal XForm As Form) As Single
    2. Using g As Graphics = XForm.CreateGraphics
    3. Return 96.0F / g.DpiX
    4. End Using
    5. End Function


    Bekomme immer den Faktor 0.5 zurück. Die Formen haben unterschiedliche Größen.
    200% Skalierung entspricht 192 DPI, das sind die 96 * 2

    Erstellt wurde das Projekt (alle Formen) mit Segoe UI; 8,25pt

    Microsoft schreibt:
    Beliebige Kombinationen aus DPI- und Schriftartskalierungsmodi werden nicht unterstützt. Obwohl Sie ein Benutzersteuerelement mithilfe eines Modus (z. B. DPI) skalieren und ohne Probleme auf einem Formular platzieren können, für das ein anderer Modus (Schriftart) verwendet wird, kann es zu unerwarteten Ergebnissen kommen, wenn Sie ein Grundformular in einem Modus mit einem abgeleiteten Formular in einem anderen Modus mischen.

    docs.microsoft.com/de-de/dotne…-scaling-in-windows-forms
    Gruß Markus

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Westerwälder“ ()

    Habe ein wenig rum getest:

    Mit dieser Einstellung

    VB.NET-Quellcode

    1. With WinForm
    2. .Font = New Font(SchriftName, 48.25F * DPIFaktor, .Font.Style, .Font.Unit, .Font.GdiCharSet, .Font.GdiVerticalFont)
    3. End With


    wird die Form Internetbrowser korrekt angezeigt.
    Nur sind hier die Inhalte des Webbrowsercontrol weiterhin sehr klein. Schrift wurde nicht geändert.

    Die Form Startmenue hat nun die doppelte Höhe, welche sie eigentlich haben sollte.
    Schrift ist sehr klar. Schriften im DGV etwas zu klein.
    Bilder
    • Startform.png

      286,49 kB, 3.840×2.160, 88 mal angesehen
    • Webbrowser.png

      158,69 kB, 3.840×2.160, 91 mal angesehen
    Gruß Markus

    Westerwälder schrieb:

    hat jede Form einen anderen DPI-Faktor.
    Nein.
    Jede Form hat ihren eigenen aber gleichen Faktor.
    Im Prinzip kannst Du das auch static / Shared im Programm machen.
    Nur, wie gesagt, manche Controls machen das nicht mit.

    Westerwälder schrieb:

    Schriften im DGV etwas zu klein.
    Da musst Du ein wenig mit separaten Fonts runspielen.
    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!

    Westerwälder schrieb:

    ändern sich die Panel's und Control's die daraufliegen mit.
    Die haben alle ihren eigenen Font, sieh Dir einfach mal deren Properties an.
    Musste rumspielen.
    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!
    Dafür könnte es eigentlich was fertiges geben, aber gut.

    Problem 1, TabelLayoutPanel
    Hier muss ich jede Zeile auf der sich ein Control befindet, auf .RowStyles(0).SizeType = SizeType.AutoSize stellen.
    Nur wie bekomme ich die Zeilennummer raus?
    Ansatz:

    VB.NET-Quellcode

    1. If FMControl.GetType().Equals(GetType(TableLayoutPanel)) Then
    2. FMTLPanel = CType(FMControl, TableLayoutPanel)
    3. With FMTLPanel
    4. .Font = Appform.Font
    5. .RowStyles(0).SizeType = SizeType.AutoSize
    6. For Each EContr As Control In .Controls
    7. FMTLPanel.GetRow(EContr)
    8. .RowStyles(?).SizeType = SizeType.AutoSize ' Hier fehlt der RowIndex
    9. Next EContr
    10. End With
    11. End If


    Datagridview zeigt sich sehr unbeeindruckt von der Formatierung.
    Anzatz hier:

    VB.NET-Quellcode

    1. For Each DGV As DataGridView In FMControl.Controls.OfType(Of DataGridView)()
    2. FMDGV = CType(DGV, DataGridView)
    3. With FMDGV
    4. .DefaultCellStyle.Font = Appform.Font
    5. .ColumnHeadersDefaultCellStyle.Font = Appform.Font
    6. End With
    7. Next DGV


    Weiss man denn, ob Microsoft hinsichtlich HDMI-Monitore was plant?
    Selbst die IDE im Designer funktioniert da nicht.

    Denke nicht das man das in der Form akzeptieren kann:
    Bilder
    • Tagesstatistik.png

      223,81 kB, 3.840×2.160, 82 mal angesehen
    Gruß Markus

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Westerwälder“ ()

    Westerwälder schrieb:

    Dafür könnte es eigentlich was fertiges geben
    Möglicherweise WPF, weißichnich.
    Ich kann Dir aber jetzt nicht sagen, welche Controls das betrifft, wo das nicht geht.
    Ich hab da auch rumgebastelt und an einigen Stellen, weil es nicht ging, das DPI-Sizing zurückgezogen.
    Allerdings habe ich nicht so ne riesige Auflösung vorrätig.
    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 mir so seltsam vorkommt ist,
    arbeite immer mit der Schriftgrösse 11.
    Nun gebe ich die Schriftgrösse 22 an bei einem DPI-Faktor von 0,5.
    Bin kein Mathematiker, aber für mich ist das das selbe Ergebnis.
    Mein Hauptproblem ist das TableLayoutPanel (siehe Post #12).
    Kann man das lösen? Ansonsten kann ich die DPI-Skalierung sein lassen.
    Gruß Markus
    @Westerwälder Kannst Du mal ne Testform machen und den Designercode posten?
    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!
    Bitte schön.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
    2. Partial Class Testform
    3. Inherits System.Windows.Forms.Form
    4. 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
    5. <System.Diagnostics.DebuggerNonUserCode()> _
    6. Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    7. Try
    8. If disposing AndAlso components IsNot Nothing Then
    9. components.Dispose()
    10. End If
    11. Finally
    12. MyBase.Dispose(disposing)
    13. End Try
    14. End Sub
    15. 'Wird vom Windows Form-Designer benötigt.
    16. Private components As System.ComponentModel.IContainer
    17. 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich.
    18. 'Das Bearbeiten ist mit dem Windows Form-Designer möglich.
    19. 'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
    20. <System.Diagnostics.DebuggerStepThrough()> _
    21. Private Sub InitializeComponent()
    22. Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Testform))
    23. Me.TLPanel_Menue = New System.Windows.Forms.TableLayoutPanel()
    24. Me.ToolStrip_Menue = New System.Windows.Forms.ToolStrip()
    25. Me.TS_Aus = New System.Windows.Forms.ToolStripButton()
    26. Me.Sep_Aus = New System.Windows.Forms.ToolStripSeparator()
    27. Me.Label_ObenLinks = New System.Windows.Forms.Label()
    28. Me.Label_ObenRechts = New System.Windows.Forms.Label()
    29. Me.DataGridView1 = New System.Windows.Forms.DataGridView()
    30. Me.Panel_Steuerung = New System.Windows.Forms.Panel()
    31. Me.Panel_Titel = New System.Windows.Forms.Panel()
    32. Me.DataGridView2 = New System.Windows.Forms.DataGridView()
    33. Me.CheckBox1 = New System.Windows.Forms.CheckBox()
    34. Me.TLPanel_Menue.SuspendLayout()
    35. Me.ToolStrip_Menue.SuspendLayout()
    36. CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).BeginInit()
    37. Me.Panel_Titel.SuspendLayout()
    38. CType(Me.DataGridView2, System.ComponentModel.ISupportInitialize).BeginInit()
    39. Me.SuspendLayout()
    40. '
    41. 'TLPanel_Menue
    42. '
    43. Me.TLPanel_Menue.ColumnCount = 2
    44. Me.TLPanel_Menue.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
    45. Me.TLPanel_Menue.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
    46. Me.TLPanel_Menue.Controls.Add(Me.Panel_Titel, 0, 3)
    47. Me.TLPanel_Menue.Controls.Add(Me.ToolStrip_Menue, 0, 0)
    48. Me.TLPanel_Menue.Controls.Add(Me.Label_ObenLinks, 0, 1)
    49. Me.TLPanel_Menue.Controls.Add(Me.Label_ObenRechts, 1, 1)
    50. Me.TLPanel_Menue.Controls.Add(Me.DataGridView1, 0, 2)
    51. Me.TLPanel_Menue.Controls.Add(Me.Panel_Steuerung, 1, 2)
    52. Me.TLPanel_Menue.Controls.Add(Me.DataGridView2, 0, 4)
    53. Me.TLPanel_Menue.Dock = System.Windows.Forms.DockStyle.Fill
    54. Me.TLPanel_Menue.Location = New System.Drawing.Point(0, 0)
    55. Me.TLPanel_Menue.Name = "TLPanel_Menue"
    56. Me.TLPanel_Menue.RowCount = 5
    57. Me.TLPanel_Menue.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
    58. Me.TLPanel_Menue.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
    59. Me.TLPanel_Menue.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
    60. Me.TLPanel_Menue.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30.0!))
    61. Me.TLPanel_Menue.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
    62. Me.TLPanel_Menue.Size = New System.Drawing.Size(1140, 743)
    63. Me.TLPanel_Menue.TabIndex = 0
    64. '
    65. 'ToolStrip_Menue
    66. '
    67. Me.TLPanel_Menue.SetColumnSpan(Me.ToolStrip_Menue, 2)
    68. Me.ToolStrip_Menue.Dock = System.Windows.Forms.DockStyle.Fill
    69. Me.ToolStrip_Menue.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden
    70. Me.ToolStrip_Menue.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.TS_Aus, Me.Sep_Aus})
    71. Me.ToolStrip_Menue.Location = New System.Drawing.Point(0, 0)
    72. Me.ToolStrip_Menue.Name = "ToolStrip_Menue"
    73. Me.ToolStrip_Menue.Size = New System.Drawing.Size(1140, 20)
    74. Me.ToolStrip_Menue.TabIndex = 0
    75. Me.ToolStrip_Menue.Text = "ToolStrip1"
    76. '
    77. 'TS_Aus
    78. '
    79. Me.TS_Aus.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
    80. Me.TS_Aus.Image = CType(resources.GetObject("TS_Aus.Image"), System.Drawing.Image)
    81. Me.TS_Aus.ImageTransparentColor = System.Drawing.Color.Magenta
    82. Me.TS_Aus.Name = "TS_Aus"
    83. Me.TS_Aus.Size = New System.Drawing.Size(31, 17)
    84. Me.TS_Aus.Text = "Aus"
    85. '
    86. 'Sep_Aus
    87. '
    88. Me.Sep_Aus.Name = "Sep_Aus"
    89. Me.Sep_Aus.Size = New System.Drawing.Size(6, 20)
    90. '
    91. 'Label_ObenLinks
    92. '
    93. Me.Label_ObenLinks.Anchor = System.Windows.Forms.AnchorStyles.Left
    94. Me.Label_ObenLinks.AutoSize = True
    95. Me.Label_ObenLinks.Location = New System.Drawing.Point(3, 28)
    96. Me.Label_ObenLinks.Name = "Label_ObenLinks"
    97. Me.Label_ObenLinks.Size = New System.Drawing.Size(67, 13)
    98. Me.Label_ObenLinks.TabIndex = 1
    99. Me.Label_ObenLinks.Text = "Oben_Links"
    100. '
    101. 'Label_ObenRechts
    102. '
    103. Me.Label_ObenRechts.Anchor = System.Windows.Forms.AnchorStyles.Left
    104. Me.Label_ObenRechts.AutoSize = True
    105. Me.Label_ObenRechts.Location = New System.Drawing.Point(573, 28)
    106. Me.Label_ObenRechts.Name = "Label_ObenRechts"
    107. Me.Label_ObenRechts.Size = New System.Drawing.Size(75, 13)
    108. Me.Label_ObenRechts.TabIndex = 2
    109. Me.Label_ObenRechts.Text = "Oben_Rechts"
    110. '
    111. 'DataGridView1
    112. '
    113. Me.DataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
    114. Me.DataGridView1.Dock = System.Windows.Forms.DockStyle.Fill
    115. Me.DataGridView1.Location = New System.Drawing.Point(3, 53)
    116. Me.DataGridView1.Name = "DataGridView1"
    117. Me.DataGridView1.Size = New System.Drawing.Size(564, 325)
    118. Me.DataGridView1.TabIndex = 3
    119. '
    120. 'Panel_Steuerung
    121. '
    122. Me.Panel_Steuerung.Dock = System.Windows.Forms.DockStyle.Fill
    123. Me.Panel_Steuerung.Location = New System.Drawing.Point(573, 53)
    124. Me.Panel_Steuerung.Name = "Panel_Steuerung"
    125. Me.TLPanel_Menue.SetRowSpan(Me.Panel_Steuerung, 3)
    126. Me.Panel_Steuerung.Size = New System.Drawing.Size(564, 687)
    127. Me.Panel_Steuerung.TabIndex = 4
    128. '
    129. 'Panel_Titel
    130. '
    131. Me.Panel_Titel.Controls.Add(Me.CheckBox1)
    132. Me.Panel_Titel.Dock = System.Windows.Forms.DockStyle.Fill
    133. Me.Panel_Titel.Location = New System.Drawing.Point(3, 384)
    134. Me.Panel_Titel.Name = "Panel_Titel"
    135. Me.Panel_Titel.Size = New System.Drawing.Size(564, 24)
    136. Me.Panel_Titel.TabIndex = 0
    137. '
    138. 'DataGridView2
    139. '
    140. Me.DataGridView2.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
    141. Me.DataGridView2.Dock = System.Windows.Forms.DockStyle.Fill
    142. Me.DataGridView2.Location = New System.Drawing.Point(3, 414)
    143. Me.DataGridView2.Name = "DataGridView2"
    144. Me.DataGridView2.Size = New System.Drawing.Size(564, 326)
    145. Me.DataGridView2.TabIndex = 5
    146. '
    147. 'CheckBox1
    148. '
    149. Me.CheckBox1.Anchor = System.Windows.Forms.AnchorStyles.Left
    150. Me.CheckBox1.AutoSize = True
    151. Me.CheckBox1.Location = New System.Drawing.Point(0, 0)
    152. Me.CheckBox1.Name = "CheckBox1"
    153. Me.CheckBox1.Size = New System.Drawing.Size(81, 17)
    154. Me.CheckBox1.TabIndex = 0
    155. Me.CheckBox1.Text = "CheckBox1"
    156. Me.CheckBox1.UseVisualStyleBackColor = True
    157. '
    158. 'Testform
    159. '
    160. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 12.0!)
    161. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    162. Me.ClientSize = New System.Drawing.Size(1140, 743)
    163. Me.Controls.Add(Me.TLPanel_Menue)
    164. Me.Font = New System.Drawing.Font("Segoe UI", 7.875!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
    165. Me.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
    166. Me.Name = "Testform"
    167. Me.ShowInTaskbar = False
    168. Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
    169. Me.Text = "Testform"
    170. Me.TLPanel_Menue.ResumeLayout(False)
    171. Me.TLPanel_Menue.PerformLayout()
    172. Me.ToolStrip_Menue.ResumeLayout(False)
    173. Me.ToolStrip_Menue.PerformLayout()
    174. CType(Me.DataGridView1, System.ComponentModel.ISupportInitialize).EndInit()
    175. Me.Panel_Titel.ResumeLayout(False)
    176. Me.Panel_Titel.PerformLayout()
    177. CType(Me.DataGridView2, System.ComponentModel.ISupportInitialize).EndInit()
    178. Me.ResumeLayout(False)
    179. End Sub
    180. Friend WithEvents TLPanel_Menue As TableLayoutPanel
    181. Friend WithEvents Panel_Titel As Panel
    182. Friend WithEvents CheckBox1 As CheckBox
    183. Friend WithEvents ToolStrip_Menue As ToolStrip
    184. Friend WithEvents TS_Aus As ToolStripButton
    185. Friend WithEvents Sep_Aus As ToolStripSeparator
    186. Friend WithEvents Label_ObenLinks As Label
    187. Friend WithEvents Label_ObenRechts As Label
    188. Friend WithEvents DataGridView1 As DataGridView
    189. Friend WithEvents Panel_Steuerung As Panel
    190. Friend WithEvents DataGridView2 As DataGridView
    191. End Class


    Gruß Markus
    @Westerwälder Probierma dies:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' Hauptform mit 2 Button
    2. Public Class Form1
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Using dlg = New Testform()
    5. dlg.ShowDialog()
    6. End Using
    7. End Sub
    8. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    9. Using dlg = New Testform(2)
    10. dlg.ShowDialog()
    11. End Using
    12. End Sub
    13. End Class
    14. ' Testform
    15. Public Class Testform
    16. Private Property DpiFactor As Integer
    17. Private MyFont As Font
    18. Public Sub New()
    19. Me.DpiFactor = 1
    20. Me.InitializeComponent()
    21. Me.MyFont = Me.Font
    22. End Sub
    23. Public Sub New(ByVal dpi As Integer)
    24. Me.DpiFactor = dpi
    25. Me.InitializeComponent()
    26. Me.MyFont = New Font(Me.Font.FontFamily, Me.Font.Size * Me.DpiFactor)
    27. Me.CheckBox1.Font = Me.MyFont
    28. Me.TLPanel_Menue.Font = Me.MyFont
    29. End Sub
    30. End Class
    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!
    @Westerwälder Dann musst Du Dich halt durchhangeln:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Me.CheckBox1.Font = Me.MyFont
    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!

    Das Problem sind nicht die "Normalen Controls" sondern die Container, in den sie liegen (TableLayoutPanel, Panel, usw.)

    Bin doch sicher nicht alleine mit dem Problem. HDMI-/HD Technik gibt es auch schon seit Jahren.
    Verstehen kann ich das ganze nicht wirklich.
    Wie machen andere das?

    Gibt es vielleicht die Möglichkeit hier DPI-Fähig zu aktivieren/deaktivieren?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Programmstart
    2. Public StartForm As Form = Nothing
    3. Public Sub Main()
    4. 'Einzelanwendung
    5. Dim firstInstance As Boolean = False
    6. Dim m As New Mutex(False, "<Mutex-Name>", firstInstance)
    7. If Not firstInstance Then
    8. m.Close()
    9. MessageBox.Show("MBHome wurde bereits gestartet.", "© MBEDV", MessageBoxButtons.OK, MessageBoxIcon.Hand)
    10. End
    11. End If
    12. 'Anwendungsframework Aktivieren
    13. Application.EnableVisualStyles()
    14. 'Text-Rendering
    15. Application.SetCompatibleTextRenderingDefault(False)
    16. 'Anwendung starten
    17. StartForm = New Form
    18. StartForm = StartIni
    19. Initalisieren()
    20. Application.Run(StartForm)
    21. End Sub
    22. End Module



    Dann könnte ich das wahlweise testen bzw. ausführen, ohne jedesmal die Mainfest oder App.config zu ändern.

    Edit:
    Hier versuche ich mich an Controls, welche auf einem Panel, was wiederrum in einem TableLayoutPanel eingebettet sind:

    VB.NET-Quellcode

    1. For Each PAN As Panel In FMControl.Controls.OfType(Of Panel)()
    2. PAN.Font = Appform.Font
    3. For Each PanCtr As Control In PAN.Controls
    4. PanCtr.Font = Appform.Font
    5. Testausgabe.ListBox_Ausgabe.Items.Add(PanCtr.Name) ' Kontroll-Ausgabe
    6. Next PanCtr
    7. Next PAN

    In der Kontroll-Ausgabe wird angezeigt, dass die Control's auf diesem Panel vorhanden sind.
    Nur die Schriftzuweisung und damit auch die richtige Position wird von dem Control ignoriert.

    Gruß Markus

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Westerwälder“ ()