Что нового

Слайдер с элементами графики

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


Пока ползунок двигаешь, полоска перекрывает его, как только отпустишь, всё как надо, красиво, аккуратно. Так же когда элемент теряет фокус, полоски исчезают. В общем хочу спросить совета у тех, кто что-то подобное уже делал и знает все нюансы, как это реализовать. Так же хочется, чтобы вокруг слайдера не рисовалась рамка, выделяющая его, какой для этого нужен стиль.
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Нашел пример Yashied, сделал таким образом:

Код:
#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 <GuiTab.au3>
#include <GDIPlus.au3>
#Include <StaticConstants.au3>

Global Const $tagNMCUSTOMDRAW = 'hwnd hWndFrom;uint_ptr IDFrom;int Code;dword DrawStage;hwnd hDC;' & $tagRECT & ';dword_ptr ItemSpec;uint ItemState;lparam ItemlParam'
;Global Const $STM_GETIMAGE = 0x0173

Global $hTemp = 0
$color =  Hex(_WinAPI_GetSysColor($COLOR_WINDOW), 6)

$gui1 = GUICreate('MyGUI', 413, 161)
GUISetBkColor('0x' & $color)
Local $x = 3
Local $y = 75

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0(413, 161)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF4d)
_GDIPlus_GraphicsFillRect($hGraphics, 120, 60, 240, 5, $hBrush)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFF00)
_GDIPlus_GraphicsFillRect($hGraphics, 120, 110, 240, 5, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

$Pic1 = GUICtrlCreatePic('', 0, 0, 413, 161)
GUICtrlSetState(-1, $GUI_DISABLE)
$hPic = GUICtrlGetHandle(-1)

GUICtrlCreateSlider(120, 50, 240, 23, $TBS_NOTICKS)
Local $hSlider1 = GUICtrlGetHandle(-1)
GUICtrlSetBkColor($hSlider1, $color)
GUICtrlCreateSlider(120, 100, 240, 23, $TBS_NOTICKS)
Local $hSlider2 = GUICtrlGetHandle(-1)
GUICtrlSetBkColor($hSlider2, $color)

GUISetState()

GUIRegisterMsg($WM_HSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_VSCROLL, "WM_HVSCROLL")
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

_WinAPI_DwmEnableBlurBehindWindow($gui1, 1, 1)
GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_HVSCROLL($hWnd, $MsgID, $wParam, $lParam)
	Switch $lparam
		Case $hSlider1
			GUICtrlSetState($hSlider1, $GUI_NOFOCUS)
		Case $hSlider2
			GUICtrlSetState($hSlider2, $GUI_NOFOCUS)
	EndSwitch
EndFunc

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMCD = DllStructCreate($tagNMCUSTOMDRAW, $lParam)
    Local $hWndFrom = DllStructGetData($tNMCD, 'hWndFrom')
    Local $Code = DllStructGetData($tNMCD, 'Code')
    Local $DrawStage = DllStructGetData($tNMCD, 'DrawStage')
    Local $ItemSpec = DllStructGetData($tNMCD, 'ItemSpec')
    Local $hDC = DllStructGetData($tNMCD, 'hDC')
    Local $hMemDC, $hBitmap, $hPrev
    Local $aPos

    Switch $hWndFrom
        Case $hSlider1
            Switch $Code
                Case $NM_CUSTOMDRAW
                    Switch $DrawStage
                        Case $CDDS_PREPAINT, $CDDS_POSTPAINT
                            $aPos = ControlGetPos($hSlider1, '', '')
                            Switch $DrawStage
                                Case $CDDS_PREPAINT
                                    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                    $hBitmap = _SendMessage($hPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
                                    $hPrev = _WinAPI_SelectObject($hMemDC, $hBitmap)
                                    _WinAPI_BitBlt($hDC, 0, 0, $aPos[2], $aPos[3], $hMemDC, $aPos[0], $aPos[1], $SRCCOPY)
                                    _WinAPI_SelectObject($hMemDC, $hPrev)
                                    _WinAPI_DeleteDC($hMemDC)
                                    Return BitOR($CDRF_NOTIFYITEMDRAW, $CDRF_NOTIFYPOSTPAINT)
                                Case $CDDS_POSTPAINT
                                    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                    If Not $hTemp Then
                                        $hTemp = _WinAPI_CreateCompatibleBitmap($hDC, $aPos[2], $aPos[3])
                                        $hPrev = _WinAPI_SelectObject($hMemDC, $hTemp)
                                        _WinAPI_BitBlt($hMemDC, 0, 0, $aPos[2], $aPos[3], $hDC, 0, 0, $MERGECOPY)
                                    Else
                                        $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                        $hPrev = _WinAPI_SelectObject($hMemDC, $hTemp)
                                        _WinAPI_BitBlt($hDC, 0, 0, $aPos[2], $aPos[3], $hMemDC, 0, 0, $SRCCOPY)
                                    EndIf
                                    _WinAPI_SelectObject($hMemDC, $hPrev)
                                    _WinAPI_DeleteDC($hMemDC)
                                    Return $CDRF_DODEFAULT
                            EndSwitch
                        Case $CDDS_ITEMPREPAINT
                            If $hTemp Then
                                _WinAPI_DeleteObject($hTemp)
                                $hTemp = 0
                            EndIf
                            Switch $ItemSpec
                                Case $TBCD_TICS
                                    Return $CDRF_SKIPDEFAULT
                                Case $TBCD_THUMB, $TBCD_CHANNEL
                                    Return $CDRF_DODEFAULT
                            EndSwitch
                    EndSwitch
			EndSwitch

			Case $hSlider2
            Switch $Code
                Case $NM_CUSTOMDRAW
                    Switch $DrawStage
                        Case $CDDS_PREPAINT, $CDDS_POSTPAINT
                            $aPos = ControlGetPos($hSlider2, '', '')
                            Switch $DrawStage
                                Case $CDDS_PREPAINT
                                    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                    $hBitmap = _SendMessage($hPic, $STM_GETIMAGE, $IMAGE_BITMAP, 0)
                                    $hPrev = _WinAPI_SelectObject($hMemDC, $hBitmap)
                                    _WinAPI_BitBlt($hDC, 0, 0, $aPos[2], $aPos[3], $hMemDC, $aPos[0], $aPos[1], $SRCCOPY)
                                    _WinAPI_SelectObject($hMemDC, $hPrev)
                                    _WinAPI_DeleteDC($hMemDC)
                                    Return BitOR($CDRF_NOTIFYITEMDRAW, $CDRF_NOTIFYPOSTPAINT)
                                Case $CDDS_POSTPAINT
                                    $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                    If Not $hTemp Then
                                        $hTemp = _WinAPI_CreateCompatibleBitmap($hDC, $aPos[2], $aPos[3])
                                        $hPrev = _WinAPI_SelectObject($hMemDC, $hTemp)
                                        _WinAPI_BitBlt($hMemDC, 0, 0, $aPos[2], $aPos[3], $hDC, 0, 0, $MERGECOPY)
                                    Else
                                        $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
                                        $hPrev = _WinAPI_SelectObject($hMemDC, $hTemp)
                                        _WinAPI_BitBlt($hDC, 0, 0, $aPos[2], $aPos[3], $hMemDC, 0, 0, $SRCCOPY)
                                    EndIf
                                    _WinAPI_SelectObject($hMemDC, $hPrev)
                                    _WinAPI_DeleteDC($hMemDC)
                                    Return $CDRF_DODEFAULT
                            EndSwitch
                        Case $CDDS_ITEMPREPAINT
                            If $hTemp Then
                                _WinAPI_DeleteObject($hTemp)
                                $hTemp = 0
                            EndIf
                            Switch $ItemSpec
                                Case $TBCD_TICS
                                    Return $CDRF_SKIPDEFAULT
                                Case $TBCD_THUMB, $TBCD_CHANNEL
                                    Return $CDRF_DODEFAULT
                            EndSwitch
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY


Не устраивает обводка активного слайдера точками, хотелось бы убрать. Как?? Потом, если окно прозрачное, как в данном скрипте, то после активации слайдера, под ним фон становится отличным от фона всего окна, он как бы более прозрачный, что-ли..
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
musicstashall
По поводу точек по контуру, почитайте здесь https://www.autoitscript.com/forum/topic/101733-prevent-dotted-focus-lines-on-controls/
 
Автор
M

musicstashall

Знающий
Сообщения
322
Репутация
7
Можно ли черный цвет создаваемого Bitmap делать прозрачным? Я бы хотел, чтобы Pic просвечивал вместе с окном, при применении BlurBehind:

Код:
$color =  Hex(_WinAPI_GetSysColor($COLOR_WINDOW), 6) ; черный или темный цвет (0x333333), используется темная тема

$gui1 = GUICreate('MyGUI', 413, 161)
GUISetBkColor('0x' & $color)

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0(413, 161)
$hGraphics = _GDIPlus_ImageGetGraphicsContext($hImage)
$hBrush = _GDIPlus_BrushCreateSolid('0xFF' & $color)
_GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 413, 161, $hBrush)
$hBrush = _GDIPlus_BrushCreateSolid(0xFF00FF4d)
_GDIPlus_GraphicsFillRect($hGraphics, 127, 61, 226, 5, $hBrush)
$hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFF00)
_GDIPlus_GraphicsFillRect($hGraphics, 127, 111, 226, 5, $hBrush)
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_GraphicsDispose($hGraphics)
_GDIPlus_Shutdown()

$Pic1 = GUICtrlCreatePic('', 0, 0, 413, 161)
GUISetState()

_WinAPI_DwmEnableBlurBehindWindow($gui1, 1, 1)
GUICtrlSendMsg($Pic1, 0x0172, 0, $hBitmap)



Добавлено:
Сообщение автоматически объединено:

Хочу сделать такие слайдеры:

 
Верх