Jump to content
Sign in to follow this  
Pedro Pinheiro

Elementos transparentes na tela.

Recommended Posts

A bastante tempo eu venho me perguntando. Porque com outros programas é tão simples a sobreposição e transparência de imagens, mas no autoit NÃO!?

 

Por exemplo:

 

Em muitos programas é usado o arquvo ".png", normalmente essa imagem é criada com um background trânsparente para sobrepor algum elemento da GUI ou geralmente fundos verde:

 

zFUnAQH.png

 

Depois de montar a GUI com o elemento (.png) de background verde, o fundo verde some e a imagem fica sem fundo:

 

M1zxQwy.png

 

 

Onde eu quero chegar???

 

Eu gostaria de achar um padrão para definir um background nas imagens usadas como elemento na tela. Um tempo atrás eu vi um elemento na tela de uma GUI onde o elemento tinha sombra:

 

Ex:

 

htAh6Km.png

 

 

Coloquei 4 elementos na imagem representando uma Gui. O background da Gui é a foto das pedras, e as demais imagens são exemplos de como elas podem ficar em cima do background mantendo sua transparência e sua sombra. Eu gostaria de fazer isso no autoit, mas o guicreatepic não aceita png, eu encontrei outras maneiras de colocar uma png no gui, mas ela não fica transparente e nem mantem a borda...simplesmente fica um background branco.

 

Eu estava pensando em criar algumas coisas, mas essa limitação do autoit que eu encontrei não me deixa.

Pensei em fazer algo do tipo...slides, jogos, matriz de maquinas comerciais...

 

Ex:

lJ4i555.png

 

 

 

Sabe aquele item de seleção verde que aparece na imagem abaixo? Isso que eu queria fazer. Fazer com que ele fique transparente para que eu possa ver o backgroundo do gui por dentro dele.

 

placa-arcade-fliperama-jamma-pandora-box

 

Eu abri o programa e peguei a imagem png verde de seleção e tentei usar no autoit, mas..

 

v8FfXbv.png

 

 

Quando eu fui colocar no programa, ele ficou assim, sem transparência.

 

SUJ7mwf.gif

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

Achei que ficou bem legal o seletor desta maneira pois o preenchimento dele fez ficar bem mais nítido o item selecionado!

Share this post


Link to post
Share on other sites

Achei que ficou bem legal o seletor desta maneira pois o preenchimento dele fez ficar bem mais nítido o item selecionado!

 

Belini. Você sabe mover uma imagem em GDI+? Estou usando para colocar imagem na tela com transparência. Aprendi essa noite mexer um pouco com GDI+ e apliquei ao programa, mas na hora de mover a imagem ele fica repetindo a mesma "_GDIPlus_GraphicsDrawImageRect($hGraphic,$imagem,35,$pos_barra,309,49)" Essa função adiciona uma imagem na GUI, só que não consigo mover a imagem criada.

Share this post


Link to post
Share on other sites
@Pedro Pinheiro, para imagens PNG use a UDF do Jscript _GUICreateAlfa.au3.


Download da UDF + Exemplo Aqui: _GUICreateAlfa.au3


Ao testar declare a Variável $ghGDIPDll e pronto.


Tô usando ela para um projeto fica show de bola.


Para trabalhar GDI é bem chato, acho que tem que criar e se for mover tem que deletar para para criar em outra coordenada novamente.

Edited by Fábio iGames
  • Like 1

Share this post


Link to post
Share on other sites

No script que eu fiz de exemplo...a estrutura é criada com uma imagem de background e uma outra imagem em cima. Em 8 segundos a imagem de cima é deletada e recriada um pouco a baixo, mas o problema é que o "_GDIPlus_GraphicsClear($hGraphic, 0xFF000000)" está deletando todas as imagens.

 

 

 

Não sei se tem haver mas neste código da cor está passando 2 zeros 0xFF000000

 

Não é :/

 

 

Eu separei o script e deixei ele bem simples.

#include <GUIConstants.au3>
#include <File.au3>
#include <GDIPlus.au3>


$brgui=GUICreate("Test Frontend", 800, 600, -1, -1, BitOR ($WS_POPUP,$WS_BORDER))

;Imagem de fundo
GUICtrlCreatePic("C:\ARCADE\Layouts\skin.jpg",0,0, 800,600)
GUICtrlSetState (-1, $GUI_DISABLE)

