[GUIDA] Creare finestre arrotondate stile xBot, Dettagliata.

« Older   Newer »
  Share  
»Master
CAT_IMG Posted on 8/8/2011, 03:01     +3   +1   -1




Ciao :) allora, come m'ha chiesto hacktooth vi dimostro dettagliatamente come creare una GUI nello stesso stile di xBot e altri programmi miei:
PS: Ho dovuto fare due volte questa guida, la prima volta l'ho persa e l'ho dovuta rifare da capo... quindi se risulta un pò incompleta è a colpa di questo, asd

xBotSTAMP2



Prima si inseriscono i include necessari:
CODICE
#include<GUIConstantsEx.au3>
#include<WinAPI.au3>
#include<WindowsConstants.au3>

GUIConstantsEx.au3 e WindowsConstants.au3 contengono le costanti utilizzate nel settaggio di stili personalizzati della GUI e dei suoi relativi controlli (come Label, CheckBox, Input, eccettera.), mentre WinAPI.au3 contiene un paio di funzioni necessari alla applicazione dei bordi arrotondati alla GUI stessa.

Io personalmente consiglio utilizzare i eventi della GUI che richiamano funzioni precise anzichè mettere tutto dentro un loop con GUIGetMsg(), in quanto fa diventare il script molto più semplice e preciso.
quindi:
CODICE
Opt("GUIOnEventMode", 1)


Dichiariamo le variabili base della GUI, io consiglio farlo in quanto modificarne il suo aspetto dopo aver creato tutti i controlli fa diventare il tutto molto più semplice e efficiente.
CODICE
Global $GTitle="Esempio by »Master"
Global $GWidth=400, $GHeight=400, $BordSize=40
Global $GBkColor=0x303030, $GTxtColor=0xD0D0D0
Global $CInfo


Ora partiamo alla creazione della GUI:
CODICE
$GUI=GUICreate($GTitle, $GWidth, $GHeight, Default, Default, $WS_POPUPWINDOW)

Usiamo le variabili dichiarate anteriormente e usiamo lo stile $WS_POPUPWINDOW perché la GUI venga creare senza la standart barra di windows per il movimento, chiudere, minimizzare, eccettera.
PS: la keywork Default fa in modo che il parametro utilizzi il suo valore default (ovvio lol)

Siccome abbiamo impostato l'opzione di autoit per i eventi della GUI, impostiamo un handler di eventi per la chiusura della stessa:
CODICE
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

In fondo allo script, assieme alle future altre funzioni, definite la funzione _Exit():
CODICE
Func _Exit()
       Exit
EndFunc


Ora si imposta il colore di sfondo della GUI, definito nella variabile iniziale:
CODICE
GUISetBkColor($GBkColor)


Ora la parte più importante della guida, arrotondiamo i bordi:
CODICE
$hRgn=_WinAPI_CreateRoundRectRgn(1, 1, $GWidth-2, $GHeight-2, $BordSize, $BordSize)
_WinAPI_SetWindowRgn($GUI, $hRgn)

_WinAPI_CreateRoundRectRgn() crea un poligono con bordi arrotondati nei standart di windows, mentre _WinAPI_SetWindowRgn() imposta alla GUI quest'area del suddetto poligono
PS: Io consiglio usare sempre 1 pixel di spaziamento, così evitiamo alcuni dettagli grafici delle GUI standart di windows

Ora, creiamo dei controlli che rimpiazzano le principali funzioni della barra standart di windows tolta tramite lo stile $WS_POPUPWINDOW:
CODICE
$GUIBASIC_TITLE=GUICtrlCreateLabel($GTitle, 10, 5, $GWidth-50, 17)
GUICtrlSetOnEvent(-1, "_GMove")
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$GUIBASIC_MIN=GUICtrlCreateLabel("_", $GWidth-35, 5, 15, 20)
GUICtrlSetOnEvent(-1, "_GMin")
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 13)
$GUIBASIC_CLOSE=GUICtrlCreateLabel("X", $GWidth-20, 5, 20, 20)
GUICtrlSetOnEvent(-1, "_Exit")
GUICtrlSetColor(-1, 0xFF4444)
GUICtrlSetFont(-1, 13)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

