Jump to content

Custom MsgBox Button Expansion


Recommended Posts

Hello, Please look the image below:

post-89462-0-05622300-1427376853.png

Code:

_MsgBoxEx(48, "Test", "Please look at the buttons", -1, -1, "Mr. Button, can you expand a bit?")

I am using MsgBox UDF by Smoke_n

Thanks in Advance, TD :)

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

  • Moderators

TheDcoder,

Use my ExtMsgBox UDF instead. ;)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

  • Moderators

TheDcoder,

You obviously feel that the extra 3 characters between #include<MsgBox.au3> and #include<ExtMsgBox.au3> are real burden to type - but if you want the functionality you say you do..... ;)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

You obviously feel that the extra 3 characters between #include<MsgBox.au3> and #include<ExtMsgBox.au3> are real burden to type - but if you want the functionality you say you do..

Performance :D

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

There is a performance benefit of this version of msgbox?  I opted for flexibility with the things that stop my script anyway, and extmsgbox is much more malleable.  See this version that was bastardized with my novice hands.  *and no, i am not recommending you use this, it was just to show you how you are fighting to change 1 thing, when with Melbas solution you can change pretty much everything at will.

Example

#include "ExtMsgBox_Color.au3"

_ExtMsgBox(128, "Mr. Button, can you expand a bit", "Big Button", "Please look at the button", 10 , '' , 0 , 0xFFFFFF, 0xFFFFFF)

ExtMsgBox_Color

#include-once

; #INDEX# ============================================================================================================
; Title .........: ExtMsgBox
; AutoIt Version : v3.2.12.1 or higher
; Language ......: English
; Description ...: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; Remarks .......:
; Note ..........:
; Author(s) .....: Melba23, based on some original code by photonbuddy & YellowLab, and KaFu (default font data)
; ====================================================================================================================

;#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6

; #INCLUDES# =========================================================================================================
#include <StringSize.au3>
#include <Array.au3>

; #GLOBAL CONSTANTS# =================================================================================================
;~ Global Const $MB_IConstop = 16 ; Stop-sign icon
Global Const $MB_ICONQUERY = 32 ; Question-mark icon
Global Const $MB_ICONEXCLAM = 48 ; Exclamation-point icon
Global Const $MB_ICONINFO = 64 ; Icon consisting of an 'i' in a circle

; #GLOBAL VARIABLES# =================================================================================================
; Default settings
Global $aEMB_FontData = _GetDefaultEMBFont()
Global $iDef_EMB_Font_Size = $aEMB_FontData[0]
Global $sDef_EMB_Font_Name = $aEMB_FontData[1]
$aEMB_FontData = 0
Global $iDef_EMB_BkCol = DllCall("User32.dll", "int", "GetSysColor", "int", 15) ; $COLOR_3DFACE = 15
$iDef_EMB_BkCol = $iDef_EMB_BkCol[0]
Global $iDef_EMB_Col = DllCall("User32.dll", "int", "GetSysColor", "int", 8) ; $COLOR_WINDOWTEXT = 8
$iDef_EMB_Col = $iDef_EMB_Col[0]
; Current settings
Global $iEMB_Style = 0
Global $iEMB_Just = 0
Global $iEMB_BkCol = $iDef_EMB_BkCol
Global $iEMB_Col = $iDef_EMB_Col
Global $sEMB_Font_Name = $sDef_EMB_Font_Name
Global $iEMB_Font_Size = $iDef_EMB_Font_Size

Global $hEMB_Word, $iRippleNumber, $iRippleMax, $aRippleText , $WordColor , $LabelColor , $Wcolor

; #CURRENT# ==========================================================================================================
; _ExtMsgBoxSet: Sets the GUI style, justification, colours and font for subsequent _ExtMsgBox function calls
; _ExtMsgBox: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; ====================================================================================================================

; #INTERNAL_USE_ONLY#=================================================================================================
; _GetDefaultEMBFont: Determines Windows default MsgBox font size and name
; ====================================================================================================================

