PrincieD

ProGUI V1.31 Professional User Interface Library (Office 2007 styles + more)

18 posts in this topic

#1 ·  Posted (edited)

Posted Image

Posted ImagePosted Image

Posted Image

Posted Image

Posted Image

Posted Image

Posted ImagePosted Image

Posted Image

V1.32 : Hi guys! this release fixes the huge amount of private-bytes/virtual memory (400 meg :);) ) that was being allocated due to the use of nested hash map structures in the skin sub-system. I've now re-factored the sub-system to use just linked lists and should be just as quick as the map method.

Please note ProGUI is license-ware and will timeout at around 5 minutes per session so that you can trial out ProGUI with your applications. A license for the standard version is only €30 (EUR) however! There is also a ProGUI Gold license which is slightly more expensive but Includes full source code of ProGUI and a license to use it in your own projects: €45 (EUR)

http://www.progui.co.uk

ProGUI Forums

http://www.progui.co.uk/phpBB/index.php

ProGUI Main Archive: Includes DLL version, AutoIt wrapper and reference manual. (both native 32 bit and 64 bit versions of each)

http://www.progui.co.uk/downloads/ProGUI.rar

http://www.progui.co.uk/downloads/ProGUI.zip

Examples:

http://www.progui.co.uk/downloads/ProGUI_AutoIt_Examples.rar

http://www.progui.co.uk/downloads/ProGUI_AutoIt_Examples.zip

Main Features

· Easy to use and simple API with commands such as "MenuTitleEx(title.s)"

· Easy Installation

· Extremely fast rendering with internal caching and intelligent double-buffering.

· One of the most accurate replica of Whidbey, Office 2007 and Office 2003 styles that exist as well as improvements over Microsoft's engine such as flicker free menu tracking and superior menu scrolling!

· Native 32 bit and 64 bit versions!

· Windows 7, Vista and XP compatible.

· Unicode support.

. Full Source Code included in ProGUI Gold edition.

· Rebars! (IE Explorer style container control for toolbars), multiple rebars on multiple windows!

· Extended rebar functionality including new Office 2007 and Office 2003 style, auto vertical resizing and user vertical resizing.

· Super smooth window resizing of components, no wild jumping or flickering!

· Option for automatic double buffering of rebars when resizing!

· Full Automatic Chevron support for rebars, see IE Explorer - resize the window too small and click on the chevron to see a popup menu with toolbar icons.

· Extended toolbars, full 32bit Alpha masked icon/image support of any size for toolbar buttons with separate images for normal, hot and disabled states. As many toolbars as you want on multiple windows!

· New Office 2007/Office 2003 Toolstrip style toolbars!

. Office 2007/Office 2003 styled ComboBoxes in toolbars/rebars.

· Support for drop down buttons in toolbars, just pass a popup menu or extended popup menu to the command!

· Extended menus! Have cool "floating" menus contained in a rebar/container with ease! Full support for 32bit Alpha masked icons/images of any size in menus with support for different images for normal, hot and disabled states! Includes extended system menu and popup menu. Different styles of menus available for example: Office 2007 style menus, Office 2003 style menus, Office XP/Whidbey style menus, IE Explorer style, Classic/Mozilla Firefox Style and other styles. Automatic chevrons on menus when window resized too small! Automatic detection of system font change and resized accordingly. Full keyboard navigation and hot-key support. When menu goes off screen automatically fits inside screen (see Explorer for a bad implementation of this, see Firefox for a good implementation).

· Theme adaptive custom user defined colours for User Interface styles.

Thanks!

Chris.

Edited by PrincieD

Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites



If I wasn't a student I'd get the source... Unfortunately for you I am :)

1 person likes this

Share this post


Link to post
Share on other sites

If I wasn't a student I'd get the source... Unfortunately for you I am :)

hehe thats ok Mat and thanks I know what it's like to be a poor student, it sucks lol


Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

This is the ExplorerBar example code and shows how easy it is to get up and running with ProGUI :)

; Demonstrates how to use ExplorerBars
Global $Use64BitProGUI = False ; Use 64bit version of ProGUI (True/False)
#include <ProGUI_AutoIt.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Constants.au3>
Func WindowHeight($hWnd)
    $rc = _WinAPI_GetClientRect($hWnd)
    Return DllStructGetData($rc, "bottom")-DllStructGetData($rc, "top")
