Jump to content
Sign in to follow this  
kev51773

Calculate required size for gui item?

Recommended Posts

kev51773

Does anyone have any clever ideas how I can calculate the required size for a gui item based on what the text content of the item is?

Share this post


Link to post
Share on other sites
Jex
smashly

Hi, you could use _WinAPI_GetDC($hWnd) and _WinAPI_GetTextExtentPoint32($hDC, $sText) which can be found in the user defined function section of the help file under WinAPI Management.

Cheers

Share this post


Link to post
Share on other sites
MrCreatoR

@smashly

Nice solution, here is the implementation:

#include <GuiConstantsEx.au3>
#include <WinAPI.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Label = GUICtrlCreateLabel("", 20, 40)
_GUICtrlSetDataEx($Label, "Some very long data")
GUICtrlSetBkColor(-1, 0x00FFFF)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUICtrlSetDataEx($iCtrlID, $sData)
    Local $hDC = _WinAPI_GetDC(GUICtrlGetHandle($iCtrlID))
    Local $stText_Data = _WinAPI_GetTextExtentPoint32($hDC, $sData)

    Local $iText_Width = DllStructGetData($stText_Data, "X")
    Local $iText_Height = DllStructGetData($stText_Data, "Y")

    GUICtrlSetPos($iCtrlID, -1, -1, $iText_Width-StringLen($sData), $iText_Height)
    GUICtrlSetData($iCtrlID, $sData)
EndFunc

Just one small problem: as you can see, i highlighted the label specialy to see the real lenght of the text, it seems that it's a little longer then it should be. Any ideas why, or how to fix it correctly? :D


 

Spoiler

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

Spoiler

AutoIt_Icon_small.pngProjects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize Program

AutoIt_Icon_small.pngUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF
 
AutoIt_Icon_small.pngExamples: 
ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo

Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

 

 

 

AutoIt is simple, subtle, elegant. © AutoIt Team

Share this post


Link to post
Share on other sites
kev51773

Thanks guys,

That's definitely got me going in the right direction.

Share this post


Link to post
Share on other sites
Jex

@smashly

Nice solution, here is the implementation:

#include <GuiConstantsEx.au3>
#include <WinAPI.au3>

$GUI = GUICreate("Test Script", 300, 200)

$Label = GUICtrlCreateLabel("", 20, 40)
_GUICtrlSetDataEx($Label, "Some very long data")
GUICtrlSetBkColor(-1, 0x00FFFF)

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUICtrlSetDataEx($iCtrlID, $sData)
    Local $hDC = _WinAPI_GetDC(GUICtrlGetHandle($iCtrlID))
    Local $stText_Data = _WinAPI_GetTextExtentPoint32($hDC, $sData)

    Local $iText_Width = DllStructGetData($stText_Data, "X")
    Local $iText_Height = DllStructGetData($stText_Data, "Y")

    GUICtrlSetPos($iCtrlID, -1, -1, $iText_Width-StringLen($sData), $iText_Height)
    GUICtrlSetData($iCtrlID, $sData)
EndFunc

Share this post


Link to post
Share on other sites
Richard Robertson

It's a little bit longer to account for spacing in the font. True Type fonts have a lot of spacing setup.

Share this post


Link to post
Share on other sites
Details

I found this a while ago.

It works fine for me.

cs_message("This should do the trick, it is a little thinking outside the box...")
cs_message("You can do whatever you want...",12)
cs_message("Thanks to the person who wrote it... it wasn't me...",8.5)
cs_message("Nice Work!",128,5000,0x0000ff00)

Func cs_message($cs_tekst, $cs_font_grootte = 18, $cs_sleep = 3000, $cs_kleur = 0xc6d6fd)
    If $cs_font_grootte = "" Then $cs_font_grootte = 18
    If $cs_kleur = "" Then $cs_kleur = 0xc6d6fd ;default is Details! blauw
    Local $cs_lengte = _GetTextLen($cs_tekst, "Arial", $cs_font_grootte, 400)
    Local $cs_venster = GUICreate("Message", $cs_lengte + 25, $cs_font_grootte + 80, @DesktopWidth / 2- ($cs_lengte + 25) / 2, @DesktopHeight / 2- ($cs_font_grootte + 80) / 2 - 50, 0x00000200, 0x00020000) ;, $DS_SETFOREGROUND, $WS_EX_STATICEDGE)
    GUISetBkColor($cs_kleur)
    $mededeling = GUICtrlCreateLabel($cs_tekst, 10, 20, $cs_lengte, $cs_font_grootte + 75)
    GUICtrlSetFont(-1, $cs_font_grootte)
    GUISetState(@SW_SHOW)
    WinSetOnTop($cs_venster, "", 1)
    Sleep($cs_sleep)
    GUIDelete($cs_venster)
