Что нового

Запуск поиска по нажатию кнопки и ПрогрессБар поиска

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Пробую прикрутить ПрогрессБар к поиску файла после нажатия на кнопку, но ПрогрессБар висит поверх окна после завершения поиска, пока окно не свернешь. Вариант ПрогрессБара подсмотрел тут. Делаю так:
Код:
#include <Array.au3>
#include <Standart_Func.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>

#include <WindowsConstants.au3>
#include <ProgressConstants.au3>

Global $hGUI = GUICreate("Окно поиска", 200, 200)
Global $ProgressBar
Local $Button_1


GUISetState(@SW_SHOW, $hGUI)

$Button_1 = GUICtrlCreateButton("Найти файл", 20, 50, 150, 100)
While 1
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $Button_1
          PoiskStat()
    EndSwitch
 WEnd

Func PoiskStat()
Local $iSleep = 20, $iWidth = 250, $iHeight = 25
Local $hGUI = GUICreate('', $iWidth, $iHeight, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
$ProgressBar = GUICtrlCreateProgress(0, 0, $iWidth, $iHeight, $PBS_MARQUEE)
GUISetState()
GUIRegisterMsg($WM_TIMER, "PlayProgressBar")
DllCall("user32.dll", "int", "SetTimer", "hwnd", $hGUI, "int", 0, "int", $iSleep, "int", 0)

Local $PathIni = @ScriptDir & "\Settings.ini"
ConsoleWrite($PathIni & @CR)

Local $aIni = IniReadSection($PathIni, "SektionMayBePathStat103")

Local $a = False
For $a=False To True
   If $a = False Then
   For $i = 1 To UBound($aIni)-1
      If FileExists(Execute($aIni[$i][1])) Then
         ConsoleWrite("существует такой путь : " & $aIni[$i][1] & @CR)
            $a = True
            ShellExecute(Execute($aIni[$i][1]))
            ExitLoop
      Else
         ConsoleWrite("Не существует такой путь : " & $aIni[$i][1] & @CR)
        ; ShellExecute(@DesktopCommonDir & "\Программа.lnk")
      EndIf

   Next
   Else
         Local $path_0 = "C:"
      Local $Mask_0 =  "Программа.exe"
      Local $aReturn = _FileSearch($path_0, $Mask_0)
      ;_ArrayDisplay($aReturn)
      ;ShellExecute($aReturn[1])
      ConsoleWrite("поиск проги и полученный путь : " & $aReturn[1] & @CR)
      Local $KeyIni = "MayBePathStat" & UBound($aIni)
      Local $IndexIni = '"' & $aReturn[1] & '"'
      IniWrite($PathIni, "SektionMayBePathStat", $KeyIni, $IndexIni)
      ShellExecute($IndexIni)
   EndIf
Next

GUIRegisterMsg($WM_TIMER, '')

EndFunc

Func PlayProgressBar()
    GUICtrlSetData($ProgressBar, 0)
EndFunc   ;==>PlayProgressBar

Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0"& @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "'& $sPath &'\'& $sFileMask &'" /S/B/A-D', @SystemDir, @SW_HIDE, 6)
    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    Wend

    $aOut = StringRegExp(BinaryToString($sOut,2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut)-1
    Global $IsOrNowFile = $aOut[0]
    Return $aOut
 EndFunc
Надеюсь после разбора этого примера смогу разобраться с примерами на этой странице. Если нет, то тут же и продолжу.
 

All2khoff

Продвинутый
Сообщения
343
Репутация
65
не по теме вопроса.
Код:
For $a=False To True

интересный подход)
посмотри в сторону
Код:
do
until

По теме вопроса.
окно создано, но не удалено.
Код:
GUIDelete($ProgressBar)


и совет пиши комменты, чем чаще тем лучше, через полгода будешь сам себя по голове гладить)
 
Последнее редактирование:
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
посмотри в сторону
Ну да, что-то забыл про такую конструкцию.
Спасибо. Получилось чуток подправив:
Код:
GUIDelete()

и совет пиши комменты, чем чаще тем лучше, через полгода будешь сам себя по голове гладить)
Да я обычно стараюсь писать. У себя в коде вообще много комментов. А в этот раз для форума вообще почти все вычистил.

Буду разбирать примеры из файла с красивыми ПрогрессБарами )
 

All2khoff

Продвинутый
Сообщения
343
Репутация
65
Комментарии не только для тебя, а для тех кто учится вместе с тобой) человек например зашел на форум увидел твой код, почитал комментарии и примерно понял что где и каким образом делается.
Я учусь примерно таким образом, изучая чужой код, по мере сил пытаюсь помочь, попутно обучаясь.
Не всегда у меня есть задача которую я хотел бы решить, потому и зависаю на форуме практически непрерывно.
 
  • Like
