#3806 closed Feature Request (Completed)
_GDIPlus_GraphicsDrawString() with color
| Reported by: | argumentum | Owned by: | J-Paul Mesnage |
|---|---|---|---|
| Milestone: | 3.3.15.4 | Component: | Standard UDFs |
| Version: | Severity: | None | |
| Keywords: | _GDIPlus_GraphicsDrawString() | Cc: |
Description
_GDIPlus_GraphicsDrawString() is a wrapper for _GDIPlus_GraphicsDrawStringEx(). The ability to choose a color is there but not implemented and can be easily added as a last parameter $iARGB:
Func _GDIPlus_GraphicsDrawString_wColor($hGraphics, $sString, $nX, $nY, $sFont = "Arial", $fSize = 10, $iFormat = 0, $iARGB = 0xFF000000) Local $hBrush = _GDIPlus_BrushCreateSolid($iARGB) Local $hFormat = _GDIPlus_StringFormatCreate($iFormat) Local $hFamily = _GDIPlus_FontFamilyCreate($sFont) Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize) Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0.0, 0.0) Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat) If @error Then Return SetError(@error, @extended, 0) Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush) Local $iError = @error, $iExtended = @extended _GDIPlus_FontDispose($hFont) _GDIPlus_FontFamilyDispose($hFamily) _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) Return SetError($iError, $iExtended, $aResult) EndFunc ;==>_GDIPlus_GraphicsDrawString
Attachments (0)
Change History (8)
comment:1 by , on Feb 21, 2021 at 3:00:02 PM
| Version: | 3.3.15.3 |
|---|
comment:2 by , on Feb 23, 2021 at 1:16:10 PM
Hi,
Do you understand why it is working only if alpha channel is set to FF
0XFF0000 does not work with the AutoIt Example
comment:3 by , on Feb 24, 2021 at 3:37:04 PM
yes. I only added the default for _GDIPlus_BrushCreateSolid(), and this function calls for it.
In my testing below, it shows to work with Alpha other than FF
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
Example()
Func Example()
Local $hGUI, $hGraphic
; Create GUI
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState(@SW_SHOW)
; Draw a string
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, 0x33006600)
Sleep(1000)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, 0xFF006600)
;~ _GDIPlus_GraphicsDrawString($hGraphic, "Hello world", 140, 110, "Arial", 10, 0)
; Loop until the user exits.
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>Example
Func _GDIPlus_GraphicsDrawString_wColor($hGraphics, $sString, $nX, $nY, $sFont = "Arial", $fSize = 10, $iFormat = 0, $iARGB = 0xFF000000)
Local $hBrush = _GDIPlus_BrushCreateSolid($iARGB)
Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize)
Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0.0, 0.0)
Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
If @error Then Return SetError(@error, @extended, 0)
Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
Local $iError = @error, $iExtended = @extended
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
Return SetError($iError, $iExtended, $aResult)
EndFunc ;==>_GDIPlus_GraphicsDrawString
comment:4 by , on Feb 24, 2021 at 5:54:41 PM
Thanks,
so I think If alpha = 0 then we need to force alpha = 0xff
right?
comment:5 by , on Feb 24, 2021 at 9:24:19 PM
All "Brush" in GDIplus use ARGB. It should not be a "got ya".
The function can exclude the Alpha aspect altogether and pass a $iRGB, but the extra $iARGB is from _GDIPlus_BrushCreateSolid().
On the other hand, an alpha of 0x00 is like .. will show nothing. So adding the 0xFF would aid a scripter that did not read the included help ( that by then will have a use example ).
I vote for "no alpha force" to keep it in line with _GDIPlus_GraphicsDrawStringEx() where the _GDIPlus_BrushCreateSolid() calls for ARGB.
comment:6 by , on Feb 24, 2021 at 9:49:12 PM
...actually my request is because I use https://www.autoitscript.com/forum/files/file/489-my-fine-tuned-high-contrast-theme/ and I don't have black as default text, so, to have a proper default we'd have to lookup the default color by If $iARGB = Default Then $iARGB = _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOWTEXT)) + 0xFF000000 so the modified example is
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <WinAPISysWin.au3>
#include <WinAPIGdi.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
Example()
Func Example() ; for https://www.autoitscript.com/trac/autoit/ticket/3806#comment:6
Local $hGUI, $hGraphic
; Create GUI
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState(@SW_SHOW)
; Draw a string
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, Default)
Sleep(1000)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, 0xFF00FF00)
Sleep(1000)
_GDIPlus_GraphicsDrawString($hGraphic, "Hello world", 140, 110, "Arial", 10, 0)
; Loop until the user exits.
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>Example
Func _GDIPlus_GraphicsDrawString_wColor($hGraphics, $sString, $nX, $nY, $sFont = "Arial", $fSize = 10, $iFormat = 0, $iARGB = Default)
If $iARGB = Default Then $iARGB = _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOWTEXT)) + 0xFF000000
Local $hBrush = _GDIPlus_BrushCreateSolid($iARGB)
Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize)
Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0.0, 0.0)
Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
If @error Then Return SetError(@error, @extended, 0)
Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
Local $iError = @error, $iExtended = @extended
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
Return SetError($iError, $iExtended, $aResult)
EndFunc ;==>_GDIPlus_GraphicsDrawString
comment:7 by , on Feb 24, 2021 at 10:09:39 PM
..also, to avoid all those #include, this next example may be a better fit
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
;~ #include <WinAPISysWin.au3>
;~ #include <WinAPIGdi.au3>
;~ #include <WinAPISysWin.au3>
;~ #include <WindowsConstants.au3>
Example()
Func Example() ; for https://www.autoitscript.com/trac/autoit/ticket/3806#comment:7
Local $hGUI, $hGraphic
; Create GUI
$hGUI = GUICreate("GDI+", 400, 300)
GUISetState(@SW_SHOW)
; Draw a string
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, Default)
Sleep(1000)
_GDIPlus_GraphicsDrawString_wColor($hGraphic, "Hello world", 140, 110, "Arial", 10, 0, 0xFF00FF00)
Sleep(1000)
_GDIPlus_GraphicsDrawString($hGraphic, "Hello world", 140, 110, "Arial", 10, 0)
; Loop until the user exits.
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
; Clean up resources
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
EndFunc ;==>Example
Func __GDIPlus_GetSysColor($iIndex = 8) ; $COLOR_WINDOWTEXT = 8 ; to avoid all those #include
Local $aResult = DllCall("user32.dll", "INT", "GetSysColor", "int", $iIndex)
If @error Then Return SetError(@error, @extended, 0)
Return BitOR(BitAND($aResult[0], 0x00FF00), BitShift(BitAND($aResult[0], 0x0000FF), -16), BitShift(BitAND($aResult[0], 0xFF0000), 16))
EndFunc ;==>_WinAPI_GetSysColor
Func _GDIPlus_GraphicsDrawString_wColor($hGraphics, $sString, $nX, $nY, $sFont = "Arial", $fSize = 10, $iFormat = 0, $iARGB = Default)
;~ If $iARGB = Default Then $iARGB = _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_WINDOWTEXT)) + 0xFF000000
If $iARGB = Default Then $iARGB = __GDIPlus_GetSysColor() + 0xFF000000 ; to avoid all those #include
Local $hBrush = _GDIPlus_BrushCreateSolid($iARGB)
Local $hFormat = _GDIPlus_StringFormatCreate($iFormat)
Local $hFamily = _GDIPlus_FontFamilyCreate($sFont)
Local $hFont = _GDIPlus_FontCreate($hFamily, $fSize)
Local $tLayout = _GDIPlus_RectFCreate($nX, $nY, 0.0, 0.0)
Local $aInfo = _GDIPlus_GraphicsMeasureString($hGraphics, $sString, $hFont, $tLayout, $hFormat)
If @error Then Return SetError(@error, @extended, 0)
Local $aResult = _GDIPlus_GraphicsDrawStringEx($hGraphics, $sString, $hFont, $aInfo[0], $hFormat, $hBrush)
Local $iError = @error, $iExtended = @extended
_GDIPlus_FontDispose($hFont)
_GDIPlus_FontFamilyDispose($hFamily)
_GDIPlus_StringFormatDispose($hFormat)
_GDIPlus_BrushDispose($hBrush)
Return SetError($iError, $iExtended, $aResult)
EndFunc ;==>_GDIPlus_GraphicsDrawString
by adding GDIPlus_GetSysColor() as an internal function.
comment:8 by , on Feb 28, 2021 at 4:31:15 PM
| Milestone: | → 3.3.15.4 |
|---|---|
| Owner: | set to |
| Resolution: | → Completed |
| Status: | new → closed |
Added by revision [12494] in version: 3.3.15.4

Automatic ticket cleanup.