AutoSize fur bestehendes Control Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

AutoSize fur bestehendes Control

20 Jan 2019, 18:02

Wenn man in einem bestehenden oder neuen Fenster ein neues Control hinzufügt,
kann man sich mit AutoSize wunderbar die Fenster-Größe berechnen lassen.
Wenn man aber die Control-Größe eines bestehenden Control's optimieren möchte,
ist mir nur der Umweg über ein neues Dummy-Control in einem Dummy-Fenster eingefallen.
Diese Technik wurde im folgenden Clipboard-Anzeige-Skript angewand.
Nun zu meiner Frage: Kennt Ihr einen eleganteren Weg zur Größenbestimmung?

Code: Select all

; Flexieble Clipboard-Anzeige	Fenster passt Goesse an's Clipboard an.
#SingleInstance Force
WinGuiNr7Exist:=false
SelfResized := false
GuiNr:=7
VorberErl:=true
OnClipboardChange:
if VorberErl
{
	if(MaxB="")
		MaxB := A_ScreenWidth/3			; Anzeigebreite max 1/3 des Bildschirms
	if(Maxh="")
		MaxH := A_ScreenHeight-Round(80*A_ScreenDPI/96)
	FlexGui(GuiNr,1,"GetClipboard",MaxB,Maxh)
}
return
FlexGui(GuiNr,EditNr,Text,MaxB="",MaxH=""){	
	global WinGuiNr7Exist,Gui7Edit1,Gui7WinHwnd,Gui99Edit1,SelfResized ; wenn andere GuiNr als 7 verwendet werden,
	; muessen die ersten 3 Variabeln kopiert und entsprechend umbenannt werden
	if(MaxB = "")
			MaxB := A_ScreenWidth/2
	if(MaxH = "")
			MaxH := A_ScreenHeight/2
	if (Text="GetClipboard")
		Text:=Clipboard
	if (Text="")
		Text:="Das Clipboard ist leer!"
	if (NOT WinGuiNr7Exist AND Text<>"")
	{
		Gui,%GuiNr%:New, +HwndGui%GuiNr%WinHwnd,Clip
		WinGuiNr7Exist := true
		try
			Gui,%GuiNr%:Add,Edit,vGui%GuiNr%Edit%EditNr% +Multi -Wrap,%Text%
		catch
			Gui,%GuiNr%:Add,Edit,vGui%GuiNr%Edit%EditNr% +Multi,beim Erstaufruf`r`nwerden so lange Texte`r`nnicht unterstützt!
		Gui %GuiNr%:+Resize
		Gui,%GuiNr%:Show,AutoSize NoActivate	; <--hier kann AutoSize verwendet werden
		SelfResized := true
	}
	else
	{
		DpiKorrektur:=A_ScreenDPI/96
		Gui,99:New, +HwndGui99WinHwnd 			; <--hier wird ein Dummy-Fenster erzeugt
		try
		{										; nur um nochmals 
			Gui,99:Add,Edit,vGui99Edit1 +Multi -Wrap,%Text%
			Gui,99:Show,AutoSize NoActivate		; AutoSize verwenden zu koennen, um
			ControlGetPos, X, Y, Breite, Hoehe, ,ahk_id %Gui99WinHwnd% ; die breite und die Hoehe
		}										; auslesen zu koennen.
		catch
		{
			Breite := MaxB
			Hoehe := MaxH
		}
		if(Breite > MaxB)
			Breite := MaxB
		if(Hoehe > MaxH)
			Hoehe := MaxH
		B2:=(Breite/DpiKorrektur)
		H2:=(Hoehe/DpiKorrektur)
		Gui,99:Destroy
		GuiControl,%GuiNr%: Move, Gui%GuiNr%Edit%EditNr%, 	W%B2% H%H2%
		SelfResized := true
		Gui%GuiNr%Edit%EditNr% := Text
		GuiControl,%GuiNr%: ,Gui%GuiNr%Edit%EditNr% ,%Text%
	}	
	Gui,%GuiNr%:Show,x1 y1 AutoSize NoActivate
	return
}
7GuiSize(GuiHwnd, EventInfo, Breite, Hoehe){
	global GuiNr,SelfResized
	MouseGetPos,xalt,yalt			; bis zum naechsten gleichnamigen Befehl
	Loop 20							; laesst sich einiges verbessern.
	{								; Ist aber nicht im Fokus dieses Forenbeitrags.
		if ( GetKeyState("LButton"))
			sleep 100
		else
			break
	}
	MouseGetPos,xneu,yneu
	MaxB := Breite*2-42  -xalt+xneu
	DeltaMaxH := HeigtAfter-(Hoehe/A_ScreenDPI*96+70)
	MaxH := Hoehe*2 -yalt+yneu
	if SelfResized
	{
		SoundBeep,6000
		SelfResized := false
		return
	}
	else
		SoundBeep,1500
  FlexGui(GuiNr,1,"GetClipboard",MaxB,MaxH)
	SelfResized := true
return
}
7GuiClose:
ExitApp
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AutoSize fur bestehendes Control  Topic is solved

