Crearea unei interfete grafice personalizata

Daca va doriti o interfata mai deosebita pentru aplicatia dumneavoastra atunci acest tutorial o sa fie foarte util in acest sens.

 

In acest tutorial vom avea nevoie de functii WinAPI deci prima linie din codul sursa este:

 

#include <WinAPI.au3>

 

Urmatoarele linii vor constitui interfata grafica:

 

$hMain = GUICreateEx("Exemplu",300,250,-1,-1,"Background.bmp")
$hMinimize = GUICtrlCreatePic("Minimize.bmp",105,215,40,30)
$hClose = GUICtrlCreatePic("Close.bmp",155,215,40,30)
GUISetState(@SW_SHOW,$hMain)

La prima linie apelam functia GUICreateEx (despre care vom vorbi un pic mai jos) care creaza fereastra principala. Urmatoarele doua linii sunt controalele pentru butonul de minimizare (_) si inchidere (x). Ultima linie face vizibila fereastra principala.

Imaginile necesare pentru interfata le puteti descarca de aici.

 

Urmatoarele linii reprezinta bucla principala a programului:

 

While True
	Switch GUIGetMsg()
		Case $hMinimize
			GUISetState(@SW_MINIMIZE,$hMain)
		Case $hClose
			Exit
		Case -7	; Primary Down
			_SendMessage($hMain,0x0112,0xF012,0)
	EndSwitch
	Sleep(10)
WEnd

In bucla principala ne intereseaza 3 evenimente: minimizare, inchidere si primary down (butonul principal al mouseului apasat – sa miscam fereastra). In consecinta cand este apasat butonul de minimizare ($hMinimize) se seteaza starea ferestrei @SW_MINIMIZE; cand este apasat butonul de inchidere ($hClose) se inchide programul iar cand este interceptat mesajul Primary Down (valoarea -7) se apeleaza functia _SendMessage avand ca parametri: handle-ul ferestrei principale, mesajul WM_SYSCOMMAND (0x0112) si $SC_DRAGMOVE (0xF012).

 

Mai jos este partea cea mai importanta a tutorialului, functia care creaza interfata grafica:

 

Func GUICreateEx($sTitle,$iW,$iH,$iX=-1,$iY=-1,$sBackground="")
	Local $hGUI = GUICreate($sTitle,$iW,$iH,$iX,$iY,0x80000000)
	$hRegion1 = _WinAPI_CreateRoundRectRgn(0,0,100,$iH,10,10)
	$hRegion2 = _WinAPI_CreateRectRgn(99,40,200,$iH-40)
	$hRegion3 = _WinAPI_CreateRoundRectRgn(200,0,300,$iH,10,10)
	$hRegion4 = _WinAPI_CreateRoundRectRgn(105,5,195,35,5,5)
	$hRegion5 = _WinAPI_CreateRoundRectRgn(105,$iH-35,145,$iH-5,5,5)
	$hRegion6 = _WinAPI_CreateRoundRectRgn(155,$iH-35,195,$iH-5,5,5)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion2,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion3,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion4,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion5,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion6,2)
	_WinAPI_SetWindowRgn($hGUI,$hRegion1,True)
	If $sBackground Then
		$hPic = GUICtrlCreatePic($sBackground,0,0,$iW,$iH)
		GUICtrlSetState($hPic,128)
	EndIf
	Local $hTitle = GUICtrlCreateLabel($sTitle,106,9,87,20,0x01)
	GUICtrlSetFont($hTitle,12,700,0,"Garamond")
	GUICtrlSetBkColor($hTitle,0x008000)
	GUICtrlSetColor($hTitle,0x004040)
	Return $hGUI
EndFunc

In prima linie din corpul functiei se creaza o fereastra cu toate specificatiile pasate ca parametri si se poate observa stilul $WS_POPUP (0x80000000), folosit pentru ca nu ne intereseaza o fereastra cu o bara de titlu sau butoane sistem.

