Jump to content

$WS_EX_TRANSPARENT not working with GUI no background


Go to solution Solved by PhoenixXL,

Recommended Posts

Hey guys,

Im posting a new thread out of a necro post as per Melba.

I edited a .gif picture to make a transparent background (with photoshop). When I try to add this picutre into my gui, it makes the background of my picture white. I dont want any background on my picture. I just want the image alone alone with nothing around it. Using a previous post I was able to do so using the code below.

#include <GUIConstants.au3>

HotKeySet("{END}", "Terminate")

$gui=GUICreate("test transparentpic", 47, 45)
$pic=GUICreate("", 47, 45, 0, 0,$WS_POPUP,BitOr($WS_EX_LAYERED,$WS_EX_MDICHILD,$WS_EX_TRANSPARENT),$gui)
GUICtrlCreatePic("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif", 0,0,47, 45)
WinSetTrans ( $pic, "", 50 )

GUISetState(@SW_SHOW,$pic)
Sleep(1e9)
GUISetState(@SW_SHOW,$gui)

While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
    Case Else

    EndSelect
WEnd
Exit


Func Terminate()
    exit(0)
EndFunc

My problem is that I also want to make it transparent as well. When I use $WS_EX_TRANSPARENT and WinSetTrans ( $pic, "", 50 ), it appears transparent but the background comes back white.

UEZ suggested this code below using GDIPlus:

#include <GUIConstants.au3>
#include <GDIPlus.au3>
Global Const $STM_SETIMAGE = 0x0172
_GDIPlus_Startup()
$himg=_GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif")
$hbmp=_GDIPlus_BitmapCreateHBITMAPFromBitmap($himg)
_GDIPlus_ImageDispose($himg)
$gui=GUICreate("test transparentpic", 200, 250)
$pic=GUICtrlCreatePic("",60,85,68,71)
_WinAPI_DeleteObject(GUICtrlSendMsg($pic,$STM_SETIMAGE,$IMAGE_BITMAP,$hbmp))
GUISetState(@SW_SHOW,$gui)

While 1
    $msg = GuiGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            _WinAPI_DeleteObject($hbmp)
            _GDIPlus_Shutdown()
        ExitLoop
    EndSelect
WEnd
Exit

I ran this above to see what happens and it brought the image up with white background and no transparency (which is what I thought it was going to do). Then I augmented as below:

#include <GUIConstants.au3>
#include <GDIPlus.au3>

HotKeySet("{END}", "Terminate")

Global Const $STM_SETIMAGE = 0x0172
_GDIPlus_Startup()
$himg=_GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif")
$hbmp=_GDIPlus_BitmapCreateHBITMAPFromBitmap($himg)
_GDIPlus_ImageDispose($himg)

$gui=GUICreate("test transparentpic", 200, 250)
$gui=GUICreate("", 200, 250,0,0,$WS_POPUP,BitOr($WS_EX_LAYERED,$WS_EX_MDICHILD,$WS_EX_TRANSPARENT),$gui)
$pic=GUICtrlCreatePic("",60,85,68,71)
WinSetTrans ( $pic, "", 50 )

_WinAPI_DeleteObject(GUICtrlSendMsg($pic,$STM_SETIMAGE,$IMAGE_BITMAP,$hbmp))

GUISetState(@SW_SHOW,$gui)

While 1
    $msg = GuiGetMsg()
    Select
        Case $msg = $GUI_EVENT_CLOSE
            _WinAPI_DeleteObject($hbmp)
            _GDIPlus_Shutdown()
        ExitLoop
    EndSelect
WEnd

Func Terminate()
    exit(0)
EndFunc

trying to make it no background with transparency, but it still doesnt.  I dont understand why.

Any thoughts from anyone?

Thank you for your time guys,

Mason

Link to comment
Share on other sites

  • Solution
The following would work.
 
Note that 
Child Windows can't have WS_EX_LAYERED till windows 7, ==> the problem in your first example
Note: windows 8 supports WS_EX_LAYERED with child windows.
 
Also WS_EX_TRANSPARENT doesn't allow a window to be transparent, it only allows click through, ie the underlying window would be receiving mouse input but an overlay of the given window would be shown.
 
You can set the transparency of WS_EX_LAYERED windows using functions(check example)
 
Example
#include-once
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <WinAPISys.au3>


HotKeySet("{END}", "Terminate")

$GUI = GUICreate("", 147, 145, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$pic = GUICtrlCreatePic("", 0,0,147, 145)

Local Const $STM_SETIMAGE = 0x0172

_GDIPlus_Startup()
$himg=_GDIPlus_ImageLoadFromFile("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif")
$hbmp=_GDIPlus_BitmapCreateHBITMAPFromBitmap($himg)
_GDIPlus_ImageDispose($himg)

_WinAPI_DeleteObject(GUICtrlSendMsg($pic,$STM_SETIMAGE,$IMAGE_BITMAP,$hbmp))

GUISetState()

Local Const $iTransparency = 50
GUISetBkColor(0xABCDEF) ;this background color should be same as the trans color used in above function
_WinAPI_SetLayeredWindowAttributes($GUI,0xABCDEF, $iTransparency)

;~ GUISetState(@SW_SHOW,$gui)

While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
    Case Else

    EndSelect
WEnd
Exit


Func Terminate()
    exit(0)
EndFunc

Regards :)

Phoenix XL

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

In your case GDIPlus isn't required. The following would also do the same.

#include-once
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <WinAPISys.au3>

HotKeySet("{END}", "Terminate")

$GUI = GUICreate("", 147, 145, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
$pic = GUICtrlCreatePic("c:\Program Files (x86)\AutoIt3\Examples\GUI\Merlin.gif", 0,0,147, 145)

GUISetState()

Local Const $iTransparency = 50
GUISetBkColor(0xABCDEF) ;this background color should be same as the trans color used in above function
_WinAPI_SetLayeredWindowAttributes($GUI,0xABCDEF, $iTransparency)

;~ GUISetState(@SW_SHOW,$gui)

While 1
    $msg = GuiGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
        ExitLoop
    Case Else

    EndSelect
WEnd
Exit


Func Terminate()
    exit(0)
EndFunc

Awesome, thank you very much! Why use the GDIPlus stuff as opposed to not?  What advantages does it have?

The precise comparison, can only be given by an expert. I'm still very amateur in it. :P

Regards :)

Phoenix XL

Edited by PhoenixXL

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

Link to comment
Share on other sites

Don't know exactly but,

The >UDF by trancexx will surely make you start

My code:

PredictText: Predict Text of an Edit Control Like Scite. Remote Gmail: Execute your Scripts through Gmail. StringRegExp:Share and learn RegExp.

Run As System: A command line wrapper around PSEXEC.exe to execute your apps scripts as System (LSA). Database: An easier approach for _SQ_LITE beginners.

MathsEx: A UDF for Fractions and LCM, GCF/HCF. FloatingText: An UDF for make your text floating. Clipboard Extendor: A clipboard monitoring tool. 

Custom ScrollBar: Scroll Bar made with GDI+, user can use bitmaps instead. RestrictEdit_SRE: Restrict text in an Edit Control through a Regular Expression.

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

×
×
  • Create New...