In dettaglio:
Qualsiasi sia la dimensione della GUI (ovviamente non troppo piccola), i controlli basici si addateranno, questo perché si imposta la posizione X e la Width dei controlli a seconda della variabile $GWidth.
CODICE
GUICtrlSetOnEvent(-1, "_GMove")

Serve a impostare il handler in modo che quando si clicca col pulsante principale del mouse sul rispettivo controllo, viene richiamata la funzione, rispettivamente $GUIBASIC_TITLE a _GMove(), $GUIBASIC_CLOSE a _Exit() e $GUIBASIC_MIN a _GMin().
PS: Si possono impostare più handler a una stessa funzione, per esempio $GUI_EVENT_CLOSE e $GUIBASIC_CLOSE sono stati associati a _Exit().
CODICE
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

Servono a impostare rispettivamente i colori di sfondo e della scritta dei controlli.
$GUI_BKCOLOR_TRANSPARENT serve a impostare un colore trasparente al controllo, in modo che il colore di sfondo del controllo sia lo stesso colore di sfondo della GUI.
CODICE
GUICtrlSetFont(-1, 13)

Serve a impostare la misura della font in questo caso.

In fondo allo script, assieme alle altre funzioni, aggiungiamo le funzione registrate ai controlli creati:
CODICE
Func _GMove()
       AdlibRegister("_CGMove", 10)
       $CInfo=GUIGetCursorInfo($GUI)
EndFunc

Questa funzione viene richiamata sempre che si verifica un evento con il controllo $GUIBASIC_TITLE.
Una volta richiamata, registra tramite le ADLIB la funzione _CGMove(), in modo che essa sia richiamata ogni 10MS.
GUIGetCursorInfo() sarà spiegata dopo.

CODICE
Func _CGMove()
       $NCInfo=GUIGetCursorInfo($GUI)
       If Not $NCInfo[2] Then
               AdlibUnRegister("_CGMove")
               Return
       EndIf
       $MPos=MouseGetPos()
       If Not IsArray($CInfo) Or Not IsArray($MPos) Then Return
       WinMove($GUI, "", $MPos[0]-$CInfo[0], $MPos[1]-$CInfo[1])
EndFunc

Questa funzione serve a muovere la GUI.
In dettaglio:
CODICE
$NCInfo=GUIGetCursorInfo($GUI)

Questa funzione serve a specificare la situazione del mouse in relazione alla GUI, tramite una array. Nel nostro caso useremmo soltanto l'informazione contenente nell'elemento [2], che specifica se il pulsante principale del mouse è premuto o no.
CODICE
If Not $NCInfo[2] Then
       AdlibUnRegister("_CGMove")
       Return
EndIf

Questo passaggio serve a specificare se il pulsante principale del mouse è premuto o no, se non lo è, la funzione si de-registra dalle ADLIB e si interrompe tramite Return.
CODICE
$MPos=MouseGetPos()

Con questa funzione, otteniamo la posizione attuale del mouse.
CODICE
If Not IsArray($CInfo) Or Not IsArray($MPos) Then Return

In questo passaggio, verifichiamo che non ci sono stati problemi con le funzioni MouseGetPos() e GUIGetCursorInfo(). Se ci sono problemi la funzione si interrompe, evitando crash improvvisi. Dovete badare sempre quando lavorate con array. Spesso danno problemi del genere.
CODICE
WinMove($GUI, "", $MPos[0]-$CInfo[0], $MPos[1]-$CInfo[1])

Il passaggio principale: la GUI viene mossa in modo che il mouse rimanga sempre nella stessa posizione relativa alla GUI, mentre la GUI stessa si muove, come funziona normalmente quando spostiamo una finestra in windows. Ecco perché è importante dichiarare $CInfo globalmente. È una funzione che sarà usata in diverse funzioni ($CInfo ha il suo valore impostato nella funzione _GMove())


CODICE
Func _GMin()
       GUISetState(@SW_MINIMIZE, $GUI)
EndFunc

