cookiemonster

Loading window not closing and not staying on top of main window

5 posts in this topic

Hi,

I have a main window with one button, when i press that button it brings up a loading screen, but I have two problems with the loading screen at the moment:

1) Once I have pressed the button, if i open something else full screen over this autoit project (eg: chrome), then on my task bar click on the autoit project to bring it up to the front, the loading screen does not stay on top of the main window, I tried using $WS_EX_TOPMOST but this makes the loading screen stay on top of all windows, I only want it to stay on top of $Main (my main window GUI)

2) Once the loading screen has been updated to 100%, it should sleep for a further two seconds then close, but at the moment after that 2 seconds, it goes back down to 25% instead of $LoadingWindow being deleted.

Has anyone got any thoughts or suggestions?

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <FontConstants.au3>

$Main = GUICreate("Main Window", 600, 480, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $button_Load = GUICtrlCreateButton("Loading Screen", 484, 98, 89, 20, $WS_GROUP)
GUICtrlCreateTab(8, 16, 585, 424)
GUICtrlCreateTabItem("Settings")
GUICtrlCreateGroup("Settings", 16, 50, 569, 380)

GUISetState(@SW_SHOWNORMAL)

Func Load()
    WinSetState($Main, "", @SW_DISABLE)

    LoadingScreen("Loading @ 25%")
    GUICtrlSetData($LoadingPercent, 25)
    
    sleep(2000)
    
    LoadingScreen("Loading @ 100%")
    GUICtrlSetData($LoadingPercent, 100)
    
    sleep(2000)
    
    GUIDelete($LoadingWindow)
    WinSetState($Main, "", @SW_ENABLE)
    
EndFunc

Func LoadingScreen($LoadingText) ;Creates a Splash Text Screen with a progress bar.
    Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW))
    Global $LoadingPercent = GUICtrlCreateProgress(18, 144, 461, 25, $PBS_SMOOTH)
    GUICtrlCreateLabel($LoadingText, 2, 44, 494, 88, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 800, 0, "Calibra", $CLEARTYPE_QUALITY)
    GUISetState(@SW_SHOW)
EndFunc 

While (1)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button_Load
            Load()
    EndSwitch
WEnd

 

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

First Problem Fix;

Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW),$Main)

Second Problem;

Is because your generating two loading screen GUIS and only deleting one.

Code with both problems fixed.

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <FontConstants.au3>

Global $LoadingWindow
$Main = GUICreate("Main Window", 600, 480, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $button_Load = GUICtrlCreateButton("Loading Screen", 484, 98, 89, 20, $WS_GROUP)
GUICtrlCreateTab(8, 16, 585, 424)
GUICtrlCreateTabItem("Settings")
GUICtrlCreateGroup("Settings", 16, 50, 569, 380)

GUISetState(@SW_SHOWNORMAL)

Func Load()
    $GUI = LoadingScreen("Loading @ 25%")
    GUICtrlSetData($LoadingPercent, 25)

    sleep(1000)

    GUICtrlSetData($LoadingLabelText, "Loading @ 100%")
    GUICtrlSetData($LoadingPercent, 100)

    sleep(1000)

   GUIDelete($LoadingWindow)
EndFunc

Func LoadingScreen($LoadingText) ;Creates a Splash Text Screen with a progress bar.

    Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW),$Main)
    Global $LoadingPercent = GUICtrlCreateProgress(18, 144, 461, 25, $PBS_SMOOTH)
    Global $LoadingLabelText = GUICtrlCreateLabel($LoadingText, 2, 44, 494, 88, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 800, 0, "Calibra", $CLEARTYPE_QUALITY)
    GUISetState(@SW_SHOW)

EndFunc

While (1)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button_Load
            Load()
    EndSwitch
WEnd

 

Edited by IanN1990

Share this post


Link to post
Share on other sites
41 minutes ago, cookiemonster said:

Hi,

I have a main window with one button, when i press that button it brings up a loading screen, but I have two problems with the loading screen at the moment:

1) Once I have pressed the button, if i open something else full screen over this autoit project (eg: chrome), then on my task bar click on the autoit project to bring it up to the front, the loading screen does not stay on top of the main window, I tried using $WS_EX_TOPMOST but this makes the loading screen stay on top of all windows, I only want it to stay on top of $Main (my main window GUI)

