ManojB Posted May 27, 2008 Share Posted May 27, 2008 Following code is an example file that demonstrates the Alphablend capabilities of AutoIt. (This file is included in the AutoIt installation). I tried to display text in the layered window, ie, the alpha blended window; but ended in vein. Can you help me to figure it out how it can be done. CODE #include <GDIPlus.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #include <GuiConstantsEx.au3> Opt("MustDeclareVars", 1) ; ==================================================================================================== =========================== ; Description ...: Shows how to create an alpha blended form ; Author ........: Paul Campbell (PaulIA) ; Notes .........: The images used for this demo MUST be 32 bpp with alpha channel ; Credits .......: Thanks to lod3n for supplying links to the technical documentation that was necessary to build this demo ; ==================================================================================================== =========================== ; ==================================================================================================== =========================== ; Global constants ; ==================================================================================================== =========================== Global Const $AC_SRC_ALPHA = 1 ; ==================================================================================================== =========================== ; Global variables ; ==================================================================================================== =========================== Global $hGUI1, $hGUI2, $iLabel1, $iLabel2, $iSlider, $hImage ; Create GUI $hGUI1 = GUICreate("Alpha Blend", 400, 100) $iLabel1 = GUICtrlCreateLabel ("Adjust slider to change opacity level: (0-255)", 84, 10, 380, 20) $iSlider = GUICtrlCreateSlider(10, 32, 380, 40) $iLabel2 = GUICtrlCreateLabel ("Drag the layered window around your desktop" , 80, 74, 380, 20) GUICtrlSetLimit($iSlider, 255, 0) GUICtrlSetData ($iSlider, 255) GUISetState() ; Create layered child window $hGUI2 = GUICreate("Test", 250, 250, -1, -1, -1, $WS_EX_LAYERED, $hGUI1) ; Load layered image _GDIPlus_Startup() $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Button.png") ;~ $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Torus.png") SetBitMap($hGUI2, $hImage, 255) GUISetState() ; Register notification messages GUIRegisterMsg($WM_HSCROLL , "WM_HSCROLL" ) GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST") ; Loop until user exits do until GUIGetMsg() =$GUI_EVENT_CLOSE ; Release resources _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() ; ==================================================================================================== =========================== ; Handle the WM_HSCROLL notificaton so that we can change the opacity in real time ; ==================================================================================================== =========================== Func WM_HSCROLL($hWnd, $iMsg, $iwParam, $ilParam) SetBitMap($hGUI2, $hImage, GUICtrlRead($iSlider)) EndFunc ; ==================================================================================================== =========================== ; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image. ; ==================================================================================================== =========================== Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam) if ($hWnd = $hGUI2) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION EndFunc ; ==================================================================================================== =========================== ; SetBitMap ; ==================================================================================================== =========================== Func SetBitmap($hGUI, $hImage, $iOpacity) Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend $hScrDC = _WinAPI_GetDC(0) $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC) $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap) $tSize = DllStructCreate($tagSIZE) $pSize = DllStructGetPtr($tSize ) DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage)) DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage)) $tSource = DllStructCreate($tagPOINT) $pSource = DllStructGetPtr($tSource) $tBlend = DllStructCreate($tagBLENDFUNCTION) $pBlend = DllStructGetPtr($tBlend) DllStructSetData($tBlend, "Alpha" , $iOpacity ) DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA) _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA) _WinAPI_ReleaseDC (0, $hScrDC) _WinAPI_SelectObject($hMemDC, $hOld) _WinAPI_DeleteObject($hBitmap) _WinAPI_DeleteDC ($hMemDC) EndFunc AlphaBlend.au3 Link to comment Share on other sites More sharing options...
ProgAndy Posted May 27, 2008 Share Posted May 27, 2008 You could add following lines after $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Button.png") Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) _GDIPlus_GraphicsDrawString($hGraphic,"TEST",10,10) _GDIPlus_GraphicsDispose ($hGraphic) *GERMAN* [note: you are not allowed to remove author / modified info from my UDFs]My UDFs:[_SetImageBinaryToCtrl] [_TaskDialog] [AutoItObject] [Animated GIF (GDI+)] [ClipPut for Image] [FreeImage] [GDI32 UDFs] [GDIPlus Progressbar] [Hotkey-Selector] [Multiline Inputbox] [MySQL without ODBC] [RichEdit UDFs] [SpeechAPI Example] [WinHTTP]UDFs included in AutoIt: FTP_Ex (as FTPEx), _WinAPI_SetLayeredWindowAttributes Link to comment Share on other sites More sharing options...
ManojB Posted May 27, 2008 Author Share Posted May 27, 2008 You could add following lines after $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Button.png") Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) _GDIPlus_GraphicsDrawString($hGraphic,"TEST",10,10) _GDIPlus_GraphicsDispose ($hGraphic) Wow! That much simple... Thanks for helping me out. Why this string is displayed weird/not smooth finish ? Is there any way to do that? Link to comment Share on other sites More sharing options...
JRowe Posted May 27, 2008 Share Posted May 27, 2008 There's a bug in your original code... change the line _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA) to _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 2) Or just set $ULW_ALPHA to 2 somewhere else in the code. That makes everything nice on my system. [center]However, like ninjas, cyber warriors operate in silence.AutoIt Chat Engine (+Chatbot) , Link Grammar for AutoIt , Simple Speech RecognitionArtificial Neural Networks UDF , Bayesian Networks UDF , Pattern Matching UDFTransparent PNG GUI Elements , Au3Irrlicht 2Advanced Mouse Events MonitorGrammar Database GeneratorTransitions & Tweening UDFPoker Hand Evaluator[/center] Link to comment Share on other sites More sharing options...
ManojB Posted May 28, 2008 Author Share Posted May 28, 2008 There's a bug in your original code... change the line _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA) to _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 2) Or just set $ULW_ALPHA to 2 somewhere else in the code. That makes everything nice on my system. This doesn't help the situation. The displayed text seems to be bricky type. (No Smoothness). Please go through my code CODE#include <GDIPlus.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> #include <GuiConstantsEx.au3> Opt("MustDeclareVars", 1) ; ==================================================================================================== =========================== ; Description ...: Shows how to create an alpha blended form ; Author ........: Paul Campbell (PaulIA) ; Notes .........: The images used for this demo MUST be 32 bpp with alpha channel ; Credits .......: Thanks to lod3n for supplying links to the technical documentation that was necessary to build this demo ; ==================================================================================================== =========================== ; ==================================================================================================== =========================== ; Global constants ; ==================================================================================================== =========================== Global Const $AC_SRC_ALPHA = 1 ; ==================================================================================================== =========================== ; Global variables ; ==================================================================================================== =========================== Global $hGUI1, $hGUI2, $iLabel1, $iLabel2, $iSlider, $hImage ; Create GUI $hGUI1 = GUICreate("Alpha Blend", 400, 100) $iLabel1 = GUICtrlCreateLabel ("Adjust slider to change opacity level: (0-255)", 84, 10, 380, 20) $iSlider = GUICtrlCreateSlider(10, 32, 380, 40) $iLabel2 = GUICtrlCreateLabel ("Drag the layered window around your desktop" , 80, 74, 380, 20) GUICtrlSetLimit($iSlider, 255, 0) GUICtrlSetData ($iSlider, 255) GUISetState() ; Create layered child window $hGUI2 = GUICreate("Test", 250, 250, -1, -1, -1, $WS_EX_LAYERED, $hGUI1) ; Load layered image _GDIPlus_Startup() ;$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\Button.png") $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Images\alpha.png") Local $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) _GDIPlus_GraphicsDrawString($hGraphic,"TEST",10,20,$sFont="Arial",9) _GDIPlus_GraphicsDispose ($hGraphic) SetBitMap($hGUI2, $hImage, 255) GUISetState() ; Register notification messages GUIRegisterMsg($WM_HSCROLL , "WM_HSCROLL" ) GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST") ; Loop until user exits do until GUIGetMsg() =$GUI_EVENT_CLOSE ; Release resources _GDIPlus_ImageDispose($hImage) _GDIPlus_Shutdown() ; ==================================================================================================== =========================== ; Handle the WM_HSCROLL notificaton so that we can change the opacity in real time ; ==================================================================================================== =========================== Func WM_HSCROLL($hWnd, $iMsg, $iwParam, $ilParam) SetBitMap($hGUI2, $hImage, GUICtrlRead($iSlider)) EndFunc ; ==================================================================================================== =========================== ; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image. ; ==================================================================================================== =========================== Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam) if ($hWnd = $hGUI2) and ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION EndFunc ; ==================================================================================================== =========================== ; SetBitMap ; ==================================================================================================== =========================== Func SetBitmap($hGUI, $hImage, $iOpacity) Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend $hScrDC = _WinAPI_GetDC(0) $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC) $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage) $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap) $tSize = DllStructCreate($tagSIZE) $pSize = DllStructGetPtr($tSize ) DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth ($hImage)) DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage)) $tSource = DllStructCreate($tagPOINT) $pSource = DllStructGetPtr($tSource) $tBlend = DllStructCreate($tagBLENDFUNCTION) $pBlend = DllStructGetPtr($tBlend) DllStructSetData($tBlend, "Alpha" , $iOpacity ) DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA) _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, 2) _WinAPI_ReleaseDC (0, $hScrDC) _WinAPI_SelectObject($hMemDC, $hOld) _WinAPI_DeleteObject($hBitmap) _WinAPI_DeleteDC ($hMemDC) EndFunc Link to comment Share on other sites More sharing options...
JRowe Posted May 28, 2008 Share Posted May 28, 2008 On my system, it appears just fine. What's the blockiness look like on yours? [center]However, like ninjas, cyber warriors operate in silence.AutoIt Chat Engine (+Chatbot) , Link Grammar for AutoIt , Simple Speech RecognitionArtificial Neural Networks UDF , Bayesian Networks UDF , Pattern Matching UDFTransparent PNG GUI Elements , Au3Irrlicht 2Advanced Mouse Events MonitorGrammar Database GeneratorTransitions & Tweening UDFPoker Hand Evaluator[/center] Link to comment Share on other sites More sharing options...
ManojB Posted May 28, 2008 Author Share Posted May 28, 2008 On my system, it appears just fine. What's the blockiness look like on yours? Please see the attachment. I've used Arial, 11. 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