; #FUNCTION# =========================================================================================================
; Name...........: _ExtMsgBoxSet
; Description ...: Sets the GUI style, justification, colours and font for subsequent _ExtMsgBox function calls
; Syntax.........: _ExtMsgBoxSet($iStyle, $iJust, [$iBkCol, [$iCol, [$sFont_Size, [$iFont_Name]]]])
; Parameters ....: $iStyle -> 0 (Default) - Button on TaskBar, TOPMOST style set, button use selected font.
; Combine following to change:
; 1 = Button does not appear on TaskBar
; 2 = TOPMOST Style not set
; 4 = Buttons use default font
; >>>>>>>>>> Setting this parameter to 'Default' will reset ALL parameters to default values <<<<
; $iJust -> 0 = Left justified (Default), 1 = Centred , 2 = Right justified
; + 4 = Centred single button. Note: multiple buttons are always centred
; ($SS_LEFT, $SS_CENTER, $SS_RIGHT can also be used)
; $iBkCol -> The colour for the message box background. Default = system colour
; $iCol -> The colour for the message box text. Default = system colour
; Omitting a colour parameter or setting -1 leaves it unchanged
; Setting a colour parameter to Default resets the system message box colour
; $iFont_Size -> The font size in points to use for the message box. Default = system font size
; $sFont_Name -> The font to use for the message box. Default = system font
; Omitting a font parameter or setting font size to -1 or font name to "" = unchanged
; Setting a font parameter to Default resets the system message box font and size
; Requirement(s).: v3.2.12.1 or higher
; Return values .: Success - Returns 1
; Failure - Returns 0 and sets @error to 1 with @extended set to parameter index number
; Remarks .......;
; Author ........: Melba23
; Example........; Yes
;=====================================================================================================================

Func _ExtMsgBoxSet($iStyle = 0, $iJust = 0, $iBkCol = -1, $iCol = -1, $iFont_Size = -1, $sFont_Name = "")

; Set global EMB variables to required values
Switch $iStyle
Case Default
$iEMB_Style = 0 ; Button on TaskBar and $WS_EX_TOPMOST
$iEMB_Just = 0 ; $SS_LEFT
$iEMB_BkCol = $iDef_EMB_BkCol
$iEMB_Col = $iDef_EMB_Col
$sEMB_Font_Name = $sDef_EMB_Font_Name
$iEMB_Font_Size = $iDef_EMB_Font_Size
Return
Case 0 To 7
$iEMB_Style = $iStyle
Case Else
Return SetError(1, 1, 0)
EndSwitch

Switch $iJust
Case 0, 1, 2, 4, 5, 6
$iEMB_Just = $iJust
Case Else
Return SetError(1, 2, 0)
EndSwitch

Switch $iBkCol
Case Default
$iEMB_BkCol = $iDef_EMB_BkCol
Case -1
; Do nothing
Case 0 To 0xFFFFFF
$iEMB_BkCol = $iDef_EMB_BkCol
Case Else
Return SetError(1, 3, 0)
EndSwitch

Switch $iCol
Case Default
$iEMB_Col = $iDef_EMB_Col
Case -1
; Do nothing
Case 0 To 0xFFFFFF
$iEMB_Col = $iDef_EMB_Col
Case Else
Return SetError(1, 4, 0)
EndSwitch

Switch $iFont_Size
Case Default
$iEMB_Font_Size = $iDef_EMB_Font_Size
Case 8 To 72
$iEMB_Font_Size = Int($iFont_Size)
Case -1
; Do nothing
Case Else
Return SetError(1, 5, 0)
EndSwitch

Switch $sFont_Name
Case Default
$sEMB_Font_Name = $sDef_EMB_Font_Name
Case ""
; Do nothing
Case Else
If IsString($sFont_Name) Then
$sEMB_Font_Name = $sFont_Name
Else
Return SetError(1, 6, 0)
EndIf
EndSwitch

Return 1