Questa funzione viene richiamata ogni volta che si verifica un evento con il controllo $GUIBASIC_MIN. Quindi GUISetState(@SW_MINIMIZE, $GUI) fa in modo che la $GUI venga minimizzata.

Ogni volta che create un controllo, eseguite le seguenti funzioni, in modo che il colore della font e del suo rispettivo sfondo siano i stessi dei altri controlli e della GUI:
CODICE
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

Il loro funzionamento l'ho spiegato sopra.

Ed ecco fatto, avete una GUI con bordi arrotondata fuori dal comune :)

Infine, ecco un piccolo esempio:
CODICE
#include<GUIConstantsEx.au3>
#include<WinAPI.au3>
#include<WindowsConstants.au3>
Opt("GUIOnEventMode", 1)

Global $GTitle="Esempio by »Master"
Global $GWidth=400, $GHeight=400, $BordSize=40
Global $GBkColor=0x303030, $GTxtColor=0xD0D0D0
Global $CInfo

$GUI=GUICreate($GTitle, $GWidth, $GHeight, Default, Default, $WS_POPUPWINDOW)

GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

GUISetBkColor($GBkColor)

$hRgn=_WinAPI_CreateRoundRectRgn(1, 1, $GWidth-2, $GHeight-2, $BordSize, $BordSize)
_WinAPI_SetWindowRgn($GUI, $hRgn)

$GUIBASIC_TITLE=GUICtrlCreateLabel($GTitle, 10, 5, $GWidth-50, 17)
GUICtrlSetOnEvent(-1, "_GMove")
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$GUIBASIC_MIN=GUICtrlCreateLabel("_", $GWidth-35, 5, 15, 20)
GUICtrlSetOnEvent(-1, "_GMin")
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
GUICtrlSetFont(-1, 13)
$GUIBASIC_CLOSE=GUICtrlCreateLabel("X", $GWidth-20, 5, 20, 20)
GUICtrlSetOnEvent(-1, "_Exit")
GUICtrlSetColor(-1, 0xFF4444)
GUICtrlSetFont(-1, 13)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

$GUI_BUTT1=GUICtrlCreateButton("Leggi feed RSS di AutoIt Fanclub", 10, 355, 380, 35)
GUICtrlSetOnEvent(-1, "_ReadRSS")

$GUI_EDIT1=GUICtrlCreateEdit("Esempio by »Master", 10, 40, 380, 310, Default, $WS_EX_LAYERED)
GUICtrlSetColor(-1, $GTxtColor)
GUICtrlSetBkColor(-1, $GBkColor)


GUISetState()

Do
       Sleep(100)
Until False

Func _ReadRSS()
       $Inet=InetGet("http://www.forumcommunity.net/rss.php?a=163532&amp;type=html&amp;color=707070&amp;n=15", @TempDir&"\AU3FC.rss", 1, 1)
       GUICtrlSetData($GUI_EDIT1, "Download iniziato...")
       Do
               Sleep(250)
               $InetInfo=InetGetInfo($Inet)
               If $InetInfo[1] Then GUICtrlSetData($GUI_EDIT1, "Scaricato "&Round(($InetInfo[0]/$InetInfo[1])/102.4)&"%")
       Until $InetInfo[2]=True
       GUICtrlSetData($GUI_EDIT1, FileRead(@TempDir&"\AU3FC.rss"))
EndFunc

Func _Exit()
       Exit
EndFunc

Func _GMove()
       AdlibRegister("_CGMove", 10)
       $CInfo=GUIGetCursorInfo($GUI)
EndFunc

Func _CGMove()
       $NCInfo=GUIGetCursorInfo($GUI)
       If Not $NCInfo[2] Then
               AdlibUnRegister("_CGMove")
               Return
       EndIf
       $MPos=MouseGetPos()
       If Not IsArray($CInfo) Or Not IsArray($MPos) Then Return
       WinMove($GUI, "", $MPos[0]-$CInfo[0], $MPos[1]-$CInfo[1])
EndFunc

Func _GMin()
       GUISetState(@SW_MINIMIZE, $GUI)
EndFunc


Edited by »Master - 8/8/2011, 04:55
 
Top
*Sym98*
CAT_IMG Posted on 8/8/2011, 07:48     +1   -1