21 Jan 2019, 06:16

Moin,

es gibt schon Alternativen wie z.B. die GDI-Funktion DrawText() mit der Option DT_CALCRECT. Die benutzt auch AHK um die Größe von Edit-Controls für einen vorgegebenen Text zu bestimmen. Es ist allerdings fraglich, ob sich der Aufwand lohnt.

Man kann die Größenermittlung aber in eine eigene Funktion auslagern. Das sieht vielleicht auch schon 'eleganter' aus:

Code: Select all

CalcEditSize(ByRef NewText, ByRef W, ByRef H, EditOpts := "", FontOpts := "", FontName := "") {
   W := H := 0
   If ((FontOpts . FontName) <> "")
      Gui, RecalcEditSizeGui:Font, %FontOpts%, %FontName%
   Gui, RecalcEditSizeGui:Add, Edit, %EditOpts% hwndHEDIT, %NewText%
   GuiControlGet, P, RecalcEditSizeGui:Pos, %HEDIT%
   W := PW
   H := PH
   Gui, RecalcEditSizeGui:Destroy
   Return True
}
*Ungetestetes Beispiel*
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: AutoSize fur bestehendes Control

21 Jan 2019, 08:07

Danke JustMe,
ich kann das störende aufblitzen des Dummy-Fensters nicht mehr feststellen. :dance:
GDI Draw habe ich nicht weiterverfolgt.

Aber man kann mit GDI Clipboard Bilder anzeigen,
Dazu GDI downloaden und ohne Hauptprogramm hinten anhaengen (weil Änderungen in den ersten Zeilen gemacht werden müssen) und meine GDI Kommentare beachten.

Code: Select all

#SingleInstance Force
; #Include <Gdip> ;\Lib\gdip.ahk 	; fuer GDI-Bild benötigt oder unten anhaengen
if(!pToken := Gdip_Startup()){ 
MsgBox, 48, gdiplus error!, Gdiplus failed to start. Please ensure you have gdiplus on your system. 
ExitApp 
} 

WinGuiNr7Exist:=false
SelfResized := false
GuiNr:=7

viewPortSizeW := viewPortSizeH := 1600 
Buttonhoehe := 80/A_ScreenDPI*96
showPic:
; Gui,Destroy 	; fuer GDI-Bild benötigt
; Gui, +LastFound  	; fuer GDI-Bild benötigt
; Gui, add, button, gCaptureClipBoardImage, Get Clipboard Image 
; Gui, add, button, gExportClipBoardImage h%Buttonhoehe%,% " Save Clipboard Image  ->  [.png] " 	; fuer GDI-Bild benötigt
; Gui, add, statusbar  	; fuer GDI-Bild benötigt
;~ Gui, show, w800 h800 

guiHwnd := WinExist() 
hdc_WINDOW := GetDC(guiHwnd) 
hbm_main := CreateDIBSection(viewPortSizeW, viewPortSizeH) 
hdc_main := CreateCompatibleDC() 
obm := SelectObject(hdc_main, hbm_main) 
G:= Gdip_GraphicsFromHDC(hdc_main) 

VorberErl:=true

; Gosub, CaptureClipBoardImage 	; fuer GDI-Bild benötigt
; Gui, show, w800 h800 
return 

GuiClose: 
Exitapp 






; Flexieble Clipboard-Anzeige	Fenster passt Goesse an's Clipboard an.
OnClipboardChange:
if VorberErl
{
	; gosub showPic 	; fuer GDI-Bild benötigt
	if(MaxB="")
		MaxB := A_ScreenWidth/3			; Anzeigebreite max 1/3 des Bildschirms
	if(Maxh="")
		MaxH := A_ScreenHeight-Round(80*A_ScreenDPI/96)
	FlexGui(GuiNr,1,"GetClipboard",MaxB,Maxh)
}
return
FlexGui(GuiNr,EditNr,Text,MaxB="",MaxH=""){	
	global WinGuiNr7Exist,Gui7Edit1,Gui7WinHwnd,Gui99Edit1,SelfResized ; wenn andere GuiNr als 7 verwendet werden,
	; muessen die ersten 3 Variabeln kopiert und entsprechend umbenannt werden
	if(MaxB = "")
			MaxB := A_ScreenWidth/2
	if(MaxH = "")
			MaxH := A_ScreenHeight/2
	if (Text="GetClipboard")
		Text:=Clipboard
	if (Text="")
		Text:="Das Clipboard ist ohne Text!"
	if (NOT WinGuiNr7Exist AND Text<>"")
	{
		Gui,%GuiNr%:New, +HwndGui%GuiNr%WinHwnd,Clip
		WinGuiNr7Exist := true
		try
			Gui,%GuiNr%:Add,Edit,vGui%GuiNr%Edit%EditNr% +Multi -Wrap,%Text%
		catch
			Gui,%GuiNr%:Add,Edit,vGui%GuiNr%Edit%EditNr% +Multi,beim Erstaufruf`r`nwerden so lange Texte`r`nnicht unterstützt!
		Gui %GuiNr%:+Resize
		Gui,%GuiNr%:Show,AutoSize NoActivate	; <--hier kann AutoSize verwendet werden
		SelfResized := true
	}
	else
	{
		DpiKorrektur:=A_ScreenDPI/96
		;~ Gui,99:New, +HwndGui99WinHwnd 			; <--hier wird ein Dummy-Fenster erzeugt
		;~ try
		;~ {										; nur um nochmals 
			;~ Gui,99:Add,Edit,vGui99Edit1 +Multi -Wrap,%Text%
			;~ Gui,99:Show,AutoSize NoActivate		; AutoSize verwenden zu koennen, um
			;~ ControlGetPos, X, Y, Breite, Hoehe, ,ahk_id %Gui99WinHwnd% ; die breite und die Hoehe
		;~ }										; auslesen zu koennen.
		try
			CalcEditSize(Text, Breite, Hoehe, "+Multi -Wrap")	; nach JustMe's Hinweis ergänzt
		catch
		{
			Breite := MaxB
			Hoehe := MaxH
		}
		if(Breite > MaxB)
			Breite := MaxB
		if(Hoehe > MaxH)
			Hoehe := MaxH
		B2:=Breite        ; Korrektur +14 entfällt nach JustMe's Hinweis
		H2:=Hoehe        ; Korrektur +1 entfällt nach JustMe's Hinweis
		;~ Gui,99:Destroy
		GuiControl,%GuiNr%: Move, Gui%GuiNr%Edit%EditNr%, 	W%B2% H%H2%
		SelfResized := true
		Gui%GuiNr%Edit%EditNr% := Text
		GuiControl,%GuiNr%: ,Gui%GuiNr%Edit%EditNr% ,%Text%
	}	
	Gui,%GuiNr%:Show,x1 y1 AutoSize NoActivate
	return
}
CalcEditSize(ByRef NewText, ByRef W, ByRef H, EditOpts := "", FontOpts := "", FontName := "") {
; Danke JustMe https://www.autohotkey.com/boards/viewtopic.php?p=259156#p259156
   W := H := 0
   If ((FontOpts . FontName) <> "")
      Gui, RecalcEditSizeGui:Font, %FontOpts%, %FontName%
   Gui, RecalcEditSizeGui:Add, Edit, %EditOpts% hwndHEDIT, %NewText%
   GuiControlGet, P, RecalcEditSizeGui:Pos, %HEDIT%
   W := PW
   H := PH
   Gui, RecalcEditSizeGui:Destroy
   Return True
}
7GuiSize(GuiHwnd, EventInfo, Breite, Hoehe){
	global GuiNr,SelfResized
	MouseGetPos,xalt,yalt			; bis zum naechsten gleichnamigen Befehl
	Loop 20							; laesst sich einiges verbessern.
	{								; Ist aber nicht im Fokus dieses Forenbeitrags.
		if ( GetKeyState("LButton"))
			sleep 100
		else
			break
	}
	MouseGetPos,xneu,yneu
	MaxB := Breite*2-42  -xalt+xneu
	DeltaMaxH := HeigtAfter-(Hoehe/A_ScreenDPI*96+70)
	MaxH := Hoehe*2 -yalt+yneu
	if SelfResized
	{
		; SoundBeep,6000
		SelfResized := false
		return
	}
	; else
		; SoundBeep,1500
  FlexGui(GuiNr,1,"GetClipboard",MaxB,MaxH)
	SelfResized := true
return
}
7GuiClose:
ExitApp
; besser ab hier GDI anhaengen
CaptureClipBoardImage: 
	Gdip_GraphicsClear(G, 0xAAB4CDCD) 

   pBitMap := GetBitmapFromClipBoard() 
   if(pBitMap != 0){ 
      SB_SetText("Found a bitmap in the clipboard!") 
      sw := dw := Gdip_GetImageWidth(pBitmap) 
      sh := dh := Gdip_GetImageHeight(pBitmap) 
BildBreite := (sw+36)/A_ScreenDPI*96	; fuer GDI-Bild benötigt
BildHoehe := (sh + 116)/A_ScreenDPI*96	; fuer GDI-Bild benötigt
Gui, show, x1 w%BildBreite% h%BildHoehe% NoActivate	; fuer GDI-Bild benötigt
      Gdip_DrawImage(G, pBitmap, dx := 0, dy := 0, dw, dh, sx := 0, sy := 0, sw, sh) 
   }else{ 
      msg := "No image in the clipboard found!" 
      SB_SetText(msg) 
      ; MsgBox % msg  ; fuer GDI-Bild stoerend d.h. auskommentieren
   } 
    
   DrawScene() 
return 
; .
; .
; .
Last edited by Gerdi on 23 Jan 2019, 03:43, edited 1 time in total.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: AutoSize fur bestehendes Control

22 Jan 2019, 05:15

Moin,

über den Funktionsparameter EditOpts kann man Optionen für das innerhalb der Funktion erstellte Edit übergeben, die auch für das originale Edit verwendet wurden und die Abmessungen des Steuerelements beeinflussen können. In Deinem Fall könnten das +Multi -Wrap sein.
User avatar
Gerdi
Posts: 185
Joined: 03 Aug 2015, 18:48
Location: Germany
Contact:

Re: AutoSize fur bestehendes Control

23 Jan 2019, 03:45

Danke,
im Skript oben Ergänzt.
Win 10 Home (x64) and Win 11 Pro N
https://github.com/Grrdi/ZackZackOrdner/archive/master.zip --> get folders on the quick

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 67 guests