Sign in to follow this  
Followers 0
MasonMill

$WS_EX_TRANSPARENT not working with GUI no background

6 posts in this topic

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

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

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.

Share this post


Link to post
Share on other sites

os : w7 ,w8

How to make transparent background animated gif

Share this post


Link to post
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.

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  
Followers 0

  • Similar Content

    • IAMK
      By IAMK
      Hello,
       
      I have a script which uses a GUI with two buttons. It gets shown and hidden., and pressing the buttons (including their hotkeys) highlights the button, making you able to press enter the next time.
      However, I don't want that.
       
      I've tried using WinActivate() to make enter do things on another program, but the enter is still tied to the AutoIT GUI (which still has the button highlighted).
       
      Here's the important part of my code:
      $MY_GUI = GUICreate("Check.exe", 400, 300, ((@DesktopWidth / 2) - 200), -500) WinSetOnTop($MY_GUI, "", 1) ;Keeps the window on the top. $Button1 = GUICtrlCreateButton("Pass (Ctrl+P)", 40, 250, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif") $Button2 = GUICtrlCreateButton("Fail (Ctrl+F)", 240, 250, 120, 40, $WS_GROUP) GUICtrlSetFont(-1, 12, 400, 0, "MS Sans Serif") $GUIText = GUICtrlCreateLabel("", 20, 10, 360, 230) GUICtrlSetFont(-1, 13, 400, 0, "MS Sans Serif") GUICtrlSetData($GUIText, Execute($stepMessage[$step])) $showGUI = "True" GUISetState(@SW_SHOW) While($showGUI = "True") $buttonPressed = GUIGetMsg() Switch $buttonPressed Case $Button1 ;Pass $pass = "True" $buttonPressed = 0 $showGUI = "False" GUISetState(@SW_HIDE) Case $Button2 ;Fail $buttonPressed = 0 $showGUI = "False" GUISetState(@SW_HIDE) While($message = "") $message = InputBox("Check.exe", "Please enter the reason the step failed." & @CRLF, "", "", 300, 200, ((@DesktopWidth / 2) - 150), -400) WEnd Return $message EndSwitch WEnd Local $pass = "False" ;Whether "Pass" or "Fail" was pressed. Local $failLog = xxxfunc($pass) ;Returns a message to log if the step failed. ##THIS CALLS THE CODE SNIPPET ABOVE## FileWrite($file, _Now() & ": Step " & $step & getStatus($pass) & "and took " & Ceiling(TimerDiff($timer) / 1000) & " seconds." & @CRLF) If($failLog <> "") Then FileWrite($file, "Logged comment: " & $failLog & @CRLF) EndIf WinActivate("[TITLE:ProgramName]") ;Hotkeys: HotKeySet("^{p}", "pressPass") HotKeySet("^{f}", "pressFail") Func pressPass() $buttonPressed = $Button1 EndFunc Func pressFail() $buttonPressed = $Button2 EndFunc  
      The GUI's button/hotkey pressing works correctly.
      The same WinActivate code works in another script of mine.
      Together, WinActivate is not take "Active" away from the GUI's last-pressed button. How do I fix this?
       
      Thank you in advance.
    • fatpig
      By fatpig
      Dear AutoIT Community.
      I am currently working on a program that will display lots of images in a scroll down GUI.
      I create the GUI based on the number of images, which works fine.
      But all images I place using GuiCtrlCreatePic above a threshold of around 32000 pixels (cant say exactly) are placed at negative locations and finally will reach 0 again
      and will then populate on top of the images placed there before.
      For $i = 1 To $Images[0] ; Get picture dimensions $hImage = _GDIPlus_ImageLoadFromFile($ImgRep & $Images[$i]) $iX = _GDIPlus_ImageGetWidth($hImage) $iY = _GDIPlus_ImageGetHeight($hImage) _GDIPlus_ImageDispose($hImage) ; Resize & place images in GUI $Pic[$i] = GUICtrlCreatePic($ImgRep & $Images[$i], $Spacer, Round($yPos, 0), $MaxImgWidth, $MaxImgWidth * ($iY / $iX)) $yPos = $yPos + $MaxImgWidth * ($iY / $iX) + $Spacer $log = $log & "|" & $yPos $currentlut = $Images[1] Next I have found a limit at 32767 pixels for some GUI elements when googling around.
      Can someone tell me how to circumvent that?
      thanks!
      cheers
      Felix
    • Shirdish_chakravarthi
      By Shirdish_chakravarthi
      Hello Guys this is my gui and i need the numeric value typed in the highlighted  inputbox. if this value is greater than 1 i need to perform some operations
      \
       
      Here is the summary about that field which i got from wininfo tool

      i tried writing the code as shown below.. but the msgbox is popping up empty value..when the same code is pasted under some button action i am able to access the value present in the field..but when placed alone as written in the attached script i am unable to fetch it... 

      here i am using the valu present in the field

      can you guys tell me what's wrong??? or how can i get that value?
       
      My_GUI.au3

    • Neonovaz
      By Neonovaz
      Hello
       
      Is there anyway to store word documents in Autoit GUI? For example I have a instruction sheet that I want to bundle up with the exe.

      So a user simply clicks the icon and the stored document will launch  (Something like how you can add objects like excel sheets in word documents )

      (I Know we can launch word files from script directory)

       
    • hemichallenger
      By hemichallenger
      Not sure if this is possible or if someone has already tackled this. Is it possible to embed PowerShell into a GUI? Autoit is great for quick function but sometime I need to run a command thru PowerShell. It be great to have PowerShell console embedded into the gui.