Excel VBA标准MsgBox对话框使用的字体及字号是多少?
Excel VBA 标准MsgBox对话框字体相关问题解答
基础结论
VBA调用的MsgBox本质是Windows系统原生的消息框组件,它的字体和字号没有在Excel/Office层面单独定义,完全跟随系统的消息框字体配置:
- WinXP系统默认值为
Tahoma 8号 - Win7及以后的Win10/Win11系统默认值为
Segoe UI 9号 - 如果用户手动修改过系统外观的字体设置,该值会随用户配置变化,硬编码固定字体无法适配所有设备。
你尝试的Win32 API方向完全正确,以下是可直接运行的完整VBA实现代码,兼容32/64位Office:
' 声明API函数 #If VBA7 Then Public Declare PtrSafe Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long Public Declare PtrSafe Function GetDC Lib "user32" (ByVal hWnd As LongPtr) As LongPtr Public Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hDC As LongPtr, ByVal nIndex As Long) As Long Public Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hWnd As LongPtr, ByVal hDC As LongPtr) As Long #Else Public Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Long Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long Public Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long Public Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long #End If ' 常量定义 Const SPI_GETNONCLIENTMETRICS As Long = &H29 ' 和十进制41完全等价,两种写法都可用 Const LOGPIXELSY As Long = 90 ' LOGFONT结构定义 Private Type LOGFONT lfHeight As Long lfWidth As Long lfEscapement As Long lfOrientation As Long lfWeight As Long lfItalic As Byte lfUnderline As Byte lfStrikeOut As Byte lfCharSet As Byte lfOutPrecision As Byte lfClipPrecision As Byte lfQuality As Byte lfPitchAndFamily As Byte lfFaceName As String * 32 End Type ' NONCLIENTMETRICS结构定义 Private Type NONCLIENTMETRICS cbSize As Long iBorderWidth As Long iScrollWidth As Long iScrollHeight As Long iCaptionWidth As Long iCaptionHeight As Long lfCaptionFont As LOGFONT iSMCaptionWidth As Long iSMCaptionHeight As Long lfSMCaptionFont As LOGFONT iMenuWidth As Long iMenuHeight As Long lfMenuFont As LOGFONT lfStatusFont As LOGFONT lfMessageFont As LOGFONT ' 这个就是你要的消息框字体数据 End Type ' 封装好的获取消息框字体的函数,返回(字体名, 字号)的数组 Public Function GetMsgBoxFont() As Variant Dim ncm As NONCLIENTMETRICS Dim hDC As LongPtr Dim dpiY As Long Dim fontName As String Dim fontSize As Single ncm.cbSize = LenB(ncm) ' 调用API获取系统参数 Call SystemParametersInfo(SPI_GETNONCLIENTMETRICS, LenB(ncm), ncm, 0) ' 处理字体名 fontName = Trim(Replace(ncm.lfMessageFont.lfFaceName, Chr(0), "")) ' 计算字号 #If VBA7 Then hDC = GetDC(0) #Else hDC = GetDC(0) #End If dpiY = GetDeviceCaps(hDC, LOGPIXELSY) fontSize = Abs(ncm.lfMessageFont.lfHeight) * 72 / dpiY Call ReleaseDC(0, hDC) GetMsgBoxFont = Array(fontName, fontSize) End Function ' 调用示例 Sub TestGetFont() Dim fontInfo As Variant fontInfo = GetMsgBoxFont() MsgBox "当前系统MsgBox字体:" & fontInfo(0) & ",字号:" & fontInfo(1) End Sub
低成本替代方案
如果你不需要100%适配所有修改过系统字体的特殊设备,直接把自定义表单的字体设置为Segoe UI 9号即可,该配置覆盖了95%以上Win7及更高版本系统的默认场景,开发效率比调用API高很多。
内容的提问来源于stack exchange,提问作者k1dfr0std
相关产品推荐
相关产品推荐