2) Once the loading screen has been updated to 100%, it should sleep for a further two seconds then close, but at the moment after that 2 seconds, it goes back down to 25% instead of $LoadingWindow being deleted.

Has anyone got any thoughts or suggestions?

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <FontConstants.au3>

$Main = GUICreate("Main Window", 600, 480, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $button_Load = GUICtrlCreateButton("Loading Screen", 484, 98, 89, 20, $WS_GROUP)
GUICtrlCreateTab(8, 16, 585, 424)
GUICtrlCreateTabItem("Settings")
GUICtrlCreateGroup("Settings", 16, 50, 569, 380)

GUISetState(@SW_SHOWNORMAL)

Func Load()
    WinSetState($Main, "", @SW_DISABLE)

    LoadingScreen("Loading @ 25%")
    GUICtrlSetData($LoadingPercent, 25)
    
    sleep(2000)
    
    LoadingScreen("Loading @ 100%")
    GUICtrlSetData($LoadingPercent, 100)
    
    sleep(2000)
    
    GUIDelete($LoadingWindow)
    WinSetState($Main, "", @SW_ENABLE)
    
EndFunc

Func LoadingScreen($LoadingText) ;Creates a Splash Text Screen with a progress bar.
    Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW))
    Global $LoadingPercent = GUICtrlCreateProgress(18, 144, 461, 25, $PBS_SMOOTH)
    GUICtrlCreateLabel($LoadingText, 2, 44, 494, 88, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 800, 0, "Calibra", $CLEARTYPE_QUALITY)
    GUISetState(@SW_SHOW)
EndFunc 

While (1)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button_Load
            Load()
    EndSwitch
WEnd

 

Thats great thanks, can see where I went wrong with both bits now, thanks!

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I forgot your disabled / enabled bit. Here is with it added in and a small loop for the percentage. Good luck on your project.

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <FontConstants.au3>

Global $LoadingWindow
$Main = GUICreate("Main Window", 600, 480, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $button_Load = GUICtrlCreateButton("Loading Screen", 484, 98, 89, 20, $WS_GROUP)
GUICtrlCreateTab(8, 16, 585, 424)
GUICtrlCreateTabItem("Settings")
GUICtrlCreateGroup("Settings", 16, 50, 569, 380)

GUISetState(@SW_SHOWNORMAL)

Func Load()
   GUISetState(@sw_Disable, $Main)

   $GUI = LoadingScreen("Loading @ 0%")
   sleep(250)

   For $I = 25 to 100 step 25
      GUICtrlSetData($LoadingLabelText, "Loading @ " & $I & "%")
      GUICtrlSetData($LoadingPercent, $I)
      sleep(1000)
   Next

   GUISetState(@SW_ENABLE, $Main)
   GUIDelete($LoadingWindow)
EndFunc

Func LoadingScreen($LoadingText) ;Creates a Splash Text Screen with a progress bar.

    Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW),$Main)
    Global $LoadingPercent = GUICtrlCreateProgress(18, 144, 461, 25, $PBS_SMOOTH)
    Global $LoadingLabelText = GUICtrlCreateLabel($LoadingText, 2, 44, 494, 88, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 800, 0, "Calibra", $CLEARTYPE_QUALITY)
    GUISetState(@SW_SHOW)

EndFunc

While (1)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button_Load
            Load()
    EndSwitch
WEnd

 

Edited by IanN1990

Share this post


Link to post
Share on other sites
12 minutes ago, IanN1990 said:

I forgot your disabled / enabled bit. Here is with it added in and a small loop for the percentage. Good luck on your project.

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <FontConstants.au3>

Global $LoadingWindow
$Main = GUICreate("Main Window", 600, 480, -1, -1, -1, $WS_EX_ACCEPTFILES)
Global $button_Load = GUICtrlCreateButton("Loading Screen", 484, 98, 89, 20, $WS_GROUP)
GUICtrlCreateTab(8, 16, 585, 424)
GUICtrlCreateTabItem("Settings")
GUICtrlCreateGroup("Settings", 16, 50, 569, 380)

