MsgBox显示字体调整

原贴速达

/*
	调整MsgBox字体大小显示更清楚
*/
Global FontObject:={}
if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
	if (FontName&&FontSize&&FontWeight&&Font_IsItalic<>""){
		FontObject["FontName"]:=FontName,FontObject["FontSize"]:=FontSize,FontObject["FontWeight"]:=FontWeight,FontObject["Font_IsItalic"]:=Font_IsItalic
		MsgBox,4096,,% "#####更改前#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
		if SetMsgBoxFontInfo("宋体", 16, 700, True){
			if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
				MsgBox,4096,,% "#####更改后#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
				if SetMsgBoxFontInfo(FontObject.FontName,FontObject.FontSize,FontObject.FontWeight,FontObject.Font_IsItalic){
					if GetMsgBoxFontInfo(FontName, FontSize, FontWeight, Font_IsItalic){
						MsgBox,4096,,% "#####还原后#####`n字体名称:" FontName "`n字号:" FontSize "`n字体粗细:" FontWeight "`n字体是否是斜体:" Font_IsItalic
					}
				}
			}
		}
	}
}
	
;;获取msgbox框字体信息https://www.autohotkey.com/boards/viewtopic.php?t=9122
GetMsgBoxFontInfo(ByRef Name:="", ByRef Size:=0, ByRef Weight:=0, ByRef IsItalic:=0) {
	; SystemParametersInfo常量,用于检索与非最小化窗口的非客户端区域关联的度量
	static SPI_GETNONCLIENTMETRICS := 0x0029
	static NCM_Size := 40 + 5*(A_IsUnicode ? 92 : 60)	; 非ClientMetrics结构的大小(不包括iPadedDBOrderWidth)
	static MsgFont_Offset  := 40 + 4*(A_IsUnicode ? 92 : 60)	; 非ClientMetrics结构中lfMessageFont的偏移量
	static Size_Offset := 0	 ; 非ClientMetrics结构中cbSize的偏移量
	static Height_Offset := 0	 ;LOGFONT结构中lfHeight的偏移量
	static Weight_Offset := 16	; LOGFONT结构中lfWeight的偏移量
	static Italic_Offset := 20	; LOGFONT结构中lfItalic的偏移量
	static FaceName_Offset := 28	; LOGFONT结构中lfFaceName的偏移量
	static FACESIZE := 32	; LOGFONT结构中lfFaceName数组的大小
		; 字体名称字符串中的最大字符数
	VarSetCapacity(NCM, NCM_Size, 0)  ; 设置NCM结构的大小并初始化
	NumPut(NCM_Size, &NCM, Size_Offset, "UInt")	; 设置NCM结构的cbSize元素
	; 获取系统参数并将其存储在非客户机度量结构(NCM)中
	if !DllCall("SystemParametersInfo"  ; 如果SystemParametersInfo函数返回空值
		, "UInt", SPI_GETNONCLIENTMETRICS
		, "UInt", NCM_Size
		, "Ptr", &NCM
		, "UInt", 0)
		Return false
	Name := StrGet(&NCM + MsgFont_Offset + FaceName_Offset, FACESIZE)  ; Get the font name
	Height := NumGet(&NCM + MsgFont_Offset + Height_Offset, "Int")  ; Get the font height
	Size := DllCall("MulDiv", "Int", -Height, "Int", 72, "Int", A_ScreenDPI)	; 将字体高度转换为字体大小(以点为单位)
	; Reference: http://stackoverflow.com/questions/2944149/converting-logfont-height-to-font-size-in-points
	Weight	:= NumGet(&NCM + MsgFont_Offset + Weight_Offset, "Int")  ; 获取字体Weight(400为正常,700为粗体)
	IsItalic := NumGet(&NCM + MsgFont_Offset + Italic_Offset, "UChar")  ; 获取字体的斜体状态

	Return true
}