Реакции: xXx
Автор
D

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Комментарии не только для тебя, а для тех кто учится вместе с тобой) человек например зашел на форум увидел твой код, почитал комментарии и примерно понял что где и каким образом делается.
Так я о чем и говорю. Обычно пишу много комментов, а тут почему-то подчистил.

Но у меня другая непонятка. Пробую разобраться с ПрогрессБарами по ссылке , в частности с вариантом _GDIPlus_GearsAnim.au3.
Судя по этой строке
Код:
#include-once

файл можно подключать к своему. Но никак не могу понять как это сделать.
Если прописываю у себя
Код:
#include <_GDIPlus_GearsAnim.au3>
то естественно при запуске моего скрипта сразу запускается прогрессбар, даже моё окошко не стартует. Это я как бы понимаю и в принципе сразу не пробовал такой вариант. А попробовал закомментировать в самом файле _GDIPlus_GearsAnim.au3 некоторые функции и подвязать их вызов к нажатию кнопки. Но пока ни один вариант не сработал. Скрипт висит.
Код:
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>

#include <WindowsConstants.au3>
#include <_GDIPlus_GearsAnim.au3>

Global $hGUI = GUICreate("Окно поиска", 200, 200)
Local $Button_1


GUISetState(@SW_SHOW, $hGUI)

$Button_1 = GUICtrlCreateButton("Найти файл", 20, 50, 150, 100)
While 1
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $Button_1
         ConsoleWrite("Poisk1" & @CR)
; Ниже несколько функций, которые я в первую очередь пробовал закомментировать в файле _GDIPlus_GearsAnim.au3, а потом вызвать тут
        ; _GDIPlus_Startup()
        ; GUICtrlSetState(-1, $GUI_DISABLE)
        ; GUISetState()
        ; GUIRegisterMsg($WM_TIMER, "PlayAnim")
         Sleep(3000)
         ConsoleWrite("Poisk2" & @CR)
              Exit
    EndSwitch
 WEnd

Хотелось бы настроить таким образом, чтобы между записями Poisk1 и Poisk2 запускался прогрессбар из файла _GDIPlus_GearsAnim.au3. Или пока пишет и спит, запускается прогрессбар
Сообщение автоматически объединено:

Так, благодаря подсказке автора, слегка изменив его вариант получил скрипт из двух файлов. Нужно использовать таймер:
Окно поиска (прогрессбар пока прикручен только к первой кнопке, на другие можно прикрутить другой):
Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <WindowsConstants.au3>

#include <GDIPlus.au3>
#include <Timers.au3>
#include <WinAPIHObj.au3>
#include <_GDIPlus_GearsAnimFunc.au3> ; подключаем красивый прогрессбар из коллекции, слегка переделанный

Global $hGUI = GUICreate("Search box", 300, 300)
Local $Button_1, $Button_2, $Button_3

GUISetState(@SW_SHOW, $hGUI)

$Button_1 = GUICtrlCreateButton("Find file №1", 20, 20, 100, 100)
$Button_2 = GUICtrlCreateButton("Find file №2", 20, 140, 100, 100)
$Button_3 = GUICtrlCreateButton("Copy file", 140, 20, 100, 100)
While 1
    Switch GUIGetMsg()
      Case $GUI_EVENT_CLOSE
         ExitLoop
      Case $Button_1
         $sPath1 = "D:"
         $sFileMask1 = "Test1.txt"
         LoadingScreen($sPath1, $sFileMask1) ; Запускаем функцию из присоединенного файла с красивым прогрессбаром
      Case $Button_2
         $sPath2 = "H:"
         $sFileMask2 = "Test2.txt"
         $aReturn = _FileSearch($sPath2, $sFileMask2)
         $File2 = $aReturn[1]
         ConsoleWrite($File2 & @CR)
         ShellExecute($File2)
      Case $Button_3
         $sPath2 = "H:"
         FileCopy($File1, $sPath2)