GUISetState  ()

;inicia GDI+

_GDIPlus_StartUp()
local $imagem=_GDIPlus_ImageLoadFromFile("C:\ARCADE\Layouts\select.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($brgui)
_WinAPI_RedrawWindow($brgui, "", "", BitOR($RDW_INVALIDATE, $RDW_UPDATENOW, $RDW_FRAME));
_GDIPlus_GraphicsDrawImageRect($hGraphic,$imagem,35,50,309,49)

sleep (8000)
_GDIPlus_GraphicsClear($hGraphic, 0xFF000000) ;<--- Está deletando todas as imagens da GUI também!!!!! Eu só queria deletar 1 imagem.
_GDIPlus_GraphicsDrawImageRect($hGraphic,$imagem,35,150,309,49)

while 1
sleep(100)
wend



 

@Pedro Pinheiro, para imagens PNG use a UDF do Jscript _GUICreateAlfa.au3.
Download da UDF + Exemplo Aqui: _GUICreateAlfa.au3
Ao testar declare a Variável $ghGDIPDll e pronto.
Tô usando ela para um projeto fica show de bola.
Para trabalhar GDI é bem chato, acho que tem que criar e se for mover tem que deletar para para criar em outra coordenada novamente.

 

 

Eu fiz isso. Deletar e criar outra, mas na hora de deletar uma, o script deleta todas imagens da gui.

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

 

 

0xFF000000

 

Galera, me perdoem mudar de calça pra sapato, mas alguém sabe me explicar o que é isso ou apenas dizer algo para que eu possa pesquisar a respeito. Vejo essas paradas em códigos de C e me parece ser referente à alocação na memória, mas não acho nada que explique o uso, como é feito, etc. De novo, me desculpem por essa resposta nada vê com o contexto.

Share this post


Link to post
Share on other sites

 

 

Galera, me perdoem mudar de calça pra sapato, mas alguém sabe me explicar o que é isso ou apenas dizer algo para que eu possa pesquisar a respeito. Vejo essas paradas em códigos de C e me parece ser referente à alocação na memória, mas não acho nada que explique o uso, como é feito, etc. De novo, me desculpem por essa resposta nada vê com o contexto.

 

 

São códigos para que o sistema identifique as cores:

 

 

White

RGB="#FFFFFF" Red

RGB="#FF0000" Green

RGB="#33ff33" Blue

RGB=#0000FF Magenta

RGB=#FF00FF Cyan

RGB=#00FFFF Black

RGB=#000000Y

Yellow

RGB=#FFFF00

 

 

Da uma pesquisa na net, existem tabelas de cores pra você entender melhor.

Share this post


Link to post
Share on other sites

 

São códigos para que o sistema identifique as cores:

 

 

White

RGB="#FFFFFF" Red

RGB="#FF0000" Green

RGB="#33ff33" Blue

RGB=#0000FF Magenta

RGB=#FF00FF Cyan

RGB=#00FFFF Black

RGB=#000000Y

Yellow

RGB=#FFFF00

 

 

Da uma pesquisa na net, existem tabelas de cores pra você entender melhor.

 

Brigadão, bro!

Share this post


Link to post
Share on other sites

Eu usei _GDIPlus_GraphicsClear($hGraphic, 0xFF000000), mas ele deleta todas as imagens da Gui também que não tem nada haver.

 

HnkRErO.gif

Desculpe chegar atrasado, mas vai a minha contribuição...

Para trabalhar com GDI+, é mais ou menos assim, você cria um background e um buffer.

Desenha tudo no buffer, e depois pinta o "buffer" no background.

Depois apaga o buffer

E desenha tudo de novo no buffer.

E imprime o buffer no background.

 

É uma carga de processamento bem grande, ainda mais se trabalhar com muitas imagens/elementos e como o AutoIt não processa diretamente por hardware, se colocar muitos elementos vai ficar lento mesmo.

Falo isso, pois não é uma boa ideia desenvolver um jogo diretamente em AutoIt, ele não foi feito pra isso.

 

Mas esse encher de coisas, depende também do seu computador.

 

Você disse que ele deleta tudo, sim, é isso mesmo.

Não tente programar um código para que ele não delete.

Programe um código que reconstrua todos os seus elementos nas posições que você deseja, e pinte novamente, assim dará certo.

Dessa forma, você conseguirá mover os elementos.

 

Trabalha com GDI+, é como pensar em desenvolver um jogo...

É necessário reconstruir a cena inteira a cada 15 mili-segundos para dar a impressão de movimento, aparecimento ou desaparecimento.

 

Acredito que trabalhar com animação no GuiCreate não seja uma boa ideia (pois ele não foi feito para isso, GuiCreate é para exibição de elementos estáticos).

Pense direto com tudo no GDI+, o GuiCreate serve apenas de base para criar a tela de GDI+.

Mas ai vem um grande trabalho, refazer tudo em GDI+ (construir tudo o que você quer ver em GDI+, sem usar nada dos controles de GuiCreate).

 

Ainda tem mais um detelhe: a interacão dos controles com o mouse, isso também terá de ser construído.

 

Com taclado, é mais fácil.

 

inté mais

Edited by Luigi

Share this post


Link to post
Share on other sites

Vou tentar dar uma pequena contribuição sobre GDI+.

 

Quando eu penso em construir qualquer coisa em GDI+, eu já tenho esse modelo pronto, segue:

#include-once
#include <Array.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
Opt("GUIEventOptions", 1)
Opt("MustDeclareVars", 1)

OnAutoItExitRegister("OnExit")

Global $hGui
Global $hGraphic, $hPen, $hBitmap, $hBackbuffer

Global $aBoard[8] = [10, 10, 800, 600]
$aBoard[4] = $aBoard[0]
$aBoard[5] = $aBoard[1]
$aBoard[6] = $aBoard[0] + $aBoard[2]
$aBoard[7] = $aBoard[1] + $aBoard[3]

Global $iUpdate = 15

$hGui = GUICreate("Titulo", 820, 620)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")


_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($aBoard[2], $aBoard[3], $hGraphic)
$hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

$hPen = _GDIPlus_PenCreate()
_GDIPlus_GraphicsClear($hBackbuffer)
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

GUISetState(@SW_SHOW, $hGui)

AdlibRegister("_update", $iUpdate)

While Sleep(10)

WEnd

Func _update()
	_GDIPlus_GraphicsClear($hBackbuffer, 0xF0FFFFFF)
	_box($hBackbuffer, 0, 0, 10, 10)
	_GDIPlus_GraphicsDrawLine($hBackbuffer, 10, 150, 390, 150, $hPen)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $aBoard[0], $aBoard[1], $aBoard[2], $aBoard[3])
