Что нового

[Элементы GUI] запись на progressbar

andreitrane

Новичок
Сообщения
141
Репутация
3
как можно записать на прогрессбар статистику?
я знаю что можно записывать статистику на label, но если label засунуть на прогрессбар, то он закрывает часть progress, а это не очень красиво, а когда progress начинает двигаться, то label вообще исчезает....
приведите пример записи статистики на Progress, и обязателен ли для этого label?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Это я писал для Windows 7 (на XP не пробывал).

Код:
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>
#Include <WinAPI.au3>

GUICreate('MyGUI', 400, 100)
$Progress = GUICtrlCreatePic('', 20, 40, 360, 21)
GUICtrlSetState(-1, $GUI_DISABLE)
$Label = GUICtrlCreateLabel('0%', 180, 44, 40, 14, $SS_CENTER)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUISetState()

For $i = 1 To 100
	_SetProgress($Progress, $i)
	GUICtrlSetData($Label, $i & '%')
	Sleep(20)
Next

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _SetProgress($hWnd, $iPercent, $iState = 0, $fVertical = False)

	Local $hDC, $hMemDC, $hSv, $hObj, $hBitmap, $hTheme, $tRect, $tClip, $W, $H, $Ret, $Rusult = 1

	If Not IsHWnd($hWnd) Then
		$hWnd = GUICtrlGetHandle($hWnd)
		If Not $hWnd Then
			Return 0
		EndIf
	EndIf
	$hTheme = DllCall('uxtheme.dll', 'ptr', 'OpenThemeData', 'hwnd', $hWnd, 'wstr', 'Progress')
	If (@error) Or (Not $hTheme[0]) Then
		Return 0
	EndIf
	$tRect = _WinAPI_GetClientRect($hWnd)
	$W = DllStructGetData($tRect, 3) - DllStructGetData($tRect, 1)
	$H = DllStructGetData($tRect, 4) - DllStructGetData($tRect, 2)
	$hDC = _WinAPI_GetDC($hWnd)
	$hMemDC = _WinAPI_CreateCompatibleDC($hDC)
	$hBitmap = _WinAPI_CreateSolidBitmap(0, _WinAPI_GetSysColor(15), $W, $H, 0)
	$hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
	DllStructSetData($tRect, 1, 0)
	DllStructSetData($tRect, 2, 0)
	DllStructSetData($tRect, 3, $W)
	DllStructSetData($tRect, 4, $H)
	$Ret = DllCall('uxtheme.dll', 'uint', 'DrawThemeBackground', 'ptr', $hTheme[0], 'hwnd', $hMemDC, 'int', 2 - (Not $fVertical), 'int', 0, 'ptr', DllStructGetPtr($tRect), 'ptr', 0)
	If (@error) Or ($Ret[0]) Then
		$Rusult = 0
	EndIf
	If $fVertical Then
		DllStructSetData($tRect, 2, $H * (1 - $iPercent / 100))
	Else
		DllStructSetData($tRect, 3, $W * $iPercent / 100)
	EndIf
	$tClip = DllStructCreate($tagRECT)
	DllStructSetData($tClip, 1, 1)
	DllStructSetData($tClip, 2, 1)
	DllStructSetData($tClip, 3, $W - 1)
	DllStructSetData($tClip, 4, $H - 1)
	DllCall('uxtheme.dll', 'uint', 'DrawThemeBackground', 'ptr', $hTheme[0], 'hwnd', $hMemDC, 'int', 6 - (Not $fVertical), 'int', 1 + $iState, 'ptr', DllStructGetPtr($tRect), 'ptr', DllStructGetPtr($tClip))
	If (@error) Or ($Ret[0]) Then
		$Rusult = 0
	EndIf
	_WinAPI_ReleaseDC($hWnd, $hDC)
	_WinAPI_SelectObject($hMemDC, $hSv)
	_WinAPI_DeleteDC($hMemDC)
	DllCall('uxtheme.dll', 'uint', 'CloseThemeData', 'ptr', $hTheme[0])
	If $Rusult Then
		_WinAPI_DeleteObject(_SendMessage($hWnd, 0x0172, 0, $hBitmap))
		$hObj = _SendMessage($hWnd, 0x0173)
		If $hObj <> $hBitmap Then
			_WinAPI_DeleteObject($hBitmap)
		EndIf
	EndIf
	Return $Rusult
EndFunc   ;==>_SetProgress
 
Верх