EndFunc ;==>_ExtMsgBoxSet

; #FUNCTION# =========================================================================================================
; Name...........: _ExtMsgBox
; Description ...: Generates user defined message boxes centred on an owner, on screen or at defined coordinates
; Syntax.........: _ExtMsgBox ($vIcon, $vButton, $sTitle, $sText, [$iTimeout, [$hWin, [$iVPos]]])
; Parameters ....: $vIcon -> The icon to use: 0 - No icon, 8 - UAC, or a $MB_ICON constant as follows
; 16 - Stop, 32 - Query, 48 - Exclamation, 64 - Information
; 128 - Countdown if $iTimeout set
; Any other numeric value returns -1, error 1
; If set to the name of an exe, the main icon of that exe will be displayed
; If set to the name of an icon, the icon will be displayed
; $vButton -> Button text separated with "|" character.
; An ampersand (&) before the text indicates the default button.
; Two focus ampersands returns -1, error 2. A single button is always default
; Pressing Enter or Space fires default button
; Can also use $MB_ button numeric constants: 0 = "OK", 1 = "&OK|Cancel",
; 2 = "&Abort|Retry|Ignore", 3 = "&Yes|No|Cancel", 4 = "&Yes|No", 5 = "&Retry|Cancel",
; 6 = "&Cancel|Try Again|Continue". Other values return -1, error 3
; Default max width of 370 gives 1-4 buttons @ width 80, 5 @ width 60, 6 @ width 50
; Min button width set at 50, so unless default changed 7 buttons returns -1, error 4
; $sTitle -> The title of the message box
; $sText -> The text to be displayed. Long lines will wrap. The box depth is adjusted to fit
; The preset max width can increase to a preset absolute value if required
; $iTimeout -> Timeout delay before EMB closes. 0 = no timeout (Default)
; $hWin -> Handle of the window in which EMB is centred
; If window is hidden or no handle passed EMB centred in display (Default)
; If parameter does not hold valid window handle, it is interpreted as horizontal
; coordinate for EMB location
; $iVPos -> Vertical coordinate for EMB location, only if $hWin parameter is
; interpreted as horizontal coordinate. (Default = 0)
; $LabelColor -> Color of the CountDown Number. 0xFFFFFF (White) = Random , Default is 0 (Black).
; $WordColor -> Color of the Text in the box. 0xFFFFFF (White) = Random , Default is 0 (Black).
; Requirement(s).: v3.2.12.1 or higher
; Return values .: Success: Returns 1-based index of the button pressed, counting from the LEFT.
; Returns 0 if closed by a "CloseGUI" event (i.e. click [X] or press Escape)
; Returns 9 if timed out
; Failure: Returns -1 and sets @error as follows:
; 1 - Icon error
; 2 - Multiple default button error
; 3 - Button constant error
; 4 - Too many buttons to fit max GUI size
; 5 - StringSize error
; 6 - GUI creation error
; Remarks .......; EMB position automatically adjusted to appear on screen
; Author ........: Melba23, based on some original code by photonbuddy & YellowLab
; Example........; Yes
;=====================================================================================================================

Func _ExtMsgBox($vIcon, $vButton, $sTitle, $sText, $iTimeout = 0, $hWin = "", $iVPos = 0, $LabelColor = 0, $WordColor = 0)

Global $wColor = $WordColor

Local $iParent_Win = 0

Local $nOldOpt = Opt('GUIOnEventMode', 0)

; Set default sizes for message box
Local $iMsg_Width_max = 570, $iMsg_Width_min = 150, $iMsg_Width_abs = 700
Local $iMsg_Height_min = 100
Local $iButton_Width_max = 200, $iButton_Width_min = 50

; Declare local variables
Local $iButton_Width_Req, $iButton_Width, $iButton_Xpos, $iRet_Value, $iHpos