EndFunc   ;==>cs_message

Func _GetTextLen($s_WinText, $s_TextFont, $i_FontSize, $i_FontWeight = -1)
    Local Const $DEFAULT_CHARSET = 0 ; ANSI character set
    Local Const $OUT_CHARACTER_PRECIS = 2
    Local Const $CLIP_DEFAULT_PRECIS = 0
    Local Const $PROOF_QUALITY = 2
    Local Const $FIXED_PITCH = 1
    Local Const $RGN_XOR = 3
    Local Const $LOGPIXELSY = 90
    $h_WinTitle = "Get Label Width"
    If $i_FontWeight = "" Or $i_FontWeight = -1 Then $i_FontWeight = 400 ; default Font weight
    Local $h_GUI = GUICreate($h_WinTitle, 10, 10, -100, -100, 0x80880000, 0x00000080)
    Local $hDC = DllCall("user32.dll", "int", "GetDC", "hwnd", $h_GUI)
    Local $intDeviceCap = DllCall("gdi32.dll", "long", "GetDeviceCaps", "int", $hDC[0], "long", $LOGPIXELSY)
    $intDeviceCap = $intDeviceCap[0]
    Local $intFontHeight = DllCall("kernel32.dll", "long", "MulDiv", "long", $i_FontSize, "long", $intDeviceCap, "long", 72)
    $intFontHeight = -$intFontHeight[0]
    Local $hMyFont = DllCall("gdi32.dll", "hwnd", "CreateFont", "int", $intFontHeight, _
            "int", 0, "int", 0, "int", 0, "int", $i_FontWeight, "int", 0, _
            "int", 0, "int", 0, "int", $DEFAULT_CHARSET, _
            "int", $OUT_CHARACTER_PRECIS, "int", $CLIP_DEFAULT_PRECIS, _
            "int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $s_TextFont)
    DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $hDC[0], "hwnd", $hMyFont[0])
    Local $res = DllStructCreate("int;int")
    Local $ret = DllCall("gdi32.dll", "int", "GetTextExtentPoint32", "int", $hDC[0], "str", $s_WinText, "long", StringLen($s_WinText), "ptr", DllStructGetPtr($res))
    Local $intLabelWidth = DllStructGetData($res, 1)
    GUIDelete($h_GUI)
    Return $intLabelWidth
EndFunc   ;==>_GetTextLen
Edited by Details

Share this post


Link to post
Share on other sites
MrCreatoR

I seen this solution before too, i just couldn't find it :D

Here is "readable" example base on it:

#include <GuiConstantsEx.au3>

$GUI = GUICreate("_GetTextLen Demo", 300, 200)

$Label = GUICtrlCreateLabel("", 20, 40)
GUICtrlSetFont(-1, 9, 800, 0, "Tahoma")
GUICtrlSetBkColor(-1, 0x00FFFF)

_GUICtrlSetDataEx($Label, "Some very very long data", 9, 800, "Tahoma")

GUISetState(@SW_SHOW, $GUI)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Func _GUICtrlSetDataEx($iCtrlID, $sData, $iFontSize=8.5, $iFontWeight=-1, $sFontName="Arial")
    Local $aData_Len = _GetTextLen($sData, $iFontSize, $iFontWeight, $sFontName)
    
    GUICtrlSetPos($iCtrlID, -1, -1, $aData_Len[0], $aData_Len[1])
    GUICtrlSetData($iCtrlID, $sData)
EndFunc

