Что нового

Расчёт процентовки скинового ProgressBar'a

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Не могу расчитать процентовку для ProgressBar'a, нужно чтоб не имеет значение какой длины будет progress он всегда показывал 100 и линия доходила только до его края а не за ProgressBar, в коде я отметил коментарием где у меня не получается, а чтоб не искать то это в функции _JSkin_SetProgressStep

Код примера:
Код:
#include <GUIConstantsEx.au3>
#Include <JSkin_Progress.au3>

$hForm = GUICreate("_JSin_CreateProgressBar", 400, 200)
GUISetBkColor(0x1E1E1E)
$iProgress = _JSkin_CreateProgressBar(20, 20, 200, 15, 0x4C4C4C, 0x202020, 0x404040, 0xFF7F7F, 0xE20000)
GUISetState()

For $i = 0 To 100
	_JSkin_SetProgressStep($iProgress, $i)
	Sleep(20)
Next	

Sleep(500)

_JSkin_SetProgressStep($iProgress, 50)

While 1
	Switch GUIGetMsg()
	    Case $GUI_EVENT_CLOSE
		    Exit
	EndSwitch		
Wend

UDF JSkin_Progress.au3:
Код:
#Include <WinAPIEx.au3>

Global $_JSkin_Progress_Param[1][14] = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

Func _JSkin_CreateProgressBar($iLeft, $iTop, $iWidth, $iHeight, $iFrame, $iTColor, $iBColor, $lTColor, $lBColor)
	
    $iFont = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight)
    $hFont = GUICtrlGetHandle($iFont)
    GUICtrlSetState($iFont, 128)

	$iLine = GUICtrlCreatePic("", $iLeft + 2, $iTop + 2, $iWidth - 4, $iHeight - 4)
    $hLine = GUICtrlGetHandle($iLine)
	GUICtrlSetState($iLine, 128)

	$_JSkin_Progress_Param[0][0] += 1
	ReDim $_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0] + 1][UBound($_JSkin_Progress_Param, 2)]
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][0] = $iFont
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][1] = $hFont
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][2] = $iFrame
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][3] = $iTColor
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][4] = $iBColor
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][5] = $iLine
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][6] = $hLine
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][7] = $lTColor
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][8] = $lBColor	
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][9] = $iLeft
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][10] = $iTop
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][11] = $iWidth
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][12] = $iHeight	
	$_JSkin_Progress_Param[$_JSkin_Progress_Param[0][0]][13] = 0
	
	__SetProgressColor($hFont, $iWidth, $iHeight, $iFrame, $iTColor, $iBColor)
	
	Return $iLine
EndFunc	

Func _JSkin_SetProgressStep($iCtrlId, $iStep)
	For $i = 0 To $_JSkin_Progress_Param[0][0]
		If $_JSkin_Progress_Param[$i][5] = $iCtrlId Then
			
			$iStep = (Round($iStep * ($_JSkin_Progress_Param[$i][11] / 100)) - 2) ; Здесь не получается высчитать
			$_JSkin_Progress_Param[$i][13] = $iStep
			ConsoleWrite($_JSkin_Progress_Param[$i][13] & @CRLF)
			
			$hDC = _WinAPI_GetDC($_JSkin_Progress_Param[$i][6])
            $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
            $hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, $iStep, $_JSkin_Progress_Param[$i][12] - 4, 0x060606)
            $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
            Dim $hGradient[2][3] = [[0, 0, $_JSkin_Progress_Param[$i][7]], [$iStep, $_JSkin_Progress_Param[$i][12] - 4, $_JSkin_Progress_Param[$i][8]]]
            _WinAPI_GradientFill($hDestDC, $hGradient)
            _WinAPI_ReleaseDC($_JSkin_Progress_Param[$i][6], $hDC)
            _WinAPI_SelectObject($hDestDC, $hDestSv)
            _WinAPI_DeleteDC($hDestDC)
            _SendMessage($_JSkin_Progress_Param[$i][6], 0x0172, 0, $hBitmap)

        EndIf
    Next
EndFunc

Func __SetProgressColor($iCtrlId, $iWidth, $iHeight, $iFrame, $iTColor, $iBColor)
	
	Local $hDC, $hDestDC, $hBitmap, $hDestSv, $hGradient 
	
	$hDC = _WinAPI_GetDC($iCtrlId)
    $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    $hBitmap = _WinAPI_CreateCompatibleBitmapEx($hDC, $iWidth, $iHeight, $iFrame)
    $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
    Dim $hGradient[2][3] = [[2, 2, $iTColor], [$iWidth - 2, $iHeight - 2, $iBColor]]
    _WinAPI_GradientFill($hDestDC, $hGradient)
    _WinAPI_ReleaseDC($iCtrlId, $hDC)
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_DeleteDC($hDestDC)
    _SendMessage($iCtrlId, 0x0172, 0, $hBitmap)
EndFunc

Скрин:
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
так?
Код:
$iStep = Round($iStep * (($_JSkin_Progress_Param[$i][11] - 2)/ 100))

+/-1 пиксель мажет иногда, но это из-за погрешности округления
 
Верх