EndFunc
Func WindowWidth($hWnd)
    $rc = _WinAPI_GetClientRect($hWnd)
    Return DllStructGetData($rc, "right")-DllStructGetData($rc, "left")
EndFunc

StartProGUI("", 0, 0, 0, 0, 0, 0, 0)

;- Control Constants
Enum $ExplorerBar
; Define some global arrays for easy access of icon images
Global $imageNormal[8]
Global $imageHot[8]
Global $imageDisabled[8]
; load in some example icons
$imagenormal[0] = LoadImg("iconsshell32_1007.ico", 16, 16, 0)
$imagenormal[1] = LoadImg("iconsshell32_271.ico", 16, 16, 0)
$imagenormal[2] = LoadImg("iconsshell32_22.ico", 16, 16, 0)
$imagenormal[3] = LoadImg("iconsshell32_18.ico", 16, 16, 0)
$imagenormal[4] = LoadImg("iconsshell32_235.ico", 16, 16, 0)
$imagenormal[5] = LoadImg("iconsshell32_4.ico", 16, 16, 0)
$imagenormal[6] = LoadImg("iconsshell32_4.ico", 96, 96, 0)
;- process ProGUI Windows event messages here
Func ProGUI_EventCallback($hwnd, $message, $wParam, $lParam)
  Select
    ; handle selection of menu items And $buttons
    Case $message = $WM_COMMAND
      If Hword($wParam) = 0 Then ; is an ID Then
        $MenuID = LWord($wParam)
        ConsoleWrite($MenuID&@CRLF)
      EndIf
    ; resize panelex And $textcontrolex when main window resized
    Case $message = $WM_SIZE
      _WinAPI_MoveWindow(ExplorerBarID($ExplorerBar), 5, 5, 210, WindowHeight($Window_0)-10, True)
      _WinAPI_MoveWindow(PanelExID(0, -1), 215, 5, WindowWidth($Window_0)-220, WindowHeight($Window_0)-10, True)
  EndSelect
  Return $GUI_RUNDEFMSG
EndFunc
; creates a window
Func Open_Window_0()
  Global $Window_0 = GUICreate("ExplorerBar Example", 700, 500, -1, -1, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX))
  ; create our ExplorerBar
  CreateExplorerBar($Window_0, $ExplorerBar, 5, 5, 210, 490, 0)
  AddExplorerBarGroup("System Tasks")
    ExplorerBarImageItem(0, "View system information", $imagenormal[0], 0, 0, 0)
    ExplorerBarImageItem(1, "Add or remove programs", $imagenormal[1], 0, 0, 0)
    ExplorerBarImageItem(2, "Change a setting", $imagenormal[2], 0, 0, 0)
  AddExplorerBarGroup("Other Places")
    ExplorerBarImageItem(3, "My Network Places", $imagenormal[3], 0, 0, 0)
    ExplorerBarImageItem(4, "My Documents", $imagenormal[4], 0, 0, 0)
    ExplorerBarImageItem(5, "Shared Documents", $imagenormal[5], 0, 0, 0)
    ExplorerBarImageItem(6, "Control Panel", $imagenormal[2], 0, 0, 0)
  AddExplorerBarGroup("Details")
    ExplorerBarItem(7, "Example Item 1")
    ExplorerBarItem(8, "Example Item 2")
  ; create PanelEx as main window content
  CreatePanelEx(0, $Window_0, 215, 5, 480, 490, 0)
  AddPanelExImagePage(2, $imagenormal[6], 0, 0, 0, 0, BitOR($PNLX_CENTRE, $PNLX_VCENTRE))
  ; attach our events callback for processing Windows ProGUI messages
  GUIRegisterMsg($WM_COMMAND, "ProGUI_EventCallback")
GUIRegisterMsg($WM_SIZE, "ProGUI_EventCallback")
GUIRegisterMsg($REBAR_UPDATED, "ProGUI_EventCallback")
GUIRegisterMsg($TCX_LINK_CLICK, "ProGUI_EventCallback")
GUIRegisterMsg($TCX_LINK_HOVER, "ProGUI_EventCallback")
EndFunc

Open_Window_0() ; create window
GUISetState(@SW_SHOW) ; show our newly created window
; enter main event loop
Do
  $Event = GUIGetMsg()
Until $Event = $GUI_EVENT_CLOSE

Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

