Jump to content
Sign in to follow this  
rafleo

Progressbar on Layered Window

Recommended Posts

rafleo

Hello there,

I am working on my first script, and having some GUI troubles...

The GUI displays alright with fade in and fade out, but I never get to see my Progressbar.

Why isn't it showing? What am I missing?

#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GUIFade.au3>


Opt("MustDeclareVars", 1)


Global Const $AC_SRC_ALPHA  = 1
Global $hGUI1, $hImage, $progressbar
Global $max_trans = 200



; Create layered window
$hGUI1 = GUICreate("Volume", 240, 220, -1, -1, -1, $WS_EX_LAYERED)
$progressbar = GUICtrlCreateProgress ( 10, 160, 220, 30)
GUICtrlSetData (-1, 75)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3399FF)


; Load layered image
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\img\osd_volume.png")


SetBitMap($hGUI1, $hImage, 0)

GUISetState()

Global $i = 0
Do
    $i = $i + 5
    If $i > 255 Then $i = 255

    SetBitMap($hGUI1, $hImage, $i)
    Sleep(1)
Until $i >= 255

; Register notification messages
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")





; Loop until user exits
do
until GUIGetMsg() =$GUI_EVENT_CLOSE

Global $i = 255
Do
    $i = $i - 5
    SetBitMap($hGUI1, $hImage, $i)
Until $i = 0


; Release resources
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()



; 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

Also, while you're at it, I didn't find a way to make the GUI always on top with no taskbar button.

Thank you for your help!

Share this post


Link to post
Share on other sites
Beege

Try setting the layered window attribute.

$hGUI1 = GUICreate("Volume", 240, 220, -1, -1, -1, $WS_EX_LAYERED)
$progressbar = GUICtrlCreateProgress ( 10, 160, 220, 30)
GUICtrlSetData (-1, 75)
GUICtrlSetColor(-1, 0xFFFFFF)
GUICtrlSetBkColor(-1, 0x3399FF)
_WinAPI_SetLayeredWindowAttributes($hGUI1, 0x010101)

Share this post


Link to post
Share on other sites
Yashied

Typically, controls does not works with a window that has WS_EX_LAYERED style. Prepare a few images for the state of progress and draw them on the main image ($hImage) by using a _GDIPlus_GraphicsDrawImageRect() function. Then apply your SetBitMap() function.

If you are using WS_EX_LAYERED to fade in/out only, it is better to use WinSetTrans().

Edited by Yashied

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
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.