;;设置msgbox框字体信息;;https://www.autohotkey.com/boards/viewtopic.php?t=9122
SetMsgBoxFontInfo(Name:="", Size:=0, Weight:=0, IsItalic:=-1) {
	; SystemParametersInfo常量,用于检索和设置与非最小化窗口的非客户端区域关联的度量
	static SPI_GETNONCLIENTMETRICS := 0x0029
	static SPI_SETNONCLIENTMETRICS := 0x002A
	static SPIF_UPDATEINIFILE := 0x01
	static SPIF_SENDCHANGE := 0x02
	
	static NCM_Size := 40 + 5*(A_IsUnicode ? 92 : 60)  ; 非ClientMetrics结构的大小(不包括iPadedDBOrderWidth)
	static MsgFont_Offset  := 40 + 4*(A_IsUnicode ? 92 : 60)  ; 非ClientMetrics结构中lfMessageFont的偏移量
	static Size_Offset := 0  ; 非ClientMetrics结构中cbSize的偏移量
	
	static Height_Offset := 0  ; LOGFONT结构中lfHeight的偏移量
	static Weight_Offset := 16  ; LOGFONT结构中lfWeight的偏移量
	static Italic_Offset := 20	; LOGFONT结构中lfItalic的偏移量
	static FaceName_Offset := 28	; LOGFONT结构中lfFaceName的偏移量
	static FACESIZE := 32	; LOGFONT结构中lfFaceName数组的大小
		; 字体名称字符串中的最大字符数
	VarSetCapacity(NCM, NCM_Size, 0)  ; 设置NCM结构的大小并初始化它
	NumPut(NCM_Size, &NCM, Size_Offset, "UInt")	; 设置NCM结构的cbSize元素
	; 获取系统参数并将其存储在非客户机度量结构(NCM)中
	if !DllCall("SystemParametersInfo"  ; 如果SystemParametersInfo函数返回空值。。。
		, "UInt", SPI_GETNONCLIENTMETRICS
		, "UInt", NCM_Size
		, "Ptr", &NCM
		, "UInt", 0)
		Return false
	if Name
		StrPut(Name, &NCM + MsgFont_Offset + FaceName_Offset, FACESIZE)
	if Size {
		Height := -DllCall("MulDiv", "Int", Size, "Int", A_ScreenDPI, "Int", 72)
		; Reference: http://stackoverflow.com/questions/2944149/converting-logfont-height-to-font-size-in-points
		NumPut(Height, &NCM + MsgFont_Offset + Height_Offset, "Int")
	}
	if Weight
		NumPut(Weight, &NCM + MsgFont_Offset + Weight_Offset, "Int")
	if (IsItalic = 1 || IsItalic = 0)
		NumPut(IsItalic, &NCM + MsgFont_Offset + Italic_Offset, "UChar")
	; 在非客户端度量结构(NCM)中设置系统参数
	if !DllCall("SystemParametersInfo"  ; 如果SystemParametersInfo函数返回空值。。。
		, "UInt", SPI_SETNONCLIENTMETRICS
		, "UInt", NCM_Size
		, "Ptr", &NCM
		, "UInt", SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)  ; Update the user profile
		Return false
	Return true
}

GetDefaultFontName(){
	NumPut(VarSetCapacity(info, A_IsUnicode ? 504 : 344, 0), info, 0, "UInt")
	DllCall("SystemParametersInfo", "UInt", 0x29, "UInt", 0, "Ptr", &info, "UInt", 0)
	return StrGet(&info + 52)
}

GuiDefaultFont() ; by SKAN (modified by jNizM)
{
	hFont := DllCall("gdi32.dll\GetStockObject", "Int", 17, "Ptr")
	VarSetCapacity(LF, szLF := 60 * (A_IsUnicode ? 2 : 1))
	DllCall("gdi32.dll\GetObject", "Ptr", hFont, "Int", szLF, "Ptr", &LF)
	hDC := DllCall("user32.dll\GetDC", "Ptr", hwnd), DPI := DllCall("gdi32.dll\GetDeviceCaps", "Ptr", hDC, "Int", 90)
	DllCall("user32.dll\ReleaseDC", "Ptr", 0, "Ptr", hDC), S := Round((-NumGet(LF, 0, "Int") * 72) / DPI)
	Fnt := {}, Fnt.Name := DllCall("kernel32.dll\MulDiv", "Int", &LF+28, "Int", 1, "Int", 1, "Str"), Fnt.Size := S
	return Fnt
}

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

比StrLen更精确的统计字符数量GetStrLen

2022-1-23 20:36:58

其他案例

Gui窗口实用的一些基础操作实例

2022-1-23 22:18:10

4 条回复 A文章作者 M管理员
  1. oeasy

    老表作品必属精品

    • 蜜獾哥

      搬运工而已,我只是更加形象化加了示例

  2. jly

    执行的时候,一定要把3个 Msgbox 都执行完后,再退出脚本。因为最后一个会还原默认的字体。 中途停止的话,原来默认的字体信息就丢失了! 系统被设置为别的字体了。

    • jly

      还原win10 默认字体
      SetMsgBoxFontInfo(“Microsoft Yahei Ul”, 10, 400, False)
      ExitApp

个人中心
购物车
优惠劵
有新私信 私信列表
搜索