GUISetState(@SW_SHOWNORMAL)

Func Load()
   GUISetState(@sw_Disable, $Main)

   $GUI = LoadingScreen("Loading @ 0%")
   sleep(250)

   For $I = 25 to 100 step 25
      GUICtrlSetData($LoadingLabelText, "Loading @ " & $I & "%")
      GUICtrlSetData($LoadingPercent, $I)
      sleep(1000)
   Next

   GUISetState(@SW_ENABLE, $Main)
   GUIDelete($LoadingWindow)
EndFunc

Func LoadingScreen($LoadingText) ;Creates a Splash Text Screen with a progress bar.

    Global $LoadingWindow = GUICreate("", 500, 184, -1, -1, BitOR($WS_POPUP, $WS_BORDER), BitOR($WS_EX_WINDOWEDGE, $WS_EX_TOOLWINDOW),$Main)
    Global $LoadingPercent = GUICtrlCreateProgress(18, 144, 461, 25, $PBS_SMOOTH)
    Global $LoadingLabelText = GUICtrlCreateLabel($LoadingText, 2, 44, 494, 88, $SS_CENTER)
    GUICtrlSetFont(-1, 15, 800, 0, "Calibra", $CLEARTYPE_QUALITY)
    GUISetState(@SW_SHOW)

EndFunc

While (1)
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $button_Load
            Load()
    EndSwitch
WEnd

 

