AutoHotkey:基于文本

时间:2018-03-17 11:25:57

标签: controls autohotkey autosize

请考虑以下代码段:

FormatTime, time,
Gui, Add, Text, vcTime, 
GuiControl, , cTime, % time 
Gui, Show, NoActivate Center AutoSize

AutoSize基于Gui, Add, Text, vcTime的初始值,而不是GuiControl, , cTime, % time设置的新值。根据月份等,%time%长度可能会有所不同。如何自动调整窗口大小以适应%time%的更新值?  `

1 个答案:

答案 0 :(得分:6)

AutoSize is actually based on the current control sizes when Gui Show is called。问题是文本控件does not automatically resize the controlGuiControl的“空白”子命令;它只是更改了文本,您仍然需要自己调用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
}

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