Jump to content

Recommended Posts

Apresento esta UDF chamada BackEffect, (back = para trás, effect = efeito).

 

Quando você cria um controle* com esta UDF é possível você adicionar um efeito para este controle.

 

Que tipo de efeito?

Ao deixar o mouse sobre o controle, você vai perceber uma caixa que irá mudando gradualmente da dor do background da janela para o verde.

 

Posso personalizar a cor?

Sim. O padrão da UDF é o verde, mas é possível definir qualquer outra cor.

 

Posso personalizar o tamanho da borda do efeito?

Sim. O default é 4.

 

Como funciona?

Quando você cria um controle* em uma GUI** a UDF lê o tamanho (largura e altura) do controle e cria um GUICtrlCreateLabel com um tamanho maior do que o seu controle (4 pontos maior, por default), e depois, posiciona esse controle por trás do controle principal.

E no momento que o mouse é posicionado sobre o seu controle principal, a UDF vai suavemente alterando a cor GUICtrlCreateLabel posicionada atrás do controle até a cor definida (verde, por default).

Ao retirar o mouse do controle principal, o processo inverso é realizado, isto é, a cor do GUICtrlCreateLabel vai suavemente do verde até a cor do background da GUI.

 

Requisitos:

A GUI criada necessita ter $WS_EX_COMPOSITED em seu $sStyle.

 

Restrições:

$WS_EX_COMPOSITED não funciona com GDIPLus+.

 

*Controles:

  • GUICtrlCreateLabel
  • GUICtrlCreateButton
  • GUICtrlCreateRadio
  • GUICtrlCreateGroup
  • GUICtrlCreateCheckbox
  • GUICtrlCreateCombo
  • GUICtrlCreateInput
  • GUICtrlCreateList

*GUI: Graphic User Interface ou simplesmente janela

 

https://github.com/chechelaky/AutoIt/tree/master/BackEffect

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

@Luigi pelo que vc falou parece ter ficado muito legal só não consegui testar porquê ainda uso a versão 3.3.9.4 do Autoit!

Share this post


Link to post
Share on other sites

Gostei muito desse efeito, só não sei onde muda a cor e a expessura.

Vou deixar uma sugestão:

AddBack_Effect($aGui[0], $hControlLabel, $Cor, $Expessura)

Assim não seria preciso mudar manualmente dentro da udf

Share this post


Link to post
Share on other sites

@Sergio-F

 

Não precisa mudar dentro da udf, apenas informe ao chamar a função "__BackEffectStart()".

Func __BackEffectStart($hGui = 0, $iColorOver = 0x00FF00, $iDelay = 10, $iIncrement = 5)

Informe no segundo parâmetro a cor desejada.

 

Mas acho que está valendo também a tua sugestão e a incremento:

- Na function "__BackEffectStart()" informar a espessura da borda que seria padrão para todos.

- Na function "AddBack_Effect()" dar a possibilidade de informar uma cor em específica para o elemento.

  • Haha 1

Share this post


Link to post
Share on other sites

Hum... gostei das sugestões, acho que vou fazer a cor e a largura personalizada por controle, fica mais customizável né?

 

Mas respondendo a dúvida do @Sergio-F:

Global $iCorDoEfeito = 0xFFFF00 ; sempre neste formato
__BackEffectStart($aGui[0], $iCorDoEfeito) ; 

AddBack_Effect($aGui[0], $hControlLabel, 2) ; tamanho de borda 2
AddBack_Effect($aGui[0], $hControlButton, 4) ; tamanho de borda 4
AddBack_Effect($aGui[0], $hControlRadio, 6) ; tamanho de boarda 6
Edited by Luigi

Share this post


Link to post
Share on other sites

@Luigi,

 

Parabéns pela sua UDF! Gostei muito e me ajudou muito.

 

Só uma dúvida: eu consigo usar sua UDF pra elementos em uma página web ? Seria essencial ! O que acha ?

 

 

Israel

Share this post


Link to post
Share on other sites

Eu li o seu post aqui no fórum e no fórum americano, e pensei a respeito, acredito que impossível não é, mas você teria que ter uma UDF para IE, Firefox, Chrome, etc...

 

