| »Master |
| | 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 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&type=html&color=707070&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
| | |
| |
|