Post by LuckyJoe » 17 May 2019, 09:24
Hallo zusammen,
ich suche eine Möglichkeit, die Breite meiner Listbox bzw. meines Gui's dynamisch berechnen zu lassen. Meine Listbox wird mit Texten aus der Zwischenablage gefüllt und anschließend weiterverarbeitet. In meinen nachfolgenden Beispiel habe ich die Inhalte mit den Dummies "ClipV1-ClipV6" ersetzt.
Wie erreiche ich es, dass sich die Breite meiner Listbox an den Text bzw. die Textbreite anpasst? Diese ist ja vom Font und dem Inhalt abhängig.
Hier zunächst mein Beispiel-Script:
Code: Select all
#NoEnv
#SingleInstance force
#ä::
ClipV1 := "Hallo"
ClipV2 := "Welt"
ClipV3 := "mit"
ClipV4 := "einer"
ClipV5 := "sehr langen Textzeile"
ClipV6 := "und noch einer viel längeren Textzeile"
Liste = %ClipV1%|%ClipV2%|%ClipV3%|%ClipV4%|%ClipV5%|%ClipV6%
ListBoxWidth := 200
ListBoxHigh := 106
GuiWidth := ListBoxWidth + 24
GuiHigh := ListBoxHigh + 20
Gui, New, +HwndGuiNr, Veränderte Zwischenablage einfügen:
Gui, Font, s10, Segoe UI
Gui, Add, ListBox, Choose1 w%ListBoxWidth% H%ListBoxHigh% vMyListBox gMyListBox, %Liste%
Gui, Add, Button, Hidden Default, OK
Gui -SysMenu +AlwaysOnTop
Gui, Show, x1100 y350 W%GuiWidth% H%GuiHigh%
Return
MyListBox:
If A_GuiEvent = DoubleClick
{
GuiControlGet, MyListBox
Zeile = %MyListBox%
Gosub ListBoxRoutine
}
Return
ButtonOK:
GuiControlGet, MyListBox
Zeile = %MyListBox%
ListBoxRoutine:
MsgBox, % Zeile
Clipboard := MyListBox
Goto GuiClose
Return
GuiClose:
GuiEscape:
Gui Destroy
GuiNr =
Return
Return
Im Internet (
https://stackoverflow.com/questions/49335431/autohotkey-dynamic-resize-control-based-on-text) habe ich u.a. folgende vielversprechende Lösung für das Problem gefunden:
Code: Select all
MyText := "Kurzer Text"
MyText := "Das ist eine ziemlich lange Textzeile"
Gui, Font, s10, Segoe UI
Gui, Add, Text,HwndTimeHwnd, MyText
SetTextAndResize(TimeHwnd, MyText)
Gui, Show, NoActivate Center AutoSize
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
}
Mein Problem: Wie kann ich dieses Script so anpassen, dass ich es für mein Script "umbauen" kann, bzw. wie integriere ich es in mein Script?
Ich habe auch schon überlegt, das Ganze als Function einzubinden und die Variable "w", die ja offensichtlich die Textbreite berechnet, zu verwenden ... aber wie? Ich würde mich über einen Denkanstoß freuen.
HG - Lucky Joe
Hallo zusammen,
ich suche eine Möglichkeit, die Breite meiner Listbox bzw. meines Gui's dynamisch berechnen zu lassen. Meine Listbox wird mit Texten aus der Zwischenablage gefüllt und anschließend weiterverarbeitet. In meinen nachfolgenden Beispiel habe ich die Inhalte mit den Dummies "ClipV1-ClipV6" ersetzt.
Wie erreiche ich es, dass sich die Breite meiner Listbox an den Text bzw. die Textbreite anpasst? Diese ist ja vom Font und dem Inhalt abhängig.
Hier zunächst mein Beispiel-Script:
[code]#NoEnv
#SingleInstance force
#ä::
ClipV1 := "Hallo"
ClipV2 := "Welt"
ClipV3 := "mit"
ClipV4 := "einer"
ClipV5 := "sehr langen Textzeile"
ClipV6 := "und noch einer viel längeren Textzeile"
Liste = %ClipV1%|%ClipV2%|%ClipV3%|%ClipV4%|%ClipV5%|%ClipV6%
ListBoxWidth := 200
ListBoxHigh := 106
GuiWidth := ListBoxWidth + 24
GuiHigh := ListBoxHigh + 20
Gui, New, +HwndGuiNr, Veränderte Zwischenablage einfügen:
Gui, Font, s10, Segoe UI
Gui, Add, ListBox, Choose1 w%ListBoxWidth% H%ListBoxHigh% vMyListBox gMyListBox, %Liste%
Gui, Add, Button, Hidden Default, OK
Gui -SysMenu +AlwaysOnTop
Gui, Show, x1100 y350 W%GuiWidth% H%GuiHigh%
Return
MyListBox:
If A_GuiEvent = DoubleClick
{
GuiControlGet, MyListBox
Zeile = %MyListBox%
Gosub ListBoxRoutine
}
Return
ButtonOK:
GuiControlGet, MyListBox
Zeile = %MyListBox%
ListBoxRoutine:
MsgBox, % Zeile
Clipboard := MyListBox
Goto GuiClose
Return
GuiClose:
GuiEscape:
Gui Destroy
GuiNr =
Return
Return[/code]
Im Internet ([url]https://stackoverflow.com/questions/49335431/autohotkey-dynamic-resize-control-based-on-text[/url]) habe ich u.a. folgende vielversprechende Lösung für das Problem gefunden:
[code]MyText := "Kurzer Text"
MyText := "Das ist eine ziemlich lange Textzeile"
Gui, Font, s10, Segoe UI
Gui, Add, Text,HwndTimeHwnd, MyText
SetTextAndResize(TimeHwnd, MyText)
Gui, Show, NoActivate Center AutoSize
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
}[/code]
Mein Problem: Wie kann ich dieses Script so anpassen, dass ich es für mein Script "umbauen" kann, bzw. wie integriere ich es in mein Script?
Ich habe auch schon überlegt, das Ganze als Function einzubinden und die Variable "w", die ja offensichtlich die Textbreite berechnet, zu verwenden ... aber wie? Ich würde mich über einen Denkanstoß freuen.
HG - Lucky Joe