;; Check for icon
Local $iIcon_Style = 0
Local $iIcon_Reduction = 50
Local $sDLL = "user32.dll"
If StringIsDigit($vIcon) Then
Switch $vIcon
Case 0
$iIcon_Reduction = 0
Case 8
$sDLL = "imageres.dll"
$iIcon_Style = 78
Case 16 ; Stop
$iIcon_Style = -4
Case 32 ; Query
$iIcon_Style = -3
Case 48 ; Exclam
$iIcon_Style = -2
Case 64 ; Info
$iIcon_Style = -5
Case 128 ; Countdown
If $iTimeout > 0 Then
$fCountdown = True
Else
ContinueCase
EndIf
Case Else
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(1, 0, -1)
EndSwitch
Else
$sDLL = $vIcon
$iIcon_Style = 0
EndIf

; Check if two buttons are seeking focus
StringRegExpReplace($vButton, "((?<!&)&)(?!&)", "*")
If @extended > 1 Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(2, 0, -1)
EndIf

; Check if using constants or text
If IsNumber($vButton) Then
Switch $vButton
Case 0
$vButton = "OK"
Case 1
$vButton = "&OK|Cancel"
Case 2
$vButton = "&Abort|Retry|Ignore"
Case 3
$vButton = "&Yes|No|Cancel"
Case 4
$vButton = "&Yes|No"
Case 5
$vButton = "&Retry|Cancel"
Case 6
$vButton = "&Cancel|Try Again|Continue"
Case Else
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(3, 0, -1)
EndSwitch
EndIf

; Get message label size
While 1
    If Not IsDeclared($iEMB_Font_Size) then $iEMB_Font_Size = 10
Local $aLabel_Pos = _StringSize($sText, $iEMB_Font_Size, Default, Default, $sEMB_Font_Name, $iMsg_Width_max - 20 - $iIcon_Reduction)
If @error Then
If $iMsg_Width_max = $iMsg_Width_abs Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(5, 0, -1)
Else
$iMsg_Width_max += 10
EndIf
Else
ExitLoop
EndIf
WEnd

; Reset text to wrapped version
$sText = $aLabel_Pos[0]

; Get individual button text
Local $aButtons = StringSplit($vButton, "|")
; Get minimum GUI width needed for buttons
Local $iMsg_Width_Button = ($iButton_Width_max + 10) * $aButtons[0] + 10
; If shorter than min width
If $iMsg_Width_Button < $iMsg_Width_min Then
; Set buttons to max size and leave box min width unchanged
$iButton_Width = $iButton_Width_max
Else
; Check button width needed to fit within max box width
$iButton_Width_Req = ($iMsg_Width_max - (($aButtons[0] + 1) * 10)) / $aButtons[0]
; Button width less than min button width permitted
If $iButton_Width_Req < $iButton_Width_min Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(4, 0, -1)
; Buttons only need resizing to fit
ElseIf $iButton_Width_Req < $iButton_Width_max Then
; Set box to max width and set button size as required
$iMsg_Width_Button = $iMsg_Width_max
$iButton_Width = $iButton_Width_Req
; Buttons can be max size
Else
; Set box min width to fit buttons
$iButton_Width = $iButton_Width_max
$iMsg_Width_min = $iMsg_Width_Button
EndIf
EndIf
; Determine final button width required
$iButton_Width_Req = Int((($iButton_Width + 10) * $aButtons[0]) + 10)

; Set label size
Local $iLabel_Width = $aLabel_Pos[2]
Local $iLabel_Height = $aLabel_Pos[3]
; Set GUI size
Local $iMsg_Width = $iLabel_Width + 20 + $iIcon_Reduction
; Increase width to fit buttons if needed
If $iButton_Width_Req > $iMsg_Width Then $iMsg_Width = $iButton_Width_Req
If $iMsg_Width < $iMsg_Width_min Then
$iMsg_Width = $iMsg_Width_min
$iLabel_Width = $iMsg_Width_min - 20
EndIf
Local $iMsg_Height = $iLabel_Height + 65
If $iMsg_Height < $iMsg_Height_min Then $iMsg_Height = $iMsg_Height_min

