Wie ermittle ich in VB.NET 2003 den systemweiten Font für Fenstertexte (Explorerliste)?

Antwort

Um in VB.NET 2003 den systemweiten Font für Fenstertexte (wie sie z.B. in Explorer-Listen verwendet werden) zu ermitteln, kannst du auf die SystemFonts-Klasse zugreifen. Allerdings ist die SystemFonts-Klasse erst ab .NET Framework 2.0 verfügbar. In .NET 1.1 (wie in VB.NET 2003 üblich) musst du auf die Win32-API zurückgreifen. Der relevante Font ist der sogenannte „Shell Font“ oder „System Font“, der für Fenstertexte verwendet wird. In der Regel ist das der Wert von `NONCLIENTMETRICS.lfMessageFont`. Hier ein Beispiel, wie du diesen Font mit P/Invoke ausliest: ```vb Imports System.Runtime.InteropServices Imports System.Drawing Public Class SystemFontHelper <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Private Structure LOGFONT Public lfHeight As Integer Public lfWidth As Integer Public lfEscapement As Integer Public lfOrientation As Integer Public lfWeight As Integer Public lfItalic As Byte Public lfUnderline As Byte Public lfStrikeOut As Byte Public lfCharSet As Byte Public lfOutPrecision As Byte Public lfClipPrecision As Byte Public lfQuality As Byte Public lfPitchAndFamily As Byte <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=32)> Public lfFaceName As String End Structure <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> Private Structure NONCLIENTMETRICS Public cbSize As Integer Public iBorderWidth As Integer Public iScrollWidth As Integer Public iScrollHeight As Integer Public iCaptionWidth As Integer Public iCaptionHeight As Integer <MarshalAs(UnmanagedType.Struct)> Public lfCaptionFont As LOGFONT Public iSmCaptionWidth As Integer Public iSmCaptionHeight As Integer <MarshalAs(UnmanagedType.Struct)> Public lfSmCaptionFont As LOGFONT Public iMenuWidth As Integer Public iMenuHeight As Integer <MarshalAs(UnmanagedType.Struct)> Public lfMenuFont As LOGFONT <MarshalAs(UnmanagedType.Struct)> Public lfStatusFont As LOGFONT <MarshalAs(UnmanagedType.Struct)> Public lfMessageFont As LOGFONT End Structure Private Const SPI_GETNONCLIENTMETRICS As Integer = 41 Private Const LF_FACESIZE As Integer = 32 <DllImport("user32.dll", CharSet:=CharSet.Auto)> Private Shared Function SystemParametersInfo( _ ByVal uAction As Integer, _ ByVal uParam As Integer, _ ByRef lpvParam As NONCLIENTMETRICS, _ ByVal fuWinIni As Integer) As Boolean End Function Public Shared Function GetWindowTextFont() As Font Dim ncm As New NONCLIENTMETRICS() ncm.cbSize = Marshal.SizeOf(ncm) If SystemParametersInfo(SPI_GETNONCLIENTMETRICS, ncm.cbSize, ncm, 0) Then Dim lf As LOGFONT = ncm.lfMessageFont Return New Font(lf.lfFaceName, Math.Abs(lf.lfHeight), FontStyle.Regular) Else Return SystemFonts.DefaultFont End If End Function End Class ``` Verwendung: ```vb Dim sysFont As Font = SystemFontHelper.GetWindowTextFont() MessageBox.Show("System-Font: " & sysFont.Name & ", Größe: " & sysFont.Size) ``` **Hinweis:** - In neueren .NET-Versionen kannst du einfach `SystemFonts.MessageBoxFont` oder ähnliche Eigenschaften verwenden. - In VB.NET 2003 ist der oben gezeigte Weg über die Win32-API notwendig. Weitere Infos: - [Microsoft Doku zu SystemParametersInfo](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa) - [SystemFonts-Klasse (ab .NET 2.0)](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.systemfonts)