You never fail to dissappoint with ProGUI, do you? I would buy it too but I'm also a student, and I don't have a job so unfortunately I can't.

Share this post


Link to post
Share on other sites

You never fail to dissappoint with ProGUI, do you? I would buy it too but I'm also a student, and I don't have a job so unfortunately I can't.

Thanks Mike! :) and no worries, it's a tough time for us all at the moment with the current economic climate - hopefully things will get better soon (fingers crossed!).

Chris.

1 person likes this

Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

This is awesome. Defo gonna look into this further

Thanks


Drunken Frat-Boy Monkey Garbage

Share this post


Link to post
Share on other sites

This is awesome. Defo gonna look into this further

Thanks

Thanks engjcowi! :)

Chris.


Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

Looks, very good, but it is not that easy to creat buttons and react on a click on that button and so on.

Which language is it?

Thanks for sharing, I'll test a little bit.


Scripts & functions Organize Includes Let Scite organize the include files

Yahtzee The game "Yahtzee" (Kniffel, DiceLion)

LoginWrapper Secure scripts by adding a query (authentication)

_RunOnlyOnThis UDF Make sure that a script can only be executed on ... (Windows / HD / ...)

Internet-Café Server/Client Application Open CD, Start Browser, Lock remote client, etc.

MultipleFuncsWithOneHotkey Start different funcs by hitting one hotkey different times

Share this post


Link to post
Share on other sites

Looks, very good, but it is not that easy to creat buttons and react on a click on that button and so on.

Thanks Xenobiologist! :) yes it's a little bit more fiddly with the event capturing: AutoIT controls have their events captured like normal in the GUIGetMsg() loop (and can be mixed and matched with ProGUI controls). However ProGUI event messages are captured using the standard WinAPI WM_Command model and this needs to be registered as an AutoIT callback using the GUIRegisterMsg() command (please see the ExplorerBar code above for an example).

Which language is it?

ProGUI is wrote using PureBasic.

Thanks for sharing, I'll test a little bit.

no worries ;) and thanks! ;)

Chris.


Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

New update! V1.32, see top of thread.

Chris.


Chris Deeney, developer of ProGUI - Professional Graphical User Interface Library - [url]http://www.progui.co.uk[/url]

Share this post


Link to post
Share on other sites

damn this is nice, good work man!!!


[u]My dream is to have a dream...[/u]

Share this post


Link to post
Share on other sites

@Rizonetech You better contact him at his website since he hasn't visited the forum since 2012...


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
54 minutes ago, Rizonetech said:

I've contacted him on his website already. He is not replying. I will try again soon.

I highly doubt that he checks his website's emails/queries anymore... so you might have to wait a few weeks for him to reply.

56 minutes ago, Rizonetech said:

Thank you for your reply.

My pleasure :D


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

Share this post


Link to post
Share on other sites
16 minutes ago, TheDcoder said:

I highly doubt that he checks his website's emails/queries anymore...

Why do you think so?
The latest version of his tool is 1.39 and the copyright of his websites was updated 2015.


My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

Yes, I just noticed that... still the same opinion, will have to wait a few weeks before getting a response.


AutoIt.4.Life Clubrooms - Life is like a Donut (secret key)

Spoiler

My contributions to the AutoIt Community

Some messages & Apologizes:

If I hurt you, Please accept my apologies, I never (regardless of the situation) mean to hurt anybody!!!

Also, I am very busy with my project so I will appear in the last row of the online list, if you want to contact me: Email@TheDcoder.xyz

Or you can have a nice chat with me in freenode, I use the same nick on freenode too!

3fHNZJ.gif