; If only single line, lower label to to centre text on icon
Local $iLabel_Vert = 20
If StringInStr($sText, @CRLF) = 0 Then $iLabel_Vert = 27

; Check for taskbar button style required
If Mod($iEMB_Style, 2) = 1 Then ; Hide taskbar button so create as child
If IsHWnd($hWin) Then
$iParent_Win = $hWin ; Make child of that window
Else
$iParent_Win = WinGetHandle(AutoItWinGetTitle()) ; Make child of AutoIt window
EndIf
EndIf

; Determine EMB location
If $hWin = "" Then
; No handle or position passed so centre on screen
$iHpos = (@DesktopWidth - $iMsg_Width) / 2
$iVPos = (@DesktopHeight - $iMsg_Height) / 2
Else
If IsHWnd($hWin) Then
; Get parent GUI pos if visible
If BitAND(WinGetState($hWin), 2) Then
; Set EMB to centre on parent
Local $aPos = WinGetPos($hWin)
$iHpos = ($aPos[2] - $iMsg_Width) / 2 + $aPos[0] - 3
$iVPos = ($aPos[3] - $iMsg_Height) / 2 + $aPos[1] - 20
Else
; Set EMB to centre om screen
$iHpos = (@DesktopWidth - $iMsg_Width) / 2
$iVPos = (@DesktopHeight - $iMsg_Height) / 2
EndIf
Else
; Assume parameter is horizontal coord
$iHpos = $hWin ; $iVpos already set
EndIf
EndIf

; Now check to make sure GUI is visible on screen
; First horizontally
If $iHpos < 10 Then $iHpos = 10
If $iHpos + $iMsg_Width > @DesktopWidth - 20 Then $iHpos = @DesktopWidth - 20 - $iMsg_Width
; Then vertically
If $iVPos < 10 Then $iVPos = 10
If $iVPos + $iMsg_Height > @DesktopHeight - 60 Then $iVPos = @DesktopHeight - 60 - $iMsg_Height

; Remove TOPMOST extended style if required
Local $iExtStyle = 0x00000008 ; $WS_TOPMOST
If BitAND($iEMB_Style, 2) Then $iExtStyle = -1

; Create GUI with $WS_POPUPWINDOW, $WS_CAPTION style and required extended style
Local $hMsgGUI = GUICreate($sTitle, $iMsg_Width, $iMsg_Height, $iHpos, $iVPos, BitOR(0x80880000, 0x00C00000), $iExtStyle, $iParent_Win)
If @error Then
$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)
Return SetError(6, 0, -1)
EndIf
If $iEMB_BkCol <> Default Then $iEMB_BkCol = $iDef_EMB_BkCol

; Set centring parameter
Local $iLabel_Style = 0 ; $SS_LEFT
If BitAND($iEMB_Just, 1) = 1 Then
$iLabel_Style = 1 ; $SS_CENTER
ElseIf BitAND($iEMB_Just, 2) = 2 Then
$iLabel_Style = 2 ; $SS_RIGHT
EndIf

; Create label
$aRippleText = StringSplit($sText, '', 2)
Dim $Btext = $aRippleText
;~ _ArrayDisplay($aRippleText)
;~ _ArrayDisplay($Btext)
For $n = 1 To UBound($aRippleText) - 1
$Spaces = ""
For $x = 1 To $n
$Spaces &= $Btext[$x - 1]
Next
$aRippleText[$n] = $Spaces & $aRippleText[$n]
;~ _ArrayDisplay($aRippleText)
Next

$hEMB_Word = GUICtrlCreateLabel($sText, 10 + $iIcon_Reduction, $iLabel_Vert, $iLabel_Width, $iLabel_Height, $iLabel_Style)

