gpt4 book ai didi

controls - AutoHotkey:基于文本的动态调整大小控制

转载 作者:行者123 更新时间:2023-12-05 00:13:02 24 4
gpt4 key购买 nike

考虑以下代码段:

FormatTime, time,
Gui, Add, Text, vcTime,
GuiControl, , cTime, % time
Gui, Show, NoActivate Center AutoSize
AutoSize基于 Gui, Add, Text, vcTime 的初始值而不是 GuiControl, , cTime, % time 设置的新值.取决于月份等, %time%长度可以变化。如何自动调整窗口大小以适应 %time% 的更新值?
`

最佳答案

AutoSize is actually based on the current control sizes when Gui Show is called .问题是 GuiControl 的“空白”子命令用于文本控件does not automatically resize the control ;它只是改变了文本,你仍然需要调用 GuiControl Move自己换一个新尺寸。因此,在您的示例中,如果您替换 AutoSizew200文本仍将在同一点被切断。

据我所知,并没有真正的“内置”自动方法来根据新文本调整文本控件的大小。最接近的方法是在创建文本控件时使用 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 的文本控件的初始大小。如果没有提供并发现它使用 Windows API 函数 DrawText DT_CALCRECT .这是 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
}

我不确定它在性能方面与第一种方法相比如何,但一个优点是它根据控件本身获取字体,而不必自己将其提供给函数。

关于controls - AutoHotkey:基于文本的动态调整大小控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49335431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com