Write()
    EndSwitch
 WEnd

 Func _FileSearch($sPath, $sFileMask)
    Local $sOut = StringToBinary("0"& @CRLF, 2), $aOut
    Local $hDir = Run(@ComSpec & ' /U/C DIR "'& $sPath &'\'& $sFileMask &'" /S/B/A-D', @SystemDir, @SW_HIDE, 6)
    While 1
        $sOut &= StdoutRead($hDir, False, True)
        If @error Then ExitLoop
    Wend

    $aOut = StringRegExp(BinaryToString($sOut,2), "[^\r\n]+", 3)
    If @error Then Return SetError(1)

    $aOut[0] = UBound($aOut)-1
    Global $IsOrNowFile = $aOut[0]
    Return $aOut
 EndFunc
И файл с прогрессбаром:
Код:
#include-once

_GDIPlus_Startup()

Global $hHBmp_BG, $hB, $iSleep, $File1
Global Const $STM_SETIMAGE = 0x0172; $IMAGE_BITMAP = 0
Global $hGUI_Anim, $iW, $iH, $hPic, $fFontSize = 18, $aData

Func LoadingScreen($sPath1, $sFileMask1)
ConsoleWrite("проба запуска прогрессбара" & @CR)
            $iW = 500
            $iH = 250
            $iSleep = 40
            $hGUI_Anim = GUICreate("Gears Animation", $iW, $iH, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
            Global $iPic = GUICtrlCreatePic("", 0, 0, $iW, $iH)
            GUICtrlSetState(-1, $GUI_DISABLE)
            GUISetState(@SW_SHOWNA, $hGUI_Anim)
            _Timer_SetTimer($hGUI_Anim, $iSleep, "PlayAnim_Gears")
                      $aReturn = _FileSearch($sPath1, $sFileMask1)
      If $aReturn[0] <> 0 Then
         ConsoleWrite("поиск файла и полученный путь : " & $aReturn[1] & @CR)
          $File1 = $aReturn[1]
          ConsoleWrite($File1 & @CR)
          ShellExecute($aReturn[1])
            _Timer_KillAllTimers($hGUI_Anim)
            _WinAPI_DeleteObject($hHBmp_BG)
            GUIDelete($hGUI_Anim)
      Else
         ConsoleWrite("нет такого файла" & @CR)
            _Timer_KillAllTimers($hGUI_Anim)
            _WinAPI_DeleteObject($hHBmp_BG)
            GUIDelete($hGUI_Anim)
;         ExitLoop  ; Только не понятно, почему тут не срабатывает выход из поиска.
      EndIf

EndFunc

Func PlayAnim_Gears($hWnd, $iMsg, $iIDTimer, $iTime)
    #forceref $hWnd, $iMsg, $iIDTimer, $iTime
    $hHBmp_BG = GearsAnim($iW, $iH)
    $hB = GUICtrlSendMsg($iPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBmp_BG)
    If $hB Then _WinAPI_DeleteObject($hB)
    _WinAPI_DeleteObject($hHBmp_BG)
EndFunc   ;==>PlayAnim

Func GearsAnim($iW, $iH, $sText = "Ищем файл...", $fSpeed = 2, $bBgGradient = True, $bHBitmap = True)
    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, $GDIP_SMOOTHINGMODE_ANTIALIAS8X4 + (@OSBuild > 5999))
    _GDIPlus_GraphicsSetTextRenderingHint($hGfx, $GDIP_TEXTRENDERINGHINT_ANTIALIAS)
    _GDIPlus_GraphicsSetPixelOffsetMode($hGfx, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    If $bBgGradient Then
        Local Const $hBrush_Bg = _GDIPlus_LineBrushCreate(0, 0, $iW / 2, $iH / 2, 0xFF080808, 0xFF606060, 1)
        _GDIPlus_GraphicsFillRect($hGfx, 0, 0, $iW, $iH, $hBrush_Bg)
    EndIf

    Local Const $iW2 = $iW / 2, $iH2 = $iH / 2
    Local Const $hBrush = _GDIPlus_BrushCreateSolid(0)
    Local Static $f1 = 0, $f2 = 0, $f3 = 0, $f4 = 0, $c = 0, $iTeeth = 12
    Local $aGears[4], $i, $iW_Gear = 220, $iH_Gear = 150, $iW2_Gear = $iW_Gear / 2, $iH2_Gear = $iH_Gear / 2
    Local Const $hBitmap_Gear = _GDIPlus_BitmapCreateFromScan0($iW_Gear, $iH_Gear)
    Local Const $hCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Gear)
    _GDIPlus_GraphicsSetSmoothingMode($hCtxt, $GDIP_SMOOTHINGMODE_ANTIALIAS8X4 + (@OSBuild > 5999))
    _GDIPlus_GraphicsSetPixelOffsetMode($hCtxt, $GDIP_PIXELOFFSETMODE_HIGHQUALITY)
    _GDIPlus_GraphicsClear($hCtxt, 0xFF121212)

    $aGears[0] = _GDIPlus_BitmapCreateGear($f1, $iTeeth / 2)
    _GDIPlus_GraphicsDrawImage($hCtxt, $aGears[0], 0, 1)
    $aGears[1] = _GDIPlus_BitmapCreateGear($f2, $iTeeth / 2)
    _GDIPlus_GraphicsDrawImage($hCtxt, $aGears[1], 51, 51)
    $aGears[2] = _GDIPlus_BitmapCreateGear($f3, $iTeeth / 2)
    _GDIPlus_GraphicsDrawImage($hCtxt, $aGears[2], 0, 101)
    $aGears[3] = _GDIPlus_BitmapCreateGear($f4, $iTeeth, 60, 48)
    _GDIPlus_GraphicsDrawImage($hCtxt, $aGears[3], 120, 4)

    _GDIPlus_GraphicsDrawImageRect($hGfx, $hBitmap_Gear, $iW2 - $iW2_Gear, $iH2 - $iH2_Gear, $iW_Gear, $iH_Gear)

    $f1 -= $fSpeed
    $f2 += $fSpeed
    $f3 -= $fSpeed
    $f4 -= $fSpeed / 2

    Local $iC = Hex(Int(0x80 - Sin($c) * 0x7F), 2)
    $c += 0.025

    Local $hPath = _GDIPlus_PathCreate()

    If $sText Then
        _GDIPlus_BrushSetSolidColor($hBrush, "0x9F" & $iC & $iC & $iC)
        Local Const $hFamily = _GDIPlus_FontFamilyCreate("Arial Black"), $hFormat = _GDIPlus_StringFormatCreate()
        _GDIPlus_StringFormatSetAlign($hFormat, 1)
;~      _GDIPlus_StringFormatSetLineAlign($hFormat, 1)
        Local $tLayout = _GDIPlus_RectFCreate(0, 0, $iW, $iH)
        $tLayout.Y = $iH2 + $iH2_Gear + 4
        _GDIPlus_PathAddString($hPath, $sText, $tLayout, $hFamily, 0, $iH / 10, $hFormat)
        _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)
        _GDIPlus_PathReset($hPath)
    EndIf

    Local Const $iPenSize = 2

    Local $tRect = DllStructCreate("float X; float Y; float W; float H;")
    $tRect.W = $iW_Gear * 1.5
    $tRect.H = $iH_Gear
    Local $hBrush_outline = _GDIPlus_LineBrushCreateFromRectWithAngle($tRect, 0xFF202020, 0xFFA0A0A0, -210, True, 1)
    _GDIPlus_LineBrushSetSigmaBlend($hBrush_outline, 0, 1)

    Local Const $hPen = _GDIPlus_PenCreate2($hBrush_outline, $iPenSize)
    $iW2_Gear += $iPenSize / 2
    $iH2_Gear += $iPenSize / 2
    Local $aPoints[9][2] = [[8]], $iCorner = 5
    $aPoints[1][0] = $iW2 - $iW2_Gear + $iCorner
    $aPoints[1][1] = $iH2 - $iH2_Gear
    $aPoints[2][0] = $iW2 + $iW2_Gear - $iCorner
    $aPoints[2][1] = $iH2 - $iH2_Gear
    $aPoints[3][0] = $iW2 + $iW2_Gear
    $aPoints[3][1] = $iH2 - $iH2_Gear + $iCorner
    $aPoints[4][0] = $iW2 + $iW2_Gear
    $aPoints[4][1] = $iH2 + $iH2_Gear - $iCorner
    $aPoints[5][0] = $iW2 + $iW2_Gear - $iCorner
    $aPoints[5][1] = $iH2 + $iH2_Gear
    $aPoints[6][0] = $iW2 - $iW2_Gear + $iCorner
    $aPoints[6][1] = $iH2 + $iH2_Gear
    $aPoints[7][0] = $iW2 - $iW2_Gear
    $aPoints[7][1] = $iH2 + $iH2_Gear - $iCorner
    $aPoints[8][0] = $iW2 - $iW2_Gear
    $aPoints[8][1] = $iH2 - $iH2_Gear + $iCorner

    _GDIPlus_PathAddClosedCurve2($hPath, $aPoints, 0.025)
    _GDIPlus_GraphicsDrawPath($hGfx, $hPath, $hPen)

    _GDIPlus_PenDispose($hPen)
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_BrushDispose($hBrush)
    If $bBgGradient Then _GDIPlus_BrushDispose($hBrush_Bg)
    _GDIPlus_BrushDispose($hBrush_outline)
    If $sText Then
        _GDIPlus_FontFamilyDispose($hFamily)
        _GDIPlus_StringFormatDispose($hFormat)
    EndIf
    For $i = 0 To 3
        _GDIPlus_BitmapDispose($aGears[$i])
    Next
    _GDIPlus_GraphicsDispose($hCtxt)
    _GDIPlus_BitmapDispose($hBitmap_Gear)
    _GDIPlus_GraphicsDispose($hGfx)

    If $bHBitmap Then
        Local $hHBITMAP = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBITMAP
    EndIf
    Return $hBitmap