GUICtrlSetFont(-1, $iEMB_Font_Size, Default, Default, $sEMB_Font_Name)
If $iEMB_Col <> Default Then
If $WordColor = 0xFFFFFF Then
GUICtrlSetColor(-1, Random(0, $WordColor))
Else
GUICtrlSetColor(-1, $WordColor)
EndIf
EndIf
; Create icon or countdown timer
If $fCountdown = True Then
Local $hCountdown_Label = GUICtrlCreateLabel(StringFormat("%2s", $iTimeout), 10, 20, 32, 32)
GUICtrlSetFont(-1, 18, Default, Default, $sEMB_Font_Name)
If $LabelColor = 0xFFFFFF Then
GUICtrlSetColor(-1, Random(0, $LabelColor))
Else
GUICtrlSetColor(-1, $LabelColor)
EndIf
Else
If $iIcon_Reduction Then GUICtrlCreateIcon($sDLL, $iIcon_Style, 10, 20)
EndIf

; Create dummy control for Accel key
Local $hAccel_Key = GUICtrlCreateDummy()
; Set Space key as Accel key
Local $aAccel_Key[1][2] = [["{SPACE}", $hAccel_Key]]
GUISetAccelerators($aAccel_Key)

; Create buttons
; Calculate button horizontal start
If $aButtons[0] = 1 Then
If BitAND($iEMB_Just, 4) = 4 Then
; Single centred button
$iButton_Xpos = ($iMsg_Width - $iButton_Width) / 2
Else
; Single offset button
$iButton_Xpos = $iMsg_Width - $iButton_Width - 10
EndIf
Else
; Multiple centred buttons
$iButton_Xpos = 10 + ($iMsg_Width - $iMsg_Width_Button) / 2
EndIf
; Set default button code
Local $iDefButton_Code = 1
; Set default button style
Local $iDef_Button_Style = 0
; Work through button list
For $i = 0 To $aButtons[0] - 1
Local $iButton_Text = $aButtons[$i + 1]
; Set default button
If $aButtons[0] = 1 Then ; Only 1 button
$iDef_Button_Style = 0x0001
ElseIf StringLeft($iButton_Text, 1) = "&" Then ; Look for &
$iDef_Button_Style = 0x0001
$aButtons[$i + 1] = StringTrimLeft($iButton_Text, 1)
; Set default button code for Accel key return
$iDefButton_Code = $i + 1
EndIf
; Draw button
GUICtrlCreateButton($aButtons[$i + 1], $iButton_Xpos + ($i * ($iButton_Width + 10)), $iMsg_Height - 35, $iButton_Width, 25, $iDef_Button_Style)
; Set font if required
If Not BitAND($iEMB_Style, 4) Then GUICtrlSetFont(-1, $iEMB_Font_Size, 400, 0, $sEMB_Font_Name)
; Reset default style parameter
$iDef_Button_Style = 0
Next

; Show GUI
GUISetState(@SW_SHOW, $hMsgGUI)

; Begin timeout counter
Local $iTimeout_Begin = TimerInit()
Local $iCounter = 0

; Set colour depending on random setting
If $WordColor = 0xFFFFFF Then
GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
Else
GUICtrlSetColor($hEMB_Word, $WordColor)
EndIf
; Start colour ripple function
$iRippleNumber = 0
$iRippleMax = UBound($aRippleText) - 1
AdlibRegister("Ripple", 75)

; Much faster to declare GUIGetMsg return array here and not in loop
Local $aMsg

While 1
$aMsg = GUIGetMsg(1)

If $aMsg[1] = $hMsgGUI Then
Select
Case $aMsg[0] = -3 ; $GUI_EVENT_CLOSE
$iRet_Value = 0
ExitLoop
Case $aMsg[0] = $hAccel_Key
; Accel key pressed so return default button code
$iRet_Value = $iDefButton_Code
ExitLoop
Case $aMsg[0] > $hAccel_Key
; Button handle minus Accel key handle will give button index
$iRet_Value = $aMsg[0] - $hAccel_Key
ExitLoop
EndSelect
EndIf

; Timeout if required
If TimerDiff($iTimeout_Begin) / 1000 >= $iTimeout And $iTimeout > 0 Then
$iRet_Value = 9
ExitLoop
EndIf

; Show countdown if required
If $fCountdown = True Then
Local $iTimeRun = Int(TimerDiff($iTimeout_Begin) / 1000)
If $iTimeRun <> $iCounter Then
$iCounter = $iTimeRun
GUICtrlSetData($hCountdown_Label, StringFormat("%2s", $iTimeout - $iCounter))
If $LabelColor = 0xFFFFFF Then
GUICtrlSetColor($hCountdown_Label, Random(0, $LabelColor))
Else
GUICtrlSetColor($hCountdown_Label, $LabelColor)
EndIf

If $WordColor = 0xFFFFFF Then
GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
Else
GUICtrlSetColor($hEMB_Word, $WordColor)
EndIf
EndIf
EndIf

WEnd

; Stop ripple function
AdlibUnRegister("Ripple")

$nOldOpt = Opt('GUIOnEventMode', $nOldOpt)

GUIDelete($hMsgGUI)

Return $iRet_Value

EndFunc ;==>_ExtMsgBox

Func Ripple()

$iRippleNumber += 1
If $iRippleNumber > $iRippleMax Then $iRippleNumber = 0
GUICtrlSetData($hEMB_Word, $aRippleText[$iRippleNumber])
;~ msgbox (0, '' , $wColor)
If $WColor = 0xFFFFFF Then GUICtrlSetColor($hEMB_Word, Random(0x000000, 0xFFFFFF))
EndFunc

; #INTERNAL_USE_ONLY#============================================================================================================
; Name...........: _GetDefaultEMBFont
; Description ...: Determines Windows default MsgBox font size and name
; Syntax.........: _GetDefaultEMBFont()
; Return values .: Success - Array holding determined font data
; : Failure - Array holding default values
; Array elements - [0] = Size, [1] = Weight, [2] = Style, [3] = Name, [4] = Quality
; Author ........: KaFu
; Remarks .......: Used internally by ExtMsgBox UDF
; ===============================================================================================================================
Func _GetDefaultEMBFont()

; Fill array with standard default data
Local $aDefFontData[2] = [9, "Tahoma"]

; Get AutoIt GUI handle
Local $hWnd = WinGetHandle(AutoItWinGetTitle())
; Open Theme DLL
Local $hThemeDLL = DllOpen("uxtheme.dll")
; Get default theme handle
Local $hTheme = DllCall($hThemeDLL, 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', "Static")
If @error Then Return $aDefFontData
$hTheme = $hTheme[0]
; Create LOGFONT structure
Local $tFont = DllStructCreate("long;long;long;long;long;byte;byte;byte;byte;byte;byte;byte;byte;wchar[32]")
Local $pFont = DllStructGetPtr($tFont)
; Get MsgBox font from theme
DllCall($hThemeDLL, 'long', 'GetThemeSysFont', 'HANDLE', $hTheme, 'int', 805, 'ptr', $pFont) ; TMT_MSGBOXFONT
If @error Then Return $aDefFontData
; Get default DC
Local $hDC = DllCall("user32.dll", "handle", "GetDC", "hwnd", $hWnd)
If @error Then Return $aDefFontData
$hDC = $hDC[0]
; Get font vertical size
Local $iPixel_Y = DllCall("gdi32.dll", "int", "GetDeviceCaps", "handle", $hDC, "int", 90) ; LOGPIXELSY
If Not @error Then
$iPixel_Y = $iPixel_Y[0]
; Calculate point size
$aDefFontData[0] = -Round(((1 * DllStructGetData($tFont, 1)) * 72 / $iPixel_Y), 1)
EndIf
; Close DC
DllCall("user32.dll", "int", "ReleaseDC", "hwnd", $hWnd, "handle", $hDC)
; Extract font data from LOGFONT structure
$aDefFontData[1] = DllStructGetData($tFont, 14)

Return $aDefFontData

EndFunc ;==>_GetDefaultEMBFont
Edited by boththose

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

@boththose Can you post a screenshot for me? (b/c I don't have much space in my mind)

Thanks, TD :)

Edited by TheDcoder

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

@Melba23 Also your UDF failed to fit my text's length (@error returns 5)

P.S Also, the text was not "Mr. Button, can you expand a bit?"

Edited by TheDcoder

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

  • Moderators

TheDcoder,

You may have to increase the size of the ExtMsgBox using _ExtMsgBoxSet - what is the text you to display in the button? :huh:

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

I changed the width manually, i would totally read my post realizing that if BothThose can manipulate the UDF, anyone can.

 

 

post-59031-0-29679200-1427384289.jpg

,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-.
|(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/
(_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_)
| | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) (
| | | | |)| | \ / | | | | | |)| | `--. | |) \ | |
`-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_|
'-' '-' (__) (__) (_) (__)