PLEASE JOIN ##AutoIt AND HELP THE IRC AUTOIT COMMUNITY!

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

  • Similar Content

    • davidacrozier
      By davidacrozier
      Hello all ~
      I am running an autoit script on Windows 10 inside VMware Workstation 12 Pro version 12.5.2.  Technically I am remoting into ESXi which has a Domain Controller (DC), WebServer, FilServer, Windows 10, etc.  Using the GUI (i.e. running explorer.exe) I am able to open several different folders successfully.  The desktop, documents, USB external all open without issue.  The network share opening gives me issues.  Whenever I attempt to open \\filserver\users\user\sharedfolder I get the documents folder instead.  I understand that the documents folder is the default for explorer.  I have also attempted to use the letter drive mapped to the network share (Z:) and receive the same result.  When I run this script on Windows 10 alone without  the VM or the ESXi I am able to open the network share without problems.  I have tried to use the net use command to designate a letter M: to the network share folder prior to running the script.  This did not work for me.  
      One additional avenue I think might work is to use the systreeview321 and _GUICtrlTreeView_FindItem to step through the tree looking for the network share.  Once found,  double click on it and see if that opens the shared network folder.  I can click inside the VM with my mouse on the network share and it opens just fine.  Not sure if running up against GUI issues, or permission issues, or what?
      Thanks in advance,
      Davida Crozier
      TestNetworkShare.au3
      This script is a subset of a much larger program, but it illustrates what I am dealing with.

    • superflq
      By superflq
      Hi everyone,
      GUICtrlSetState Function example ,i found $GUI_DROPACCEPTED isn't working in windows10 x64(windows_10_enterprise_2016_ltsb_x64).
      if the example put to windows10 x86 or windows xp, the $GUI_DROPACCEPTED is effective,
      the AutoIt Edition is v3.3.14.2.
      any ideas? thanks you.
       
      #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Example() Func Example() ; Create a GUI with various controls. Local $hGUI = GUICreate("Example", 420, 200, -1, -1, -1, $WS_EX_ACCEPTFILES) ; Create a label and set the state as drop accepted. Local $idLabel = GUICtrlCreateLabel("Drop a file on this label.", 10, 10, 400, 40, $WS_BORDER) GUICtrlSetState($idLabel, $GUI_DROPACCEPTED) ; Create an input and set the state as drop accepted. Local $idInput = GUICtrlCreateInput("", 10, 60, 400, 22) GUICtrlSetState($idInput, $GUI_DROPACCEPTED) Local $idOK = GUICtrlCreateButton("OK", 310, 170, 85, 25) ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE, $idOK ExitLoop Case $GUI_EVENT_DROPPED ; If the value of @GUI_DropId is $idLabel, then set the label of the dragged file. If @GUI_DropId = $idLabel Then GUICtrlSetData($idLabel, @GUI_DragFile) EndSwitch WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc ;==>Example  
    • MrCheese
      By MrCheese
      Hey Guys,
       
      So, the functions work, where primarygui() accurately determines the evaluation of the status of the checkboxes - the msgbox picks this up.
       
      However, later on, when we re-enter a 'for $i = 0 to ubound($checkbox)' loop, then in the 'batchinitial' function it doesn't picked up that the status&$i = 1, so it jumps out, then within the While 1 loop, it exits the loop in the first row, again because the status& $i= 0
      The "assign" line within the primarygui funtion, is this only a local assignment? if so, how can I make it cross function?
       
      Thank in adv for your help
       
       
      Func excelsheetlist() $i = 0 Global $aWorkSheets = _Excel_SheetList($oWorkbook1) If @error Then Exit MsgBox($MB_SYSTEMMODAL, "Excel UDF: _Excel_SheetList Example 1", "Error listing Worksheets." & @CRLF & "@error = " & @error & ", @extended = " & @extended) ;_ArrayDisplay($aWorkSheets, "Excel UDF: _Excel_SheetList Example 1") ;_ArrayDisplay($aWorkSheets, "Array") Global $iRows = UBound($aWorkSheets, $UBOUND_ROWS) ; Total number of rows. In this example it will be 10. Global $iCols = UBound($aWorkSheets, $UBOUND_COLUMNS) ; Total number of columns. In this example it will be 20. Global $iDimension = UBound($aWorkSheets, $UBOUND_DIMENSIONS) ; The dimension of the array e.g. 1/2/3 dimensional. MsgBox($MB_SYSTEMMODAL, "", "The array is a " & $iDimension & " dimensional array with " & _ $iRows & " row(s) & " & $iCols & " column(s).") Dim $checkbox[$iRows] EndFunc ;==>excelsheetlist Func primarygui() ; Create a GUI with various controls. Local $hGUI = GUICreate("Script Controller", 300, ($iRows * 24)) ; Create a checkbox control. ;Local $idCheckbox = GUICtrlCreateCheckbox("Standard Checkbox", 10, 10, 185, 25) Local $Button2 = GUICtrlCreateButton("Close", 210, 200, 85, 25) Local $Button3 = GUICtrlCreateButton("Run", 210, 170, 85, 25) Local $Button1 = GUICtrlCreateButton("Discharge", 210, 140, 85, 25) For $i = 0 To UBound($checkbox) - 1 $checkbox[$i] = GUICtrlCreateCheckbox($aWorkSheets[$i][0], 8, 0 + ($i * 24)) ;, 81, 17) Next ; Display the GUI. GUISetState(@SW_SHOW, $hGUI) ; Loop until the user exits. While 1 $nMsg = GUIGetMsg() Select Case $nMsg = $GUI_EVENT_CLOSE Exit Case $nMsg = $Button2 ;Close Exit Case $nMsg = $Button1 MsgBox(0, "Discharge Button not configured", "Now Exiting") Exit Case $nMsg = $Button3 ;Run $fSelection = False For $i = 0 To UBound($checkbox) - 1 If BitAND(GUICtrlRead($checkbox[$i]), $GUI_CHECKED) Then $fSelection = True ExitLoop EndIf Next If $fSelection Then For $i = 0 To UBound($checkbox) - 1 Assign("status" & $i, GUICtrlRead($checkbox[$i])) Next $batchcount = 0 For $i = 0 To UBound($checkbox) - 1 If Eval("status" & $i) = 1 Then $batchcount = $batchcount + 1 ;Call ("o" & $i & "copy") ; if you want to call the functions directly, remove ; before the call and comment or delete the following DirCopy statement MsgBox(0, "Checking", "Checking that: " & $checkbox[$i] & " no, with title: " & $aWorkSheets[$i][0] & " was selected, Batch count: " & $batchcount) ; if you need only the DirCopy EndIf Next ExitLoop Else MsgBox(48, 'No Items Selected', 'You have not selected any Patients to Load, Please select from the list') EndIf EndSelect WEnd ; Delete the previous GUI and all controls. GUIDelete($hGUI) EndFunc ;==>primarygui Func _IsChecked($idControlID) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>_IsChecked Func batchinitial() If Eval("status" & $i) = 1 Then debugbox() $oWorkbook1.Sheets(1).Activate $bigloop = $bigloop + 1 $sheet = $aWorkSheets[$i][0] $oWorkbook1.Sheets($sheet).Activate debugbox() EndIf EndFunc ;==>batchinitial OpenExcel() excelsheetlist() primarygui() For $i = 0 To UBound($checkbox) - 1 batchinitial() While 1 If Eval("status" & $i) = 0 Then ExitLoop ;all the rest of my script loops etc WEnd Next  
    • hcI
      By hcI
      Hello everyone !
      While writing a sample of code to test ping to my internet box, I got stuck..
      While the code is Pinging with let say.. 5000ms of timeout, I need to update a progress bar from 0 to 5000 ms at the same time but I don't know how could I do this..
      Is there a way or something that could get around the pause of the ping like in InetGet -> InetGetInfo?
    • tcurran
      By tcurran
      Here are two functions to provide pixel-accurate height and width dimensions for a given string.
      The more commonly-used _GDIPlus_GraphicsMeasureString built-in UDF is problematic because it returns the width padded by roughly one en-space (for reasons related to the various ways Windows produces anti-aliased fonts).
      These are AutoIt translations of Pierre Arnaud's C# functions, described in his CodeProject article "Bypass Graphics.MeasureString limitations"
      The first is an all-purpose version that takes a window handle, string, font family, font size (in points), style, and (optionally) width of the layout column (in pixels) as parameters.
      The second, more efficient version is intended for applications where GDI+ fonts are already in use, and takes handles to the existing graphics context, string, font, layout and format as parameters.
      Both functions return a two-row array with the exact width [0] and height [1] of the string (in pixels).
      EDIT: (Note that some of the same anti-aliasing measurement issues still apply. I did my best to work around them, but the output of the function may still be off by a pixel or two. Buyer beware.)
      #include <GDIPlus.au3> #include <GUIConstantsEx.au3> ; #FUNCTION# ==================================================================================================================== ; Name ..........: _StringInPixels ; Description ...: Returns a pixel-accurate height and width for a given string using a given font, style and size. ; Syntax ........: _StringInPixels($hGUI, $sString, $sFontFamily, $fSize, $iStyle[, $iColWidth = 0]) ; Parameters ....: $hGUI - Handle to the window. ; $sString - The string to be measured. ; $sFontFamily - Full name of the font to use. ; $fSize - Font size in points (half-point increments). ; $iStyle - Combination of 0-normal, 1-bold, 2-italic, 4-underline, 8-strikethrough ; $iColWidth - [optional] If word-wrap is desired, column width in pixels ; Return values .: 2-row array. [0] is width in pixels; [1] is height in pixels. ; Author ........: Tim Curran; adapted from Pierre Arnaud's C# function ; Modified ......: ; Remarks .......: This version is longer and less efficient but works for all purposes. ; Related .......: <https://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations> ; Link ..........: ; Example .......: Example-StringInPixels.au3 ; =============================================================================================================================== #include <GDIPlus.au3> #include <GUIConstantsEx.au3> Func _StringInPixels($hGUI, $sString, $sFontFamily, $fSize, $iStyle, $iColWidth = 0) _GDIPlus_Startup() Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;Create a graphics object from a window handle Local $aRanges[2][2] = [[1]] $aRanges[1][0] = 0 ;Measure first char (0-based) $aRanges[1][1] = StringLen($sString) ;Region = String length Local $hFormat = _GDIPlus_StringFormatCreate() Local $hFamily = _GDIPlus_FontFamilyCreate($sFontFamily) Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize, $iStyle) _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, $GDIP_TEXTRENDERINGHINT_ANTIALIASGRIDFIT) _GDIPlus_StringFormatSetMeasurableCharacterRanges($hFormat, $aRanges) ;Set ranges Local $aWinClient = WinGetClientSize($hGUI) If $iColWidth = 0 Then $iColWidth = $aWinClient[0] Local $tLayout = _GDIPlus_RectFCreate(10, 10, $iColWidth, $aWinClient[1]) Local $aRegions = _GDIPlus_GraphicsMeasureCharacterRanges($hGraphic, $sString, $hFont, $tLayout, $hFormat) ;get array of regions Local $aBounds = _GDIPlus_RegionGetBounds($aRegions[1], $hGraphic) Local $aWidthHeight[2] = [$aBounds[2], $aBounds[3]] ; Clean up resources _GDIPlus_FontDispose($hFont) _GDIPlus_RegionDispose($aRegions[1]) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_Shutdown() Return $aWidthHeight EndFunc ;==>_StringInPixels ; #FUNCTION# ==================================================================================================================== ; Name ..........: _StringInPixels_gdip ; Description ...: Returns a pixel-accurate height and width for a given string using a GDI+ font, layout and format ; Syntax ........: _StringInPixels_gdip($hGraphic, $sString, $hFont, $tLayout, $hFormat) ; Parameters ....: $hGraphic - Handle to a GDI+ graphics object. ; $sString - The string to be measured. ; $hFont - Handle to a GDI+ font. ; $tLayout - A $tagGDIPRECTF structure that bounds the string. ; $hFormat - Handle to a GDI+ string format. ; Return values .: 2-row array. [0] is width in pixels; [1] is height in pixels. ; Author ........: Tim Curran; adapted from Pierre Arnaud's C# function ; Modified ......: ; Remarks .......: This much more efficient version is for use with GDI+ fonts ; Related .......: ; Link ..........: <https://www.codeproject.com/Articles/2118/Bypass-Graphics-MeasureString-limitations> ; Example .......: Example-StringInPixels.au3 ; =============================================================================================================================== #include <GDIPlus.au3> #include <GUIConstantsEx.au3> Func _StringInPixels_gdip($hGraphic, $sString, $hFont, $tLayout, $hFormat) Local $aRanges[2][2] = [[1]] $aRanges[1][0] = 0 ;Measure first char (0-based) $aRanges[1][1] = StringLen($sString) ;Region = String length _GDIPlus_GraphicsSetTextRenderingHint($hGraphic, $GDIP_TEXTRENDERINGHINT_CLEARTYPEGRIDFIT) _GDIPlus_StringFormatSetMeasurableCharacterRanges($hFormat, $aRanges) ;Set ranges Local $aRegions = _GDIPlus_GraphicsMeasureCharacterRanges($hGraphic, $sString, $hFont, $tLayout, $hFormat) ;get array of regions Local $aBounds = _GDIPlus_RegionGetBounds($aRegions[1], $hGraphic) Local $aWidthHeight[2] = [$aBounds[2], $aBounds[3]] _GDIPlus_RegionDispose($aRegions[1]) Return $aWidthHeight EndFunc ;==>_StringInPixels_gdip  
      _StringInPixels.au3
      Example-StringInPixels.au3