EndFunc   ;==>_update

Func OnExit()
	_GDIPlus_PenDispose($hPen)
	_GDIPlus_GraphicsDispose($hBackbuffer)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_Shutdown()
EndFunc   ;==>OnExit

Func Quit()
	Exit
EndFunc   ;==>Quit

Func _box($hToGraphic, $xx, $yy, $ll, $aa, $color = 0xFF000000)
	Local $aBox[5][2]
	$aBox[0][0] = 4
	$aBox[1][0] = $xx
	$aBox[1][1] = $yy
	$aBox[2][0] = $xx + $ll - 1
	$aBox[2][1] = $yy
	$aBox[3][0] = $xx + $ll - 1
	$aBox[3][1] = $yy + $aa - 1
	$aBox[4][0] = $xx
	$aBox[4][1] = $yy + $aa - 1
	If $color Then
		_GDIPlus_PenSetColor($hPen, $color)
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox, $hPen)
	Else
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox)
	EndIf
EndFunc   ;==>_box

Agora, fiz uns comentários no exemplo acima, que talvez ajude a entender o que está acontecendo:

#include-once
#include <Array.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
Opt("GUIEventOptions", 1)
Opt("MustDeclareVars", 1)

OnAutoItExitRegister("OnExit")


; definição de variáveis
Global $hGui
; definição de variáveis: GDI+
Global $hGraphic, $hPen, $hBitmap, $hBackbuffer


; no $aBoard, eu faço uma pequena matemática, para criar um '_GDIPlus_BitmapCreateFromGraphics' 10 pixels menor do que o tamanho da janela
Global $aBoard[8] = [10, 10, 800, 600]
$aBoard[4] = $aBoard[0]
$aBoard[5] = $aBoard[1]
$aBoard[6] = $aBoard[0] + $aBoard[2]
$aBoard[7] = $aBoard[1] + $aBoard[3]