Link to comment
Share on other sites

What is the text you to display in the button?

This:

$sString = "This is the decoy text, I don't wanna reveal my real string b/c it would not mean anything aka non-scene, and this string is almost as the same length as the original one"

Also thanks for solution :D

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

  • Moderators

TheDcoder,

Here you go: :)

#include <ExtMsgBox.au3>

$sString = "This is the decoy text, I don't wanna reveal my real string b/c it would not mean anything aka non-scene, and this string is almost as the same length as the original one"

; Get the size of the text in pixels
$aSize = _StringSize($sString)
$sStringLen = $aSize[2]

; Now create a blank line at least as long to force the ExtMsgBox to be as wide as required so the button fits
$sBlanker = ""
Do
    $sBlanker &= " "
    $aSize = _StringSize($sBlanker)
Until $aSize[2] > $sStringLen

; Set the max width of the ExtMsgBox to prevent the text from wrapping
_ExtMsgBoxSet(0, Default, Default, Default, Default, Default, $sStringLen + 100)

; And now display the ExtMsgBox with its wide button
_ExtMsgBox(48, $sString, "Test", "Please look at the buttons" & @CRLF & $sBlanker)
Worth typing the extra 3 characters? ;)

M23

Edited by Melba23
Typo

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

Func PrepareButtons($sString1, $sString2)
    Local $sLongestString
    
    If StringLen($sString1) > StringLen($sString2) Then
        $sString1 = $sLongestString
    Else
        $sString2 = $sLongestString
    EndIf
    
    $aDimensions = _StringSize($sLongestString)
    
    Local $sBlanker[0] = ''
    
    Do
        $sBlanker[0] &= " "
        $aSize = _StringSize($sBlanker)
    Until $aSize[2] > $aDimensions[2]
    
    $sBlanker[1] = $aSize[2]
    
    Return $sBlanker
EndFunc

Its returning an error "Missing subscript dimensions in "Dim" statement", Never experienced it...

I posted this here b/c its related to this thread & not worth another thread

TD :)

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Link to comment
Share on other sites

  • Moderators

TheDcoder,

Spot the difference: ;)

Func PrepareButtons($sString1, $sString2)
    Local $sLongestString

    If StringLen($sString1) > StringLen($sString2) Then
        $sString1 = $sLongestString
    Else
        $sString2 = $sLongestString
    EndIf

    $aDimensions = _StringSize($sLongestString)

    Local $sBlanker[2] = ['']

    Do
        $sBlanker[0] &= " "
        $aSize = _StringSize($sBlanker)
    Until $aSize[2] > $aDimensions[2]

    $sBlanker[1] = $aSize[2]

    Return $sBlanker
EndFunc
M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
Share on other sites

  • Moderators

TheDcoder,

You had not declared the variable as an array, so simple assignations such as $sBlanker[0] = '' or $sBlanker[1] = $aSize[2] will not work. You either need to declare the array with its size on a separate line - or do as I did and declare it with the defined elements inside [ ] as syntax requires. All clear? :)

M23

Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind

Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...