a] E envolveria uma matemática / algoritmo para interpretar e localizar onde está o elemento, seria quase como desenvolver um novo browser para destacar o elemento, mas um browser para rodar em background, só para fazer isso.

Pode ser que eu esteja errado e não tenha visto outra alternativa diante do meu nariz.

 

b] Mas o que eu acho mais fácil, é você desenvolver isso em JavaScript / JQuery (como disse o JhonOne) e submeter o elemento via AJAX para um server AutoIt (se for o caso).

 

A primeira opção, eu acho bastante trabalhosa.

A segunda opção, mais fácil.

Share this post


Link to post
Share on other sites

Embora o ultimo post foi de 2017 e vi o codigo apenas agora

Muito bom a UDF. Criei um script pra testar e ficou legal

Notei que as vezes ao passar o mouse o efeito vem acompanhado de alguns blinks

Adicionei uma função de sleep (_HighPrecisionSleep) na UDF mas não consegui eliminar totalmente o blink

#include "BackEffect.au3"
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <UDF_AnimateWindow.au3>

#cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.14.5
 Author:         Rodrigo Chaves

 Script Function:
    Popup Exemplo 2
    11/2019

#ce ----------------------------------------------------------------------------

;Variavel de dimensionamento
Dim Const $iW = 610, $iH = 430
;Variavel para arrendondamento das bordas da janela e dimensionamento do botao fechar
Dim Const $iC = 25
Dim Const $iC2 = 8 ;0 = Quadrado / 8 = Quadrado com cantos arredondados / 16 = Quase circular / 32 = Circulo
;Variavel para controle do MouseHover
Dim $fOver0 = False, $fOver1 = False, $fOver2 = False

;/Tabela de cores
Dim $tSTRUCTCOLOR = 'struct;char white[8];char alpha[2];char blueCustom[8];char blue[8];char dark[8];char red[8];char gray[8];endstruct'
Dim $oColor = DllStructCreate($tSTRUCTCOLOR)
DllStructSetData($oColor, 'blueCustom', 0x006BB7)
DllStructSetData($oColor, 'blue', 0x01558C)
DllStructSetData($oColor, 'white', 0xFFFFFF)
DllStructSetData($oColor, 'alpha', -2)
DllStructSetData($oColor, 'dark', 0x252525)
DllStructSetData($oColor, 'red', 0xD61425)
DllStructSetData($oColor, 'gray', 0xD1D1D1)
;//

;Cria o Popup
Dim Const $hWnd_Main = GUICreate("", $iW, $iH, -1, -1, $WS_POPUP)
GUISetBkColor($oColor.blueCustom)
$aGetPos = WinGetPos($hWnd_Main)

;Arredonda os cantos da form
Dim Const $hRegion = _WinAPI_CreateRoundRectRgn(0, 0, $iW, $iH, $iC, $iC)
_WinAPI_SetWindowRgn($hWnd_Main, $hRegion)

Dim $idBtn_Ok = GUICtrlCreateLabel("Ok", 410, 369, 75, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $oColor.dark)
GUICtrlSetColor(-1, $oColor.white)

Dim $idBtn_Cancel = GUICtrlCreateLabel("Cancelar", 500, 369, 75, 25, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $oColor.dark)
GUICtrlSetColor(-1, $oColor.white)

;Aplica efeito de entrada
WinAPI_AnimateWindow($hWnd_Main, 'explode', 350)
GUISetState(@SW_SHOW)

;/Cria o botao close
Dim Const $hWnd_Close = GUICreate('', $iC, $iC, $aGetPos[2] - 35, 10, $WS_POPUP, $WS_EX_MDICHILD, $hWnd_Main)
;Arredonda os cantos da form
Dim Const $hRegion_ = _WinAPI_CreateRoundRectRgn(0, 0, $iC, $iC, $iC2, $iC2)
_WinAPI_SetWindowRgn($hWnd_Close, $hRegion_)
;Define a cor de fundo
GUISetBkColor($oColor.dark)
;/Cria o botao X
Dim $idBtn_Close_C = GUICtrlCreateLabel('X', 0, 0, $iC - 1, $iC - 1, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 11, 400, 0, 'Segoe UI', 0)
GUICtrlSetBkColor(-1, $oColor.dark)
GUICtrlSetColor(-1, $oColor.white)
;//
;Executa a animacao de entrada
WinAPI_AnimateWindow($hWnd_Close, 'explode', 300)
;Exibe a form
GUISetState(@SW_SHOW)
WinActivate($hWnd_Main)
;//

