Что нового

Расчёт процентовки скинового 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
Репутация
369
так?
Код:
$iStep = Round($iStep * (($_JSkin_Progress_Param[$i][11] - 2)/ 100))

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