EndFunc   ;==>GearsAnim

Func _GDIPlus_BitmapCreateGear($fAngle = 0, $iTeeth = 6, $fRadius_outer = 30, $fRadius_inner = 18, $fTeethHeight = 10.5, $iColor1 = 0xFF606060, $iColor2 = 0xFF404040)
    Local Const $iW = 2 * $fRadius_outer + $fTeethHeight * 2, $iH = $iW, $iW2 = $iW / 2, $iH2 = $iW2, $fDeltaAngle = 360 / $iTeeth, $fDeg = 3.14159265358979 / 180
    Local Const $hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
    Local Const $hGfx = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsSetSmoothingMode($hGfx, $GDIP_SMOOTHINGMODE_ANTIALIAS8X4 + (@OSBuild > 5999))

    Local $tRect = DllStructCreate("float X; float Y; float W; float H;")
    $tRect.W = $iW
    $tRect.H = $iH / 2
    Local $hBrush_outline = _GDIPlus_LineBrushCreateFromRectWithAngle($tRect, 0x44000000 + BitAND(0x00FFFFFF, $iColor2), 0, -90, True, 1)
    _GDIPlus_LineBrushSetSigmaBlend($hBrush_outline, 1, 0.95)
    _GDIPlus_LineBrushSetColors($hBrush_outline, 0, 0xAA989898)

    Local Const $hPen = _GDIPlus_PenCreate2($hBrush_outline, 2)
    Local Const $hBrush = _GDIPlus_BrushCreateSolid($iColor1)
    Local Const $hPath = _GDIPlus_PathCreate()
    _GDIPlus_PathAddEllipse($hPath, $iW2 - $fRadius_outer, $iH2 - $fRadius_outer, $fRadius_outer * 2, $fRadius_outer * 2)
    Local $aPoints[5][2] = [[4]], $iX, $iY, $i, $j
    For $i = 1 To $iTeeth
        $iX = $iW2 + Cos(($fAngle + 0) * $fDeg) * $fRadius_outer
        $iY = $iH2 + Sin(($fAngle + 0) * $fDeg) * $fRadius_outer
        For $j = 0 To $aPoints[0][0]
            $aPoints[1][0] = $iX + Cos(($fAngle + 45) * $fDeg) * $fTeethHeight
            $aPoints[1][1] = $iY + Sin(($fAngle + 45) * $fDeg) * $fTeethHeight
            $aPoints[2][0] = $iX + Cos(($fAngle + 135) * $fDeg) * $fTeethHeight
            $aPoints[2][1] = $iY + Sin(($fAngle + 135) * $fDeg) * $fTeethHeight
            $aPoints[3][0] = $iX + Cos(($fAngle + 225) * $fDeg) * $fTeethHeight
            $aPoints[3][1] = $iY + Sin(($fAngle + 225) * $fDeg) * $fTeethHeight
            $aPoints[4][0] = $iX + Cos(($fAngle + 315) * $fDeg) * $fTeethHeight
            $aPoints[4][1] = $iY + Sin(($fAngle + 315) * $fDeg) * $fTeethHeight
        Next
        _GDIPlus_PathAddPolygon($hPath, $aPoints)
        $fAngle += $fDeltaAngle
    Next
    _GDIPlus_PathWindingModeOutline($hPath)
    _GDIPlus_PathAddEllipse($hPath, $iW2 - $fRadius_inner, $iH2 - $fRadius_inner, $fRadius_inner * 2, $fRadius_inner * 2)
    _GDIPlus_GraphicsFillPath($hGfx, $hPath, $hBrush)
    _GDIPlus_GraphicsDrawPath($hGfx, $hPath, $hPen)
    _GDIPlus_PathDispose($hPath)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush_outline)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_GraphicsDispose($hGfx)
    Return $hBitmap
EndFunc   ;==>_GDIPlus_BitmapCreateGear
Минус такого подхода в том, что пока не получается сделать применение прогрессбара универсально. Тоесть пока запускается только для поиска файла. Если же нужно запустить другой процесс и подождать, то пока не придумал как это сделать.
Можно для универсальности, конечно, вынести в отдельный экзешник, но мне эта идея не очень нравится.
 
Последнее редактирование:
Верх