;Altera os estilos da form
GUISetStyle(-1, $WS_EX_COMPOSITED, $hWnd_Main)
;Registra uma funcao definida para um Windows Message ID (WM_MSG) conhecido
GUIRegisterMsg($WM_NCHITTEST, "_WM_NCHITTEST")

;Habilita o efeito nos controles
__BackEffectStart($hWnd_Main, $oColor.gray)
;Adiciona o efeito no botao $idBtn_Ok
AddBack_Effect($hWnd_Main, $idBtn_Ok, 3)
;Adiciona o efeito no botao $idBtn_Cancel
AddBack_Effect($hWnd_Main, $idBtn_Cancel, 3)

While 1
    ;Identifica a posicao do mouse sobre a form
    _MouseHover()
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $idBtn_Close_C
            Exit

        Case $idBtn_Ok
            MsgBox(262144 + 0, 'Debug', 'Botao Ok pressionado', 0, $hWnd_Main)

        Case $idBtn_Cancel
            MsgBox(262144 + 0, 'Debug', 'Botao cancelar pressionado', 0, $hWnd_Main)
            Exit

    EndSwitch
WEnd

;Retorna a posicao do mouse relativa a Form
Func _MouseHover()
    $aCInfo = GUIGetCursorInfo($hWnd_Main)
    ;/Button Ok
    If $aCInfo[4] = $idBtn_Ok Then
        If $fOver0 = False Then
            GUICtrlSetBkColor($idBtn_Ok, $oColor.blue)
            GUICtrlSetColor($idBtn_Ok, $oColor.white)
            $fOver0 = True
        EndIf
    Else
        If $fOver0 = True Then
            GUICtrlSetBkColor($idBtn_Ok, $oColor.dark)
            GUICtrlSetColor($idBtn_Ok, $oColor.gray)
            $fOver0 = False
        EndIf
    EndIf
    ;//
    ;/Button Cancel
    If $aCInfo[4] = $idBtn_Cancel Then
        If $fOver1 = False Then
            GUICtrlSetBkColor($idBtn_Cancel, $oColor.red)
            GUICtrlSetColor($idBtn_Cancel, $oColor.white)
            $fOver1 = True
        EndIf
    Else
        If $fOver1 = True Then
            GUICtrlSetBkColor($idBtn_Cancel, $oColor.dark)
            GUICtrlSetColor($idBtn_Cancel, $oColor.gray)
            $fOver1 = False
        EndIf
    EndIf
    ;//
    $aCInfo = GUIGetCursorInfo($hWnd_Close)
    ;/Button Close
    If $aCInfo[4] = $idBtn_Close_C Then
        If $fOver2 = False Then
            GUICtrlSetBkColor($idBtn_Close_C, $oColor.red)
            GUICtrlSetColor($idBtn_Close_C, $oColor.white)
            $fOver2 = True
        EndIf
    Else
        If $fOver2 = True Then
            GUICtrlSetBkColor($idBtn_Close_C, $oColor.dark)
            GUICtrlSetColor($idBtn_Close_C, $oColor.gray)
            $fOver2 = False
        EndIf
    EndIf
    ;//
EndFunc   ;==>_MouseHover

;Habilita o movimento da form de qualquer ponto de referencia
Func _WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    ;https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-nchittest
    #forceref $hWnd, $iMsg, $iwParam, $ilParam
    If $iMsg = $WM_NCHITTEST Then Return $HTCAPTION
EndFunc   ;==>_WM_NCHITTEST

Abaixo eu anexei a UDF com a função _HighPrecisionSleep adicionada

E a UDF AnimateWindow que não vem na instalação do Autoit mas esta presente nesse código de exemplo

 

BackEffect.au3

UDF_AnimateWindow.au3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×