KI fragen

Verwandte Fragen

Wie speichere ich mehrzeilige Texte mit VB.NET 2003 in eine Datei und lese einzelne Blöcke anhand von Überschriften aus?

Um mehrzeilige Texte in eine Datei zu speichern und später anhand von Überschriften (z. B. [Block1], [Block2]) auszulesen, kannst du in VB.NET 2003 wie folgt vorgehen: **1. Speichern mehrze... [mehr]

Wie klappe ich in VB.NET 2003 per Code ein bestimmtes Untermenü eines ContextMenus auf?

In VB.NET 2003 (also .NET Framework 1.1) gibt es keine direkte Möglichkeit, ein Untermenü (Submenu) eines ContextMenus per Code aufzuklappen. Das liegt daran, dass das klassische `ContextMen... [mehr]

Wie kann ich in VB.NET 2003 markierten Text in einer RTF-Box per Maus verschieben?

Um in VB.NET 2003 markierten Text innerhalb einer RichTextBox per Drag & Drop mit der Maus zu verschieben, musst du einige Ereignisse und Einstellungen nutzen, da die Standard-RichTextBox dieses V... [mehr]

Wie heißt in VB.NET 2003 der KeyCode für das Hochkomma (')?

In VB.NET 2003 entspricht das Hochkomma (Apostroph, also `'`) dem KeyCode **emQuotes**. Du kannst also in einem KeyDown- oder KeyPress-Ereignis so darauf prüfen: ```vb.net If e.KeyCode =... [mehr]

Kann man in VB.NET 2003 Zeilenumbrüche, die durch RightMargin in einer RTF-Box erzeugt wurden, in echte Zeilenumbrüche umwandeln?

In VB.NET 2003 (und generell in Windows Forms) ist es so, dass der `RightMargin`-Wert einer RichTextBox lediglich die Anzeige beeinflusst: Der Text wird optisch umgebrochen, aber im zugrundeliegenden... [mehr]

Reicht in VB.NET 2003 die TextBox-Einstellung 'AcceptReturn = False', um den Beep bei Return zu unterdrücken?

Nein, in VB.NET 2003 reicht die Einstellung `AcceptsReturn = False` bei einer TextBox nicht aus, um den Beep-Ton beim Drücken der Return-Taste (Enter) zu unterdrücken. **Erklärung:** -... [mehr]

Warum ist 'GetFirstCharIndexFromLine()' in VB.NET 2003 kein Member von RichTextBox?

Das Verhalten, das du beschreibst, ist korrekt: In **VB.NET 2003** (also .NET Framework 1.1) gibt es die Methode `GetFirstCharIndexFromLine()` für das `RichTextBox`-Steuerelement **noch nicht**.... [mehr]

Wie setze ich mit VB.NET 2003 per Button-Klick an den Anfang aller ausgewählten Zeilen einer RichTextBox ein einfaches Anführungszeichen (')?

Um in VB.NET 2003 am Anfang jeder ausgewählten Zeile in einer `RichTextBox` ein einfaches Hochkomma (`'`) einzufügen, kannst du folgenden Ansatz verwenden: 1. **Ermittle die Auswahl**:... [mehr]

Wie wandle ich in VB.NET 2003 beim Laden einer Datei mit RichTextBox.LoadFile einen UTF-8-Text in ANSI um?

In VB.NET 2003 unterstützt die Methode `RichTextBox.LoadFile` standardmäßig keine direkte Konvertierung von UTF-8 nach ANSI. Sie lädt die Datei entweder als RTF oder als reinen Te... [mehr]

Wie kopiere ich in VB.NET 2003 eine Datei in einen anderen Ordner?

In VB.NET 2003 kannst du zum Kopieren einer Datei die Methode `File.Copy` aus dem Namespace `System.IO` verwenden. Hier ein einfaches Beispiel: ```vb Imports System.IO ' Beispiel: Datei kopiere... [mehr]