; define a cada quantos mili-segundos todo o GDI+ será renderizado novamente
; renderizado = re-construir todos os elementos novamente
Global $iUpdate = 15

$hGui = GUICreate("Titulo", 820, 620)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")

;inicio o GDI+
_GDIPlus_Startup()
;inicializo o GDI+
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
; defino o bitmap, em que posição (x, y) e em que janela (GuiCreate) este GDI+ será exibido
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($aBoard[2], $aBoard[3], $hGraphic)
; defino o buffer do bitmap
$hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

; crio uma 'pen' para poder desenhar alguma coisa
$hPen = _GDIPlus_PenCreate()

; limpo o buffer
_GDIPlus_GraphicsClear($hBackbuffer)
; defino o modo de suavização do buffer, veja o HELP do AutoIt e mude o segundo valor, para ver ser você observa mudanças
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

;~ Global $hImage = _GDIPlus_ImageLoadFromFile("UmaImagemQualquer.png")

; exibo o $hGui
GUISetState(@SW_SHOW, $hGui)

; inicializo o timer, para chamar o Update a cada 15 mili-segundos
AdlibRegister("Update", $iUpdate)

; loop
While Sleep(10)

WEnd


Func Update()
	; limpa o buffer e pinta da cor definina, sendo 0x[00][FF][FF][FF]
	;                                                 [00] vai de '00' até 'FF' (0-255) tranparência do background
	;                                                     [FF] cor vermelho
	;                                                         [FF] cor verde
	;                                                             [FF] cor azul
	; apaga o $hBackbuffer
	_GDIPlus_GraphicsClear($hBackbuffer, 0x00FFFFFF)
	
	; desenha uma box na posição (x,y) de largura 10, altura 10
	; desenha uma caixa no $hBackbuffer
	_box($hBackbuffer, 0, 0, 10, 10)
	
	; desenha uma linha no $hBackbuffer
	_GDIPlus_GraphicsDrawLine($hBackbuffer, 10, 150, 390, 150, $hPen)
	
	; pinta o $hImage no $hBackbuffer na posição (x, y) com (largura = 80, altura = 80)
	; se você mudar os valores de largura ou altura, você irá distorcer $hImage
	; se você quer fazer uma imagem se movimentar no GDI+, mexa com x, y
;~ 	_GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, 20, 20, 80, 80)


; se você quiser apenas pegar um pedaço da $hImage, e colar no $hBackbuffer com maior/menor tamanho, use o comando abaixo
; esta função não é muito fácil de entender, sugiro que você vá por tentativa e erro, até entender o que está acontecendo, mas use uma imagem pequena
;~ 	_GDIPlus_GraphicsDrawImageRectRect($hBackbuffer, $hImage, 0, 0, 280, 120, 98, 215, 280, 120)
	

	
	; pinta o $hBitmap no $hGraphic
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $aBoard[0], $aBoard[1], $aBoard[2], $aBoard[3])
EndFunc   ;==>Update

Func OnExit()
	AdlibUnRegister("Update")
	_GDIPlus_PenDispose($hPen)
	_GDIPlus_GraphicsDispose($hBackbuffer)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_Shutdown()
EndFunc   ;==>OnExit

Func Quit()
	Exit
EndFunc   ;==>Quit

Func _box($hToGraphic, $xx, $yy, $ll, $aa, $color = 0xFF000000)
	Local $aBox[5][2]
	$aBox[0][0] = 4
	$aBox[1][0] = $xx
	$aBox[1][1] = $yy
	$aBox[2][0] = $xx + $ll - 1
	$aBox[2][1] = $yy
	$aBox[3][0] = $xx + $ll - 1
	$aBox[3][1] = $yy + $aa - 1
	$aBox[4][0] = $xx
	$aBox[4][1] = $yy + $aa - 1
	If $color Then
		_GDIPlus_PenSetColor($hPen, $color)
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox, $hPen)
	Else
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox)
	EndIf
EndFunc   ;==>_box

Agora, meu caro colega de fórum, deixa eu te dizer algo que vale ouro!

O HELP do AutoIT quando fala de GDI+ é fantástico! É riquíssimo!

Se fosse um livro e tivesse um valor, acho que seria mais de R$ 1.000,00!

E você tem isso de graça!

 

Bem, voltando ao assunto...

 

