请考虑以下代码段:
FormatTime, time,
Gui, Add, Text, vcTime,
GuiControl, , cTime, % time
Gui, Show, NoActivate Center AutoSize
AutoSize
基于Gui, Add, Text, vcTime
的初始值,而不是GuiControl, , cTime, % time
设置的新值。根据月份等,%time%
长度可能会有所不同。如何自动调整窗口大小以适应%time%
的更新值?
`
答案 0 :(得分:6)
AutoSize
is actually based on the current control sizes when Gui Show
is called。问题是文本控件does not automatically resize the control的GuiControl
的“空白”子命令;它只是更改了文本,您仍然需要自己调用GuiControl Move
一个新的大小。因此,在您的示例中,如果您将AutoSize
替换为w200
,则文本仍会在同一时间被截断。
据我所知,并没有真正的“内置”自动方式来根据新文本调整文本控件的大小。最接近的方法是在创建文本控件时使用AHK的初始大小计算:使用所需文本创建新文本控件,使用GuiControlGet
获取新控件的大小,最后设置原始控件的大小使用GuiControl Move
达到该大小。以下是一个示例函数,它根据here改编:
SetTextAndResize(controlHwnd, newText, fontOptions := "", fontName := "") {
Gui 9:Font, %fontOptions%, %fontName%
Gui 9:Add, Text, R1, %newText%
GuiControlGet T, 9:Pos, Static1
Gui 9:Destroy
GuiControl,, %controlHwnd%, %newText%
GuiControl Move, %controlHwnd%, % "h" TH " w" TW
}
哪个适合你的例子:
FormatTime, time,
Gui, Add, Text, HwndTimeHwnd vcTime,
SetTextAndResize(TimeHwnd, time)
Gui, Show, NoActivate Center AutoSize
现在,只要您使用SetTextAndResize
而不是仅设置文本,就可以使用Gui Show, AutoSize
自动调整窗口大小。请注意,如果您在添加文本控件之前使用Gui Font
更改了字体,则必须将这些选项传递给SetTextAndResize
。
或者,我查看了AHK本身如何计算Gui Add, Text
文本控件的初始大小(如果没有提供),并且发现它使用带有DT_CALCRECT
的Windows API函数DrawText
。这是我直接使用此编写的SetTextAndResize
的另一个实现:
SetTextAndResize(controlHwnd, newText) {
dc := DllCall("GetDC", "Ptr", controlHwnd)
; 0x31 = WM_GETFONT
SendMessage 0x31,,,, ahk_id %controlHwnd%
hFont := ErrorLevel
oldFont := 0
if (hFont != "FAIL")
oldFont := DllCall("SelectObject", "Ptr", dc, "Ptr", hFont)
VarSetCapacity(rect, 16, 0)
; 0x440 = DT_CALCRECT | DT_EXPANDTABS
h := DllCall("DrawText", "Ptr", dc, "Ptr", &newText, "Int", -1, "Ptr", &rect, "UInt", 0x440)
; width = rect.right - rect.left
w := NumGet(rect, 8, "Int") - NumGet(rect, 0, "Int")
if oldFont
DllCall("SelectObject", "Ptr", dc, "Ptr", oldFont)
DllCall("ReleaseDC", "Ptr", controlHwnd, "Ptr", dc)
GuiControl,, %controlHwnd%, %newText%
GuiControl Move, %controlHwnd%, % "h" h " w" w
}
我不确定它在性能方面与第一种方法相比如何,但一个优点是它可以根据控件本身获取字体,而不必自己将其提供给函数。