musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Доброго всем. Хочу изобразить слайдер с цветной полоской, что получается:
Пока ползунок двигаешь, полоска перекрывает его, как только отпустишь, всё как надо, красиво, аккуратно. Так же когда элемент теряет фокус, полоски исчезают. В общем хочу спросить совета у тех, кто что-то подобное уже делал и знает все нюансы, как это реализовать. Так же хочется, чтобы вокруг слайдера не рисовалась рамка, выделяющая его, какой для этого нужен стиль.
Код:
#include <WinAPI.au3>
#include <ComboConstants.au3>
#Include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <SliderConstants.au3>
#include <Constants.au3>
#include <TabConstants.au3>
#Include <WinAPIEx.au3>
#include <File.au3>
#include <GuiTab.au3>
#include <GDIPlus.au3>
Local $gui1 = GUICreate("", 400, 250, -1, -1)
GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_VSCROLL, "WM_HVSCROLL")
Local $x = 3
Local $y = 75
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0(240, 5)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF4d)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 240, 5, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()
$Pic1 = GUICtrlCreatePic("", $x + 130, $y+10, 240, 5)
$Pic2 = GUICtrlCreatePic("", $x + 130, $y+60, 240, 5)
Local $iSlider1 = GUICtrlCreateSlider($x + 130, $y, 240, 25)
Local $iSlider2 = GUICtrlCreateSlider($x + 130, $y+50, 240, 25)
GUICtrlSetStyle($iSlider1, BitOR(0x00001018, $WS_CHILD, $WS_VISIBLE))
GUICtrlSetStyle($iSlider2, BitOR(0x00001018, $WS_CHILD, $WS_VISIBLE))
;GUICtrlSetStyle($iSlider1, $TBS_NOTICKS, $WS_EX_TRANSPARENT)
;GUICtrlSetStyle($iSlider2, $TBS_NOTICKS, $WS_EX_TRANSPARENT)
GUICtrlSetLimit($iSlider1, 240)
GUICtrlSetLimit($iSlider2, 240)
GUISetState()
GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap)
GUICtrlSendMsg($Pic2, 0x0172, 0, $hBitmap)
_WinAPI_DwmEnableBlurBehindWindow($gui1, 1, 1)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $iSlider1, $iSlider2
;_WinAPI_RedrawWindow($gui1)
;GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap)
;GUICtrlSendMsg($Pic2, 0x0172, 0, $hBitmap)
EndSwitch
WEnd
Func WM_HVSCROLL($hWnd, $MsgID, $wParam, $lParam)
Switch $lparam
Case GUICtrlGetHandle($iSlider1)
Update()
Case GUICtrlGetHandle($iSlider2)
Update()
EndSwitch
EndFunc
Func Update()
GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap)
GUICtrlSetState($iSlider1, $GUI_ONTOP + $GUI_NOFOCUS)
GUICtrlSendMsg($Pic2, 0x0172, 0, $hBitmap)
GUICtrlSetState($iSlider2, $GUI_ONTOP + $GUI_NOFOCUS)
EndFunc
Пока ползунок двигаешь, полоска перекрывает его, как только отпустишь, всё как надо, красиво, аккуратно. Так же когда элемент теряет фокус, полоски исчезают. В общем хочу спросить совета у тех, кто что-то подобное уже делал и знает все нюансы, как это реализовать. Так же хочется, чтобы вокруг слайдера не рисовалась рамка, выделяющая его, какой для этого нужен стиль.