Agora deixo alguns desafios para você:

 

a) use o exemplo acima, e faça o _box() se mover para cima, baixo, esquerda e direita;

 

B) use o exemplo acima, e limite o movimento do _box() para que ele não possa sair dos limites do GDI+

 

c) crie uma forma de variar suavemente a cor do background entre branco e preto, dando a impressão de dia/noite

 

d) carregue uma imagem qualquer (pequena por favor)

 

e) faça essa imagem carregada se mover pelo GDI+ com as setas

 

f) no GDI, tudo que é carregado/aberto, tem que ser descarregado/fechado, há algo no exemplo comentado que não foi descarregado/fechado, onde esta?

 

g) faça um _box() piscar a cada 300 mili segundos

 

h) faça um _box() variar de tamanho sozinho

Edited by Luigi
  • Like 4

Share this post


Link to post
Share on other sites

AAAH Mil desculpas, não conheço nenhum modo de acompanhar tópicos antigos, não aparece nenhuma notificação para mim...enfim. A tempos eu já resolvi esse problema, na verdade eu achei duas alternativas, as UDF's abaixo.

 

1º GIFAnimation.au3

 

2º GUICtrlPic.au3

 

 

As duas emulavam .PNG de forma que mantinha as imagens com seus backgrounds transparentes e assim com o "ControlMove" eu movimentava barra pela GUI. A GUICtrlPic.au3 foi mais eficiente, mas ela não emula Gif animado. A GIFanimation.au3 tinha um pequeno bug que as vezes apagava todos os elementos da gui.

Edited by Pedro Pinheiro
  • Like 1

Share this post


Link to post
Share on other sites

@Luigi tenho uma pasta só com seus exemplos aqui . :up:

 

Vou tentar dar uma pequena contribuição sobre GDI+.

 

Quando eu penso em construir qualquer coisa em GDI+, eu já tenho esse modelo pronto, segue:

#include-once
#include <Array.au3>
#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
Opt("GUIEventOptions", 1)
Opt("MustDeclareVars", 1)

OnAutoItExitRegister("OnExit")


; definição de variáveis
Global $hGui
; definição de variáveis: GDI+
Global $hGraphic, $hPen, $hBitmap, $hBackbuffer


; no $aBoard, eu faço uma pequena matemática, para criar um '_GDIPlus_BitmapCreateFromGraphics' 10 pixels menor do que o tamanho da janela
Global $aBoard[8] = [10, 10, 800, 600]
$aBoard[4] = $aBoard[0]
$aBoard[5] = $aBoard[1]
$aBoard[6] = $aBoard[0] + $aBoard[2]
$aBoard[7] = $aBoard[1] + $aBoard[3]

; define a cada quantos mili-segundos todo o GDI+ será renderizado novamente
; renderizado = re-construir todos os elementos novamente
Global $iUpdate = 15

$hGui = GUICreate("Titulo", 820, 620)
GUISetOnEvent($GUI_EVENT_CLOSE, "Quit")

;inicio o GDI+
_GDIPlus_Startup()
;inicializo o GDI+
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
; defino o bitmap, em que posição (x, y) e em que janela (GuiCreate) este GDI+ será exibido
$hBitmap = _GDIPlus_BitmapCreateFromGraphics($aBoard[2], $aBoard[3], $hGraphic)
; defino o buffer do bitmap
$hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

; crio uma 'pen' para poder desenhar alguma coisa
$hPen = _GDIPlus_PenCreate()

; limpo o buffer
_GDIPlus_GraphicsClear($hBackbuffer)
; defino o modo de suavização do buffer, veja o HELP do AutoIt e mude o segundo valor, para ver ser você observa mudanças
_GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

;~ Global $hImage = _GDIPlus_ImageLoadFromFile("UmaImagemQualquer.png")

; exibo o $hGui
GUISetState(@SW_SHOW, $hGui)

; inicializo o timer, para chamar o Update a cada 15 mili-segundos
AdlibRegister("Update", $iUpdate)

; loop
While Sleep(10)

WEnd


