实现一个 动态调整大小的 Gui 窗口,其中的 Edit 控件会根据输入文本的内容动态调整自身的宽高,同时使用了 GDI+ 来精确测量文本的显示尺寸。
所需依赖库下载:
; 不完美,感觉edit里的字间距和gdip里的字间距有点出入【基本够用】 By doge_ahk1
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=4379
#NoEnv
SetBatchLines -1
#SingleInstance force
; #Include <Gdip_All>
pToken := Gdip_Startup(1)
pg:=Gdip_GraphicsFromHDC(CreateCompatibleDC())
Gui, New
Gui,Font,s12,微软雅黑
Gui, Add, Edit,x0 y0 vMyEdit gTextChange +Multi -VScroll -Wrap,
Gui, Show, w300 h200, GUI 示例
return
TextChange(){
global pg
GuiControlGet, newText, , MyEdit
size:=StrSplit(GetDispTextSize(RegExReplace(newText, "(\n)$","$1w"),"微软雅黑",16,pg), "|")
GuiControl, Move, MyEdit,% "w" size[3] + 20 " h" size[4] +8
Gui, Show,% "w" size[3] + 20 " h" size[4] +8
return
}
;██ 获取字符宽度 ██ 提取自BTT库
GetDispTextSize(Text, Font:="", FontSize:=12,pGraphics:="",FontS:="Regular",DPIScale1:=1){
static Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
Style := 0 ; 设置字体样式,常规 粗体等
for eachStyle, valStyle in StrSplit(Styles, "|"){
if InStr(FontS, valStyle)
Style |= (valStyle != "StrikeOut") ? (A_Index-1) : 8
}
if !hFontFamily ; 加载已安装的字体
hFontFamily := Gdip_FontFamilyCreate(Font)
if !hFontFamily ; 加载默认字体
hFontFamily := Gdip_FontFamilyCreateGeneric(1)
; 根据 DPI 缩放比例自动调整字号
hFont := Gdip_FontCreate(hFontFamily, FontSize * DPIScale1, Style, Unit:=0)
if !hStringFormat
hStringFormat := Gdip_StringFormatGetGeneric(0)
CreateRectF(RC, 0, 0, "", "")
returnRC := Gdip_MeasureString(pGraphics, Text, hFont, hStringFormat, RC) ; 计算大小
Gdip_DeleteFont(hFont)
Gdip_DeleteStringFormat(hStringFormat)
Gdip_DeleteFontFamily(hFontFamily)
return returnRC
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)