I added that bit back in :)

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

  • Similar Content

    • 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.
    • 0Ethan0
      By 0Ethan0
      Ahoy Autoit Community!
      After many trials and errors I am unable to solve a problem I am facing and would appreciate any kind of input or better yet a solution 
      The Premise: An embeded slideshow viewer that runs after double-clicking an item in a ListView (each item will generate a different slideshow images).
      The Setup: GUI with a ListView Control and a simple exit button.
      The Issue: Once double clicked the slide plays however the GUI "locks"/non responsive until the slide is over. Same thing if I click on the "Test" button.
      The Culprit: I believe since it's in the images loop it can't accept any other commands until that loop is over.
      The Wish: I want to be able to use the GUI functions (selecting other items, clicking on button etc.) while the slideshow plays.
      The Code (stripped and simplified as much as I could):
      #include <GuiListView.au3> #include <File.au3> #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> Opt("GUIOnEventMode", 1) HotKeySet("{Esc}", "_Exit") Global $c=0 Global $ssGDI[3], $ssGraphic[2], $ssImage Global Const $bg_color = "000000" Global Const $ssW = 480, $ssH = 320 Global $aFiles = _FileListToArrayRec("d:\testStage\", "*.jpg;*.png;*.bmp;*.gif;*.JPG;*.PNG;*.BMP;*.GIF", $FLTAR_FILES, $FLTAR_NORECUR ,$FLTAR_SORT ,$FLTAR_FULLPATH ) $guiW = 1200 $guiH = 726 $mainWindow = GUICreate("Slideshow Viewer", $guiW, $guiH, -1, -1, $WS_POPUP) $Button1 = GUICtrlCreateButton("Exit", 0, 0, 50, 50) GUICtrlSetOnEvent($Button1, "_Exit") $Button1 = GUICtrlCreateButton("Test", 60, 0, 50, 50) GUICtrlSetOnEvent($Button1, "Test") Global $ListView = GUICtrlCreateListView("Entry Name|Category", 5, 75, 195, 280) _GUICtrlListView_SetColumnWidth ($ListView, 0, 100) _GUICtrlListView_SetColumnWidth ($ListView, 1, 100) GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES) GUICtrlSendMsg($ListView, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_FULLROWSELECT, $LVS_EX_FULLROWSELECT) GUICtrlCreateListViewItem("Name 1|Category 1", $ListView) GUICtrlCreateListViewItem("Name 2|Category 2", $ListView) screenshotWidgetInit($ssW,$ssH, 690, 100) GUISetState(@SW_SHOW, $mainWindow) GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE _Exit() EndSwitch WEnd Func Test() For $k = 1 To UBound($aFiles) - 1 screenshotWidgetTransition($aFiles[$k]) Next EndFunc Func ListView_Click() ConsoleWrite("Left Click") EndFunc Func ListView_DoubleClick() ConsoleWrite("Double Left Click") Test() EndFunc Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam) #forceref $hWndGUI, $MsgID, $wParam Local $tagNMHDR, $event, $hwndFrom, $code $tagNMHDR = DllStructCreate("int;int;int", $lParam) If @error Then Return $event = DllStructGetData($tagNMHDR, 3) Select Case $wParam = $ListView Select Case $event = $NM_CLICK ListView_Click () Case $event = $NM_DBLCLK ListView_DoubleClick () EndSelect EndSelect Return $GUI_RUNDEFMSG EndFunc Func screenshotWidgetTransition($image, $delay = 0, $speed = 1, $sleep = 2000) Local $a, $d = $c, $iX, $iY $ssImage = _GDIPlus_ImageLoadFromFile($image) $iX = _GDIPlus_ImageGetWidth($ssImage) $iY = _GDIPlus_ImageGetHeight($ssImage) $FDesktop=$ssH/$ssW $Fact =1 If $iX > $ssW And $FDesktop > ($iY/$iX) Then $Fact=$ssW/$iX ElseIf $iY > $ssH Then $Fact=$ssH/$iY EndIf $H1 = Round(($Fact * $iY),0) $W1 = Round(($Fact * $iX),0) _GDIPlus_GraphicsDrawImageRect($ssGraphic[$d], $ssImage,($ssW - $W1)/2, ($ssH - $H1) / 2,$W1,$H1) WinSetTrans($ssGDI[$d], "", 0) WinSetOnTop($ssGDI[$d], "", 1) For $a = 0 To 254 Step $speed WinSetTrans($ssGDI[$d], "", $a) Sleep($delay) Next WinSetTrans($ssGDI[$d], "", 254) WinSetOnTop($ssGDI[Not ($d)], "", 0) WinSetTrans($ssGDI[Not ($d)], "", 0) _GDIPlus_GraphicsClear($ssGraphic[Not ($d)]) $c = 1 - $d _GDIPlus_ImageDispose ($ssImage) ; very important to realease the pics Sleep($sleep) EndFunc ;==>screenshotWidgetTransition Func screenshotWidgetInit($ssW,$ssH,$ssX,$ssY) $ssGDI[2] = GUICreate("", $ssW, $ssH, $ssX, $ssY, $WS_POPUP, $WS_EX_MDICHILD, $mainWindow) $ssGDI[0] = GUICreate("", $ssW, $ssH, 3, 3, $WS_POPUP, $WS_EX_MDICHILD, $ssGDI[2]) $ssGDI[1] = GUICreate("", $ssW, $ssH, 3, 3, $WS_POPUP, $WS_EX_MDICHILD, $ssGDI[2]) ; GUISetBkColor("0x" & $bg_color, $ssGDI[2]) GUISetState(@SW_SHOW, $ssGDI[2]) GUISetState(@SW_SHOW, $ssGDI[0]) GUISetState(@SW_SHOW, $ssGDI[1]) WinSetTrans($ssGDI[0], "", 0) WinSetTrans($ssGDI[1], "", 0) _GDIPlus_Startup() $ssGraphic[0] = _GDIPlus_GraphicsCreateFromHWND($ssGDI[0]) $ssGraphic[1] = _GDIPlus_GraphicsCreateFromHWND($ssGDI[1]) _GDIPlus_GraphicsClear($ssGraphic[0], "0xFF" & $bg_color) _GDIPlus_GraphicsClear($ssGraphic[1], "0xFF" & $bg_color) EndFunc ;==>screenshotWidgetInit Func _Exit() _GDIPlus_ImageDispose($ssImage) _GDIPlus_GraphicsDispose($ssGraphic[0]) _GDIPlus_GraphicsDispose($ssGraphic[1]) GUIDelete($ssGDI[0]) GUIDelete($ssGDI[1]) GUIDelete($ssGDI[2]) _GDIPlus_Shutdown() Exit EndFunc ;==>_Exit I hope someone can shed light on this; perhaps a different approach is needed?
      Thank you in advance!
      P.S.
      The script is patched from different scripts of different users in the forum - thank you again users!