In urmatoarele linii cream 6 regiuni diferite care vor constitui interfata finala. Pentru acest lucru se folosesc functiile _WinAPI_CreateRectRgn si _WinAPI_CreateRoundRectRgn. Pentru a intelege mai bine partile care constituie interfata finala priviti imaginea de mai jos:

In urmatoarele linii de cod combinam (_WinAPI_CombineRgn) toate aceste regiuni intr-o singura regiune pe care o atribuim ferestrei (_WinAPI_SetWindowRgn) create pe prima linie.

Apoi se testeaza daca exista parametrul $sBackground, caz in care se creaza un control Pic si se seteaza o imagine de fundal. Controlul Pic care pastreaza imaginea de fundal se dezactiveaza pentru a nu se suprapune cu alte controale ($GUI_DISABLE = 128). Apoi se mai creaza un control Label care va constitui titlul ferestrei. La acesta se seteaza fontul, culoare de fundal si culoarea textului.

In final se returneaza handle-ul ferestrei create pentru a putea fi folosit in continuare.

 

Daca asamblati portiunile de cod de mai sus, obtineti scriptul:

 

#include <WinAPI.au3>	; Contine si SendMessage.au3
 
$hMain = GUICreateEx("Exemplu",300,250,-1,-1,"Background.bmp")
$hMinimize = GUICtrlCreatePic("Minimize.bmp",105,215,40,30)
$hClose = GUICtrlCreatePic("Close.bmp",155,215,40,30)
GUISetState(@SW_SHOW,$hMain)
 
While True
	Switch GUIGetMsg()
		Case $hMinimize
			GUISetState(@SW_MINIMIZE,$hMain)
		Case $hClose
			Exit
		Case -7	; Primary Down
			_SendMessage($hMain,0x0112,0xF012,0)
	EndSwitch
	Sleep(10)
WEnd
 
Func GUICreateEx($sTitle,$iW,$iH,$iX=-1,$iY=-1,$sBackground="")
	Local $hGUI = GUICreate($sTitle,$iW,$iH,$iX,$iY,0x80000000)
	$hRegion1 = _WinAPI_CreateRoundRectRgn(0,0,100,$iH,10,10)
	$hRegion2 = _WinAPI_CreateRectRgn(99,40,200,$iH-40)
	$hRegion3 = _WinAPI_CreateRoundRectRgn(200,0,300,$iH,10,10)
	$hRegion4 = _WinAPI_CreateRoundRectRgn(105,5,195,35,5,5)
	$hRegion5 = _WinAPI_CreateRoundRectRgn(105,$iH-35,145,$iH-5,5,5)
	$hRegion6 = _WinAPI_CreateRoundRectRgn(155,$iH-35,195,$iH-5,5,5)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion2,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion3,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion4,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion5,2)
	_WinAPI_CombineRgn($hRegion1,$hRegion1,$hRegion6,2)
	_WinAPI_SetWindowRgn($hGUI,$hRegion1,True)
	If $sBackground Then
		$hPic = GUICtrlCreatePic($sBackground,0,0,$iW,$iH)
		GUICtrlSetState($hPic,128)
	EndIf
	Local $hTitle = GUICtrlCreateLabel($sTitle,106,9,87,20,0x01)
	GUICtrlSetFont($hTitle,12,700,0,"Garamond")
	GUICtrlSetBkColor($hTitle,0x008000)
	GUICtrlSetColor($hTitle,0x004040)
	Return $hGUI
EndFunc

Daca rulati scriptul, interfata grafica o sa fie asemanatoare cu cea de mai jos:

Restul tine de imaginatie si de preferinte. Puteti sa creati forme noi (elipse, poligoane, etc), sa folositi culorile favorite, etc.

 

Scriptul, resursele si o versiune compilata puteti descarca de aici.


* Pentru orice intrebari sau nelamuriri legate de curs sau limbajul AutoIt accesati sectiunea AutoIt a forumului SkullBox sau platforma de suport tehnic NetHelp.