Good work. ;)
Comunque, come hai fatto a perdere la prima guida? :lol:
 
Top
nico2960™
CAT_IMG Posted on 8/8/2011, 08:57     +1   -1




2 domande, da nabbo ovviamente ;)

1. a cosa serve la parte
CODICE
Do
      Sleep(100)
Until False

(è nell'esempio)

2. Non ho ancora capito totalmente a cosa serva ADLIB

Ottima guida comunque ;)
 
Top
*Sym98*
CAT_IMG Posted on 8/8/2011, 09:24     +1   -1




CITAZIONE (nico2960™ @ 8/8/2011, 09:57) 
2 domande, da nabbo ovviamente ;)

1. a cosa serve la parte
CODICE
Do
      Sleep(100)
Until False

(è nell'esempio)

Penso a non far sovraccaricare la CPU.

CITAZIONE (nico2960™ @ 8/8/2011, 09:57) 
2. Non ho ancora capito totalmente a cosa serva ADLIB

AdLibRegister?
Richiama una funzione ogni Tot millisecondi.
Viceversa, AdLibUnRegister smette di richiamare una funzione.

CODICE
Global $count = 0
Example()
AdlibRegister("Example", 2000)

While $count < 5
Sleep(2000)
If $count = 5 Then AdlibUnRegister("Example")
WEnd

Func Example()
$count = $count + 1
MsgBox(64,"", "Example " & $count, 1)
EndFunc
 
Top
ACIDBURN16
CAT_IMG Posted on 8/8/2011, 09:43     +1   -1




Utilissima guida, puo servire a tanti ;)
 
Top
nico2960™
CAT_IMG Posted on 8/8/2011, 09:47     +1   -1




CITAZIONE (*Sym98* @ 8/8/2011, 10:24) 
CITAZIONE (nico2960™ @ 8/8/2011, 09:57) 
2 domande, da nabbo ovviamente ;)

1. a cosa serve la parte
CODICE
Do
      Sleep(100)
Until False

(è nell'esempio)

Penso a non far sovraccaricare la CPU.

CITAZIONE (nico2960™ @ 8/8/2011, 09:57) 
2. Non ho ancora capito totalmente a cosa serva ADLIB

AdLibRegister?
Richiama una funzione ogni Tot millisecondi.
Viceversa, AdLibUnRegister smette di richiamare una funzione.

CODICE
Global $count = 0
Example()
AdlibRegister("Example", 2000)

While $count < 5
Sleep(2000)
If $count = 5 Then AdlibUnRegister("Example")
WEnd

Func Example()
$count = $count + 1
MsgBox(64,"", "Example " & $count, 1)
EndFunc

uhm... allora sono io che avevo capito altro ^^ grz della delucidazione
 
Top
*Sym98*
CAT_IMG Posted on 8/8/2011, 09:48     +1   -1




CITAZIONE (nico2960™ @ 8/8/2011, 10:47) 
uhm... allora sono io che avevo capito altro ^^ grz della delucidazione

Prego. ^_^
 
Top
CAT_IMG Posted on 8/8/2011, 11:20     +1   -1
Avatar

So creare belle gui

Group:
Member
Posts:
374
Reputazione:
0
Location:
C:\Windows\System32 \hacktooth.exe

Status:


Grande lavorone! :)
 
Top
»Master
CAT_IMG Posted on 8/8/2011, 17:35     +1   -1




grazie :)
CITAZIONE (*Sym98* @ 8/8/2011, 08:48) 
come hai fatto a perdere la prima guida? :lol:

beh ho perso metà della guida perché editavo sul forum proprio ed ho premuto ctrl-f5 (scite fa creare dei vizi lol)
 
Top
*Sym98*
CAT_IMG Posted on 8/8/2011, 17:46     +1   -1




CITAZIONE (»Master @ 8/8/2011, 18:35) 
beh ho perso metà della guida perché editavo sul forum proprio ed ho premuto ctrl-f5 (scite fa creare dei vizi lol)

Ahahah. :P
 
Top
9 replies since 8/8/2011, 03:01   490 views
  Share