Func Update()
	; limpa o buffer e pinta da cor definina, sendo 0x[00][FF][FF][FF]
	;                                                 [00] vai de '00' até 'FF' (0-255) tranparência do background
	;                                                     [FF] cor vermelho
	;                                                         [FF] cor verde
	;                                                             [FF] cor azul
	; apaga o $hBackbuffer
	_GDIPlus_GraphicsClear($hBackbuffer, 0x00FFFFFF)
	
	; desenha uma box na posição (x,y) de largura 10, altura 10
	; desenha uma caixa no $hBackbuffer
	_box($hBackbuffer, 0, 0, 10, 10)
	
	; desenha uma linha no $hBackbuffer
	_GDIPlus_GraphicsDrawLine($hBackbuffer, 10, 150, 390, 150, $hPen)
	
	; pinta o $hImage no $hBackbuffer na posição (x, y) com (largura = 80, altura = 80)
	; se você mudar os valores de largura ou altura, você irá distorcer $hImage
	; se você quer fazer uma imagem se movimentar no GDI+, mexa com x, y
;~ 	_GDIPlus_GraphicsDrawImageRect($hBackbuffer, $hImage, 20, 20, 80, 80)


; se você quiser apenas pegar um pedaço da $hImage, e colar no $hBackbuffer com maior/menor tamanho, use o comando abaixo
; esta função não é muito fácil de entender, sugiro que você vá por tentativa e erro, até entender o que está acontecendo, mas use uma imagem pequena
;~ 	_GDIPlus_GraphicsDrawImageRectRect($hBackbuffer, $hImage, 0, 0, 280, 120, 98, 215, 280, 120)
	

	
	; pinta o $hBitmap no $hGraphic
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, $aBoard[0], $aBoard[1], $aBoard[2], $aBoard[3])
EndFunc   ;==>Update

Func OnExit()
	AdlibUnRegister("Update")
	_GDIPlus_PenDispose($hPen)
	_GDIPlus_GraphicsDispose($hBackbuffer)
	_GDIPlus_BitmapDispose($hBitmap)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_Shutdown()
EndFunc   ;==>OnExit

Func Quit()
	Exit
EndFunc   ;==>Quit

Func _box($hToGraphic, $xx, $yy, $ll, $aa, $color = 0xFF000000)
	Local $aBox[5][2]
	$aBox[0][0] = 4
	$aBox[1][0] = $xx
	$aBox[1][1] = $yy
	$aBox[2][0] = $xx + $ll - 1
	$aBox[2][1] = $yy
	$aBox[3][0] = $xx + $ll - 1
	$aBox[3][1] = $yy + $aa - 1
	$aBox[4][0] = $xx
	$aBox[4][1] = $yy + $aa - 1
	If $color Then
		_GDIPlus_PenSetColor($hPen, $color)
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox, $hPen)
	Else
		_GDIPlus_GraphicsDrawPolygon($hToGraphic, $aBox)
	EndIf
EndFunc   ;==>_box

Agora, meu caro colega de fórum, deixa eu te dizer algo que vale ouro!

O HELP do AutoIT quando fala de GDI+ é fantástico! É riquíssimo!

Se fosse um livro e tivesse um valor, acho que seria mais de R$ 1.000,00!

E você tem isso de graça!

 

Bem, voltando ao assunto...

 

Agora deixo alguns desafios para você:

 

a) use o exemplo acima, e faça o _box() se mover para cima, baixo, esquerda e direita;

 

B) use o exemplo acima, e limite o movimento do _box() para que ele não possa sair dos limites do GDI+

 

c) crie uma forma de variar suavemente a cor do background entre branco e preto, dando a impressão de dia/noite

 

d) carregue uma imagem qualquer (pequena por favor)

 

e) faça essa imagem carregada se mover pelo GDI+ com as setas

 

f) no GDI, tudo que é carregado/aberto, tem que ser descarregado/fechado, há algo no exemplo comentado que não foi descarregado/fechado, onde esta?

 

g) faça um _box() piscar a cada 300 mili segundos

 

h) faça um _box() variar de tamanho sozinho

 

 

É como eu digo atualmente... A experiência faz toda a diferença.

 

Tá guardado aqui e quando tiver tempo vou encarar o Desafio. :like_icon: ;)

Edited by Fábio iGames
  • Like 1

Share this post


Link to post
Share on other sites

Me sinto até mau em usar um UDF que faz tudo o que ele com paciência explicou ali em cima, mas vou ler o que você explicou, preciso modificar e converter imagens usando o Gdiplus. Valeu mesmo @Luigi

Edited by Pedro Pinheiro

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

Sign in to follow this  

×