Func _GetTextLen($s_Data, $i_FontSize=8.5, $i_FontWeight=-1, $s_TextFont="Arial")
    Local Const $DEFAULT_CHARSET = 0 ; ANSI character set
    Local Const $OUT_CHARACTER_PRECIS = 2
    Local Const $CLIP_DEFAULT_PRECIS = 0
    Local Const $PROOF_QUALITY = 2
    Local Const $FIXED_PITCH = 1
    Local Const $RGN_XOR = 3
    Local Const $LOGPIXELSY = 90
    
    If $i_FontWeight = "" Or $i_FontWeight = -1 Then $i_FontWeight = 400 ; default Font weight
    
    Local $h_GDW_GUI = GUICreate("Get Data Width", 10, 10, -100, -100, 0x80880000, 0x00000080)
    
    Local $ah_DC = DllCall("user32.dll", "int", "GetDC", "hwnd", $h_GDW_GUI)
    Local $intDeviceCap = DllCall("gdi32.dll", "long", "GetDeviceCaps", "int", $ah_DC[0], "long", $LOGPIXELSY)
    Local $intFontHeight = DllCall("kernel32.dll", "long", "MulDiv", "long", $i_FontSize, "long", $intDeviceCap[0], "long", 72)
    
    Local $ah_Font = DllCall("gdi32.dll", "hwnd", "CreateFont", "int", -$intFontHeight[0], _
        "int", 0, "int", 0, "int", 0, "int", $i_FontWeight, "int", 0, _
        "int", 0, "int", 0, "int", $DEFAULT_CHARSET, _
        "int", $OUT_CHARACTER_PRECIS, "int", $CLIP_DEFAULT_PRECIS, _
        "int", $PROOF_QUALITY, "int", $FIXED_PITCH, "str", $s_TextFont)
    
    DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $ah_DC[0], "hwnd", $ah_Font[0])
    
    Local $stRet = DllStructCreate("int;int")
    DllCall("gdi32.dll", "int", "GetTextExtentPoint32", _
        "int", $ah_DC[0], "str", $s_Data, "long", StringLen($s_Data), "ptr", DllStructGetPtr($stRet))
    
    Local $a_RetLen[2] = [DllStructGetData($stRet, 1), DllStructGetData($stRet, 2)]
    GUIDelete($h_GDW_GUI)
    
    Return $a_RetLen
EndFunc

 

Spoiler

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

Spoiler

AutoIt_Icon_small.pngProjects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize Program

AutoIt_Icon_small.pngUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF
 
AutoIt_Icon_small.pngExamples: 
ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo

Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

 

 

 

AutoIt is simple, subtle, elegant. © AutoIt Team

Share this post


Link to post
Share on other sites
MrCreatoR

Thanks Zedna, i think this is the best shot we can have on the subject :D


 

Spoiler

Using OS: Win 7 Professional, Using AutoIt Ver(s): 3.3.6.1 / 3.3.8.1

AutoIt_Rus_Community.png AutoIt Russian Community

My Work...

Spoiler

AutoIt_Icon_small.pngProjects: ATT - Application Translate Tool {new}| BlockIt - Block files & folders {new}| SIP - Selected Image Preview {new}| SISCABMAN - SciTE Abbreviations Manager {new}| AutoIt Path Switcher | AutoIt Menu for Opera! | YouTube Download Center! | Desktop Icons Restorator | Math Tasks | KeyBoard & Mouse Cleaner | CaptureIt - Capture Images Utility | CheckFileSize Program

AutoIt_Icon_small.pngUDFs: OnAutoItErrorRegister - Handle AutoIt critical errors {new}| AutoIt Syntax Highlight {new}| Opera Library! | Winamp Library | GetFolderToMenu | Custom_InputBox()! | _FileRun UDF | _CheckInput() UDF | _GUIInputSetOnlyNumbers() UDF | _FileGetValidName() UDF | _GUICtrlCreateRadioCBox UDF | _GuiCreateGrid() | _PathSplitByRegExp() | _GUICtrlListView_MoveItems - UDF | GUICtrlSetOnHover_UDF! | _ControlTab UDF! | _MouseSetOnEvent() UDF! | _ProcessListEx - UDF | GUICtrl_SetResizing - UDF! | Mod. for _IniString UDFs | _StringStripChars UDF | _ColorIsDarkShade UDF | _ColorConvertValue UDF | _GUICtrlTab_CoverBackground | CUI_App_UDF | _IncludeScripts UDF | _AutoIt3ExecuteCode | _DragList UDF | Mod. for _ListView_Progress | _ListView_SysLink | _GenerateRandomNumbers | _BlockInputEx | _IsPressedEx | OnAutoItExit Handler | _GUICtrlCreateTFLabel UDF | WinControlSetEvent UDF | Mod. for _DirGetSizeEx UDF
 
AutoIt_Icon_small.pngExamples: 
ScreenSaver Demo - Matrix included | Gui Drag Without pause the script | _WinAttach()! | Turn Off/On Monitor | ComboBox Handler Example | Mod. for "Thinking Box" | Cool "About" Box | TasksBar Imitation Demo

Like the Projects/UDFs/Examples? Please rate the topic (up-right corner of the post header: Rating AutoIt_Rating.gif)

* === My topics === *

==================================================
My_Userbar.gif
==================================================

 

 

 

AutoIt is simple, subtle, elegant. © AutoIt Team

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  

×