funkey Posted December 17, 2009 Share Posted December 17, 2009 (edited) Hello! My newest function creates a button with an icon and a label. It's quite easy to use. expandcollapse popup#include <GUIConstantsEx.au3> #include <GDIPlus.au3> Local $hGUI = GUICreate("Funkey's BitBtn-Example", 1060, 270) Local $IcoPath = StringLeft(@AutoItExe, StringInStr(@AutoItExe, "\", 0, -1)) & "Icons\au3.ico" $BitBtn1 = _GUICtrlCreateBitBtn("Explorer", 10, 10, 200, 25, "shell32.dll", 5) $BitBtn2 = _GUICtrlCreateBitBtn("Button2", 10, 40, 200, 35, "shell32.dll", 7) $BitBtn3 = _GUICtrlCreateBitBtn("Button3", 10, 80, 200, 55, "shell32.dll", 10, 20) $BitBtn4 = _GUICtrlCreateBitBtn("Button4", 10, 140, 200, 55, $IcoPath, 20) $BitBtn5 = _GUICtrlCreateBitBtn("Papierkorb", 10, 200, 200, 55, "shell32.dll", 32, 30, 20, 0, 20) $BitBtn6 = _GUICtrlCreateBitBtn("Explorer", 220, 10, 200, 25, "shell32.dll", 5, -1, 0, 1) $BitBtn7 = _GUICtrlCreateBitBtn("Button7", 220, 40, 200, 35, "shell32.dll", 7, -1, 0, 1) $BitBtn8 = _GUICtrlCreateBitBtn("Button8", 220, 80, 200, 55, "shell32.dll", 10, 20, 0, 1) $BitBtn9 = _GUICtrlCreateBitBtn("Button9", 220, 140, 200, 55, $IcoPath, 20, -1, 0, 1) $BitBtn10= _GUICtrlCreateBitBtn("Papierkorb", 220, 200, 200, 55, "shell32.dll", 32, 30, 20, 1, 20) $BitBtn11 = _GUICtrlCreateBitBtn("Explorer", 430, 10, 200, 25, "shell32.dll", 5, -1, 0, 2) $BitBtn12 = _GUICtrlCreateBitBtn("Button12", 430, 40, 200, 35, "shell32.dll", 7, -1, 0, 2) $BitBtn13 = _GUICtrlCreateBitBtn(@CR & @CR & "Button13", 430, 80, 200, 55, "shell32.dll", 10, 20, 0, 2) $BitBtn14 = _GUICtrlCreateBitBtn(@CR & @CR & "Button14", 430, 140, 200, 55, $IcoPath, 20, 30, 0, 2, 10) $BitBtn15 = _GUICtrlCreateBitBtn(@CR & "Papierkorb", 430, 200, 200, 55, "shell32.dll", 32, 20, 20, 2, 15) $BitBtn16 = _GUICtrlCreateBitBtn("Explorer", 640, 10, 200, 25, "shell32.dll", 5, -1, 0, 3) $BitBtn17 = _GUICtrlCreateBitBtn("Button17", 640, 40, 200, 35, "shell32.dll", 7, -1, 0, 3) $BitBtn18 = _GUICtrlCreateBitBtn("Button18", 640, 80, 200, 55, "shell32.dll", 10, 20, 0, 3, 15) $BitBtn19 = _GUICtrlCreateBitBtn("Button19", 640, 140, 200, 55, $IcoPath, 20, 35, 0, 3) $BitBtn20 = _GUICtrlCreateBitBtn("Papierkorb", 640, 200, 200, 55, "shell32.dll", 32, -1, 20, 3, 20) $BitBtn21 = _GUICtrlCreateBitBtn("", 850, 10, 200, 25, "shell32.dll", 5, -1, 0, 4) $BitBtn22 = _GUICtrlCreateBitBtn("", 850, 40, 200, 35, "shell32.dll", 7, -1, 0, 4) $BitBtn23 = _GUICtrlCreateBitBtn("", 850, 80, 200, 55, "shell32.dll", 10, 20, 0, 4) $BitBtn24 = _GUICtrlCreateBitBtn("", 850, 140, 200, 55, $IcoPath, 20, -1, 0, 4) $BitBtn25 = _GUICtrlCreateBitBtn("Papierkorb", 850, 200, 200, 55, "shell32.dll", 32, -1, 20, 4, 20) GUISetState() Local $msg While 1 $msg = GUIGetMsg() If $msg = $GUI_EVENT_CLOSE Then Exit For $i = 1 To 25 If $msg = Eval("BitBtn" & $i) Then ConsoleWrite("$BitBtn"&$i& ": " & _BitBtnClick(Eval("BitBtn" & $i)) & @CR) Next Sleep(10) WEnd Func _GUICtrlCreateBitBtn($sText, $iLeft, $iTop, $iWidth, $iHeight, $sImg, $iIndex = 0, $iMaxIconHeight = -1, $iDist = 0, $nAllign = 0, $iFontSize = 8.5, $iFontWeight = Default) ;funkey 16.12.2009 Local $iOffsetX, $iOffsetY, $LabelStyle = 0x201 Local $a = _GetTextSize("a a", $iFontSize) Local $b = _GetTextSize("aa", $iFontSize) Local $SpaceLen = ($a[0] - $b[0]) / 5 Local $aSize = _GetTextSize($sText, $iFontSize) Local $iIconHeight = $iMaxIconHeight If $iMaxIconHeight = -1 Or $iMaxIconHeight > $iHeight - 8 Then $iIconHeight = $iHeight - 8 EndIf Local $iSpaces = Ceiling(($iIconHeight + $iDist) / $SpaceLen) Switch $nAllign Case 0 ;Icon is left $iOffsetX = $iWidth / 2 - $aSize[0] / 2 - $iIconHeight / 2 - $iDist / 2 $iOffsetY = ($iHeight - $iIconHeight) / 2 $sText = StringFormat("%" & $iSpaces + StringLen($sText) & "s", $sText) Case 1 ;Icon is right $iOffsetX = $iWidth / 2 + $aSize[0] / 2 - $iIconHeight / 2 + $iDist / 2 $iOffsetY = ($iHeight - $iIconHeight) / 2 $sText = StringFormat("%" & -$iSpaces - StringLen($sText) & "s", $sText) Case 2 ;Icon is on the top $iOffsetX = $iWidth / 2 - $iIconHeight / 2 $iOffsetY = 4 $LabelStyle = 0x1 Case 3 ;Icon is on the bottom $iOffsetX = $iWidth / 2 - $iIconHeight / 2 $iOffsetY = $iHeight - $iIconHeight -4 $LabelStyle = 0x1 Case 4 ;Icon is in the middle $iOffsetX = $iWidth /2 - $iIconHeight / 2 + $iDist / 2 $iOffsetY = ($iHeight - $iIconHeight) / 2 EndSwitch Local $hBtn = GUICtrlCreateLabel("", $iLeft, $iTop, $iWidth, $iHeight) GUICtrlCreateIcon($sImg, $iIndex, $iLeft + $iOffsetX, $iTop + $iOffsetY, $iIconHeight, $iIconHeight, 0) GUICtrlCreateLabel($sText, $iLeft, $iTop, $iWidth, $iHeight, $LabelStyle, 0x200) GUICtrlSetBkColor(-1, -2) ; $GUI_BKCOLOR_TRANSPARENT GUICtrlSetFont(-1, $iFontSize, $iFontWeight) GUICtrlSetState(-1, 32) ;$GUI_HIDE GUICtrlCreateLabel($sText, $iLeft, $iTop, $iWidth, $iHeight, $LabelStyle, 0x001) GUICtrlSetBkColor(-1, -2) ; $GUI_BKCOLOR_TRANSPARENT GUICtrlSetFont(-1, $iFontSize, $iFontWeight) Return $hBtn EndFunc ;==>_GUICtrlCreateBitBtn Func _BitBtnClick($IdBtn) ;funkey 16.12.2009 Local $aInfo, $aInfoLast GUICtrlSetState($IdBtn + 3, 32) ;$GUI_HIDE GUICtrlSetState($IdBtn + 2, 16) ;$GUI_SHOW $aInfoLast = GUIGetCursorInfo() Do Sleep(10) $aInfo = GUIGetCursorInfo() If @error Then Return 0 If $aInfo[4] <> $aInfoLast[4] Then ;if changing the hover-control If $aInfo[4] < $IdBtn Or $aInfo[4] > $IdBtn + 3 Then ;if not hovering the BitBtn GUICtrlSetState($IdBtn + 2, 32) ;$GUI_HIDE GUICtrlSetState($IdBtn + 3, 16) ;$GUI_SHOW Else GUICtrlSetState($IdBtn + 3, 32) ;$GUI_HIDE GUICtrlSetState($IdBtn + 2, 16) ;$GUI_SHOW EndIf EndIf $aInfoLast = $aInfo Until Not $aInfo[2] GUICtrlSetState($IdBtn + 2, 32) ;$GUI_HIDE GUICtrlSetState($IdBtn + 3, 16) ;$GUI_SHOW If $aInfo[4] <> $IdBtn + 2 And $aInfo[4] <> $IdBtn + 1 Then Return 0 Return 1 EndFunc ;==>_BitBtnClick Func _GetTextSize($nText, $iFontSize = 8.5, $sFont = 'Microsoft Sans Serif', $iFontAttributes = 0) ;Author: Bugfix ;Modified: funkey If $nText = '' Then Return _GDIPlus_Startup() Local $hFormat = _GDIPlus_StringFormatCreate(0) Local $hFamily = _GDIPlus_FontFamilyCreate($sFont) Local $hFont = _GDIPlus_FontCreate($hFamily, $iFontSize, $iFontAttributes, 3) Local $tLayout = _GDIPlus_RectFCreate(15, 171, 0, 0) Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND(0) Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphic, $nText, $hFont, $tLayout, $hFormat) Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width")) Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height")) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_GraphicsDispose($hGraphic) _GDIPlus_Shutdown() Local $aSize[2] = [$iWidth, $iHeight] Return $aSize EndFunc ;==>_GetTextSize Greetings from Austria! Have fun! Edit: Addes some parameters. Edited December 18, 2009 by funkey Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning. Link to comment Share on other sites More sharing options...
UEZ Posted December 17, 2009 Share Posted December 17, 2009 Looks very nice! Thanks for sharing! UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
picea892 Posted December 17, 2009 Share Posted December 17, 2009 Hi Funkey, The "GetTextSize" function is fantastic. I've been looking for a good streamlined version. Thanks Picea892 Link to comment Share on other sites More sharing options...
wraithdu Posted December 17, 2009 Share Posted December 17, 2009 There's an easier way to do this... see _GUICtrlButton_SetImageList Link to comment Share on other sites More sharing options...
picea892 Posted December 17, 2009 Share Posted December 17, 2009 (edited) Hi, I modified the gettextsize function for my purposes and am including. Pass the bitmap, font details and specify align left, center or right. func _drawtext($hBitmap1,$leftpos, $toppos,$text,$font,$size,$style,$fontcol,$align=2) ; left justify $align=0; right justify $align=1 ;center $align=2 $hImage1 = _GDIPlus_ImageGetGraphicsContext($hBitmap1) $fcol = StringReplace($fontcol, "0x", "0xFF") $hBrushed = _GDIPlus_BrushCreateSolid ($fcol) $hFormat = _GDIPlus_StringFormatCreate () $hFamily = _GDIPlus_FontFamilyCreate ($font) $hFont = _GDIPlus_FontCreate ($hFamily, $size, $style) $tLayout = _GDIPlus_RectFCreate ($leftpos, $toppos, 0, 0) $aInfo = _GDIPlus_GraphicsMeasureString ($hImage1, $text, $hFont, $tLayout, $hFormat) Local $iWidth = Ceiling(DllStructGetData($aInfo[0], "Width")) Local $iHeight = Ceiling(DllStructGetData($aInfo[0], "Height")) if $align=1 or $align=2 then $lpos=($leftpos/$align)-($iWidth/$align) if $align=0 then $lpos=5 $tLayout = _GDIPlus_RectFCreate ($lpos, ($toppos/2)-($iHeight/2), 0, 0) $aInfo = _GDIPlus_GraphicsMeasureString ($hImage1, $text, $hFont, $tLayout, $hFormat) _GDIPlus_GraphicsDrawStringEx ($hImage1, $text, $hFont, $aInfo[0], $hFormat, $hBrushed) _GDIPlus_ImageDispose ($hImage1) _GDIPlus_FontDispose ($hFont) _GDIPlus_FontFamilyDispose ($hFamily) _GDIPlus_StringFormatDispose ($hFormat) _GDIPlus_BrushDispose ($hBrushed) Return $hBitmap1 EndFunc [edit] With regards to your code. I'm not sure you need to create a gui in order to measure a string. I think you could use the desktop window or 0. Try using this instead #Include <WinAPI.au3> Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow()) or Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND(0) Edited December 17, 2009 by picea892 Link to comment Share on other sites More sharing options...
funkey Posted December 18, 2009 Author Share Posted December 18, 2009 wraithdu: There's an easier way to do this... see _GUICtrlButton_SetImageList You are right. I had not known this function.picea892: I'm not sure you need to create a gui in order to measure a stringYou are right too. It works with 0. Thanks for telling. I updated my funktion a last time to set alignments. But now it is not necessary anymore. @picea892: Nice new function. Where do you use it? Programming today is a race between software engineers striving tobuild bigger and better idiot-proof programs, and the Universetrying to produce bigger and better idiots.So far, the Universe is winning. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now