Jump to content
Sign in to follow this  
Kip

_StringSize UDF

Recommended Posts

Kip

There is not much else to say when you've read the title and description.

The function + example:

$text = "Hello World! Whazzup"&@CRLF&"enter"&@CRLF&"enter"&@CRLF&"enter"&@CRLF&"enter"&@CRLF&"enter"&@CRLF&"enter"&@CRLF&"enter"

$iSize = 8.5
$sFont = "Courier New" 



$hGui = GUICreate("dsd")
    
    
    $Label_1 = GUICtrlCreateLabel($text,10,10,500,500)
    GUICtrlSetFont (-1, $iSize, 400, 0, $sFont)
    
    
    
    $aSize = _StringSize($text, $sFont, $iSize)
    
    GUICtrlCreateLabel("",10,0,$aSize[0],9) ; Horizontal bar
    GUICtrlSetBkColor(-1,0x000000)
    GUICtrlCreateLabel("",0,10,9,$aSize[1])    ; Vertical bar
    GUICtrlSetBkColor(-1,0x000000)

GUISetState()



While 1
    
WEnd

; Created by Zedna? +Kip
; Returns an array:
;     [0] = width (px)
;    [1] = height (px)

Func _StringSize($sText, $sFont="Ms Sans Serif", $iSize=8.5, $bItalic=False, $bUnderlined=False, $bStrike=False, $iWeight=400, $sLineBreak=@CRLF)
    
    Local $aReturn[2]
    
    Local $hGui = GUICreate("dsd")
    
    Local $iStyle = 0
    $iStyle += $bItalic*2
    $iStyle += $bUnderlined*4
    $iStyle += $bStrike*8
    
    Local $iLabel = GUICtrlCreateLabel("",10,10,500,500)
    GUICtrlSetFont (-1, $iSize, $iWeight, $iStyle, $sFont)
    
    Local $hControl = GUICtrlGetHandle($iLabel)
    
    Local $hDC = DLLCall("user32.dll","int","GetDC","hwnd",$hControl)
    $hDC = $hDC[0]
    Local $hFont = DllCall("user32.dll", "ptr", "SendMessage", "hwnd", $hControl, "int", 0x0031, "int", 0, "int", 0)
    $hFont = $hFont[0]

    Local $hOldFont = DllCall("GDI32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hFont)
    $hOldFont = $hOldFont[0]
    
    Local $struct_size = DllStructCreate("int;int")
    
    Local $sLineSplit = StringSplit($sText,$sLineBreak,1)
    Local $i
    
    
    For $i = 1 to $sLineSplit[0]
        
        DllCall("gdi32.dll", "int", "GetTextExtentPoint32", "int", $hDC, "str", $sLineSplit[$i], "long", StringLen($sLineSplit[$i]), "ptr", DllStructGetPtr($struct_size))
        
        ;MsgBox(0,"sdsd",DllStructGetData($struct_size,1))
        
        If DllStructGetData($struct_size,1) > $aReturn[0] Then $aReturn[0] = DllStructGetData($struct_size,1)
        $aReturn[1] += DllStructGetData($struct_size,2)
        
    Next

    DllCall("GDI32.dll", "hwnd", "SelectObject", "hwnd", $hDC, "hwnd", $hOldFont)
    DllCall("GDI32.dll", "int", "DeleteObject", "int", $hOldFont)
    DllCall("User32.dll", "int", "ReleaseDC", "hwnd", 0, "hwnd", $hDC)
    
    GUIDelete($hGui)
    
    Return $aReturn
    
EndFunc
Edited by Kip

Share this post


Link to post
Share on other sites
Alek

any reason not to use _GDIPlus_GraphicsMeasureString?


[font="Impact"]Never fear, I is here.[/font]

Share this post


Link to post
Share on other sites
Kip

Well, I didn't notice that function to be honest, but some reasons.

- It doesn't require _GDIPlus_StartUp()

- Easier to use

- Takes less memory?

If I look at the example I see that there are 5 things being created:

$hGraphic  = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $hFormat = _GDIPlus_StringFormatCreate ()
    $hFamily = _GDIPlus_FontFamilyCreate  ("Arial")
    $hFont = _GDIPlus_FontCreate ($hFamily, 12,  2)
     $tLayout = _GDIPlus_RectFCreate (140,  110,  0,  0)

Compared to:

Local $hGui = GUICreate("dsd")
Local $iLabel = GUICtrlCreateLabel("",10,10,500,500)
Edited by Kip

Share this post


Link to post
Share on other sites
JScript

Well, I didn't notice that function to be honest, but some reasons.

- It doesn't require _GDIPlus_StartUp()

- Easier to use

- Takes less memory?

If I look at the example I see that there are 5 things being created:

$hGraphic  = _GDIPlus_GraphicsCreateFromHWND ($hWnd)
    $hFormat = _GDIPlus_StringFormatCreate ()
    $hFamily = _GDIPlus_FontFamilyCreate  ("Arial")
    $hFont = _GDIPlus_FontCreate ($hFamily, 12,  2)
     $tLayout = _GDIPlus_RectFCreate (140,  110,  0,  0)

Compared to:

Local $hGui = GUICreate("dsd")
Local $iLabel = GUICtrlCreateLabel("",10,10,500,500)

I made this UDF a long time ago and it works perfectly!!!

#include-once
; #INDEX# =======================================================================================================================
; Title .........: _StringEx
; AutoIt Version.: 3.2.12++
; Language.......: English
; Description ...: Add some String functions.
; Version .......: 1.08.2209.2600
; Remarks .......: 
; Credits .......: jscript
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
;_StringSize
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
;==============================================================================================================================

; #VARIABLES# ===================================================================================================================
; ===============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name...........: _StringSize
; Description ...: Returns the size (in pixels) of an string.
; Syntax.........: _StringSize( "string" [, size [, weight [, fontname ]]] )
; Parameters ....: string   - The string to evaluate the size.
;                  Size     - [Optional] Fontsize (default is 9).
;                  Weight   - [Optional] Font weight (default 400 = normal).
;                  FontName - [Optional] Font to use (OS default GUI font is used if the font is "" or is not found).
; Requirement(s).:
; Return values .: Success  - Returns a 2-element array containing the following information:
;                           $array[0] = Width
;                           $array[1] = Height
;                  Failure  - Returns the same array with 0 and sets @error to 1.
; Author ........: jscript
; Example .......: _StringSize( "Text" )
; ===============================================================================================================================
Func _StringSize($sString, $Isize = 9, $iWeight = 400, $sFontName = "")
    Local $hSTR_INTERNALWIN, $hGuiSwitch, $iCtrlID, $aCtrlGetPos, $aItemSize[2] = [0, 0]
    
    $hSTR_INTERNALWIN = GUICreate("***StringExInternalWin*** - " & Random(8, 1024), 0, 0, 0, 0, _
            BitOR(0x80000000, 0x20000000), BitOR(0x00000080, 0x00000020))   
    $hGuiSwitch = GUISwitch($hSTR_INTERNALWIN)
    
    GUISetFont($Isize, $iWeight, -1, $sFontName, $hSTR_INTERNALWIN)
    $iCtrlID = GUICtrlCreateLabel($sString, 0, 0)
    $aCtrlGetPos = ControlGetPos($hSTR_INTERNALWIN, "", $iCtrlID)
    GUIDelete($hSTR_INTERNALWIN)
    GUISwitch($hGuiSwitch)
    
    If IsArray($aCtrlGetPos) Then
        $aItemSize[0] = $aCtrlGetPos[2]; Width
        $aItemSize[1] = $aCtrlGetPos[3]; Height
        Return SetError(0, 0, $aItemSize)
    EndIf
    Return SetError(1, 0, $aItemSize)
EndFunc   ;==>_GetStringSize

http://forum.autoitbrasil.com/ (AutoIt v3 Brazil!!!)

Somewhere Out ThereJames Ingram

somewh10.png

dropbo10.pngDownload Dropbox - Simplify your life!
Your virtual HD wherever you go, anywhere!

Share this post


Link to post
Share on other sites
Skrip

And my version can handle strings with enters.

Thats actually a very useful feature.


[left][sub]We're trapped in the belly of this horrible machine.[/sub][sup]And the machine is bleeding to death...[/sup][sup][/sup][/left]

Share this post


Link to post
Share on other sites
badapple89

Been looking at a few of these kinds of UDFs but yours seems pretty simple and measures more accurately.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.