Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Ultimate Gui Tutorial ~By 4Ggr35510N


Rekomendowane odpowiedzi

Opublikowano

Witam! Na wstępie chciałabym zaznaczyć, że poniższy Tutorial będzie prowadzony niejako równolegle z Full Autoit Tutorial autorstwa Maćka - postaram się tutaj poruszyć kwestie, których on nie poruszył i (mam nadzieję) vice versa.

 

Link do tutorialu Maćka tutaj:

http://www.mpcforum.pl/topic/161158-tut-full-autoit-v3-tutorial/

 

Jeśli jeszcze go nie znacie, polecam jak najszybciej przejrzeć, ponieważ są tam podstawy, bez których ani rusz!

 

A więc zaczynamy!

 

Zaawansowane GUI

 

W Full Autoit Tutorialu możecie znaleźć podstawy pracy z KODĄ i tworzenia GUI.

 

Postaram się przybliżyć bardziej zaawansowane "tricki".

 

Będziemy pracować głównie w samym SCITE, na tym poziomie KODA będzie już praktycznie nieużywana.

 

Na początek:

 

 

 

GuiCtrlRead

 

 

 

GUICtrlRead ( numer_ID_elementu_gui )

 

Funkcja tak naprawdę ma dwa argumenty, jednak drugi jest opcjonalny i dotyczy ustawień zaawansowanych, więc nie będziemy się nim tutaj zajmować.

 

Co jest ważne, funkcja ta zwraca stan lub informacje o danym elemencie gui

 

Jeśli jako numer_ID_elementu podamy ID pola Input albo Edit - funkcja zwróci nam tekst w nich wpisany.

 

Jeśli checkbox albo radiobutton - funkcja zwróci jego stan (4 lub 1 odpowiednio dla odznaczonego i zaznaczonego).

 

Jeśli button lub label - tekst na nim napisany.

 

Jeśli listę, listview, treeview albo combox - aktualnie wybrany (podświetlony) element.

 

Spróbujemy więc na początek odczytać zawartość pola input.

 

Dla niezorientowanych przypomnę, że numer_ID_elementu uzyskujemy w momencie tworzenia elementu, jest to wartość zwracana przez każdą z funkcji GuiCtrlCreate

 

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$okno_GUI = GuiCreate("Ultimate Tutorial by 4gre5510n", 400, 300)	; głowne okno gui
$input = GuiCtrlCreateInput("", 150, 100, 100, 25)	; pole input w które możemy wpisać dowolną wartość
$button = GuiCtrlCreateButton("Przeczytaj wartość", 150, 150, 100, 35)	; button, po którym wyskoczy nam msg box
GuiSetState(@SW_SHOW) ; pokazujemy okno gui (domyślnie tworzone jest niewidoczne)

While True
Switch GuiGetMsg()
	Case $button
		$wartosc_pola_input = GUICtrlRead($input) ; odczytujemy informację podając numer id, zwracany w momencie tworzenia elementu gui
		MsgBox(0,"Wartosc pola input to:", $wartosc_pola_input) ; tworzymy message boxa z informacją o wartości w polu input
	Case $gui_event_close
		Exit	; standardowe wyjście z programu w momencie kliknięcia na [X]
EndSwitch
WEnd

 

Nasz program na razie nie robi zbyt dużo. Ot, wyświetla MsgBox'a po kliknięciu na przycisk. Ale już odczytuje informacje! A to pierwszy krok na długiej drodze do perfekcyjnego GUI!

 

 

 

GuiCtrlSetData

 

 

 

Następną funkcją, za którą się zabierzemy będzie GuiCtrlSetData.

 

Poprzednia pozwalała nam wczytać informacje z odpowiedniego elementu. Ta pozwoli nam wysłać dane DO elementu

 

GUICtrlSetData ( numer_ID_elementu_gui, wartosc_jaka_chcemy_wstawic_do_elementu )

 

Jak widać funkcja ma dwa argumenty (trzeci jest opcjonalny, na razie nie będziemy się nim zajmować).

 

W zasadzie wystarczy spojrzeć na moje powyższe tłumaczenie, aby w mig zrozumieć, o co chodzi :]

 

Użyjemy więc jej czym prędzej w naszym dotychczasowym skrypcie!

(dodane linie odpowiednio zaznaczyłem, reszta jest niezmieniona)

 

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$okno_GUI = GuiCreate("Ultimate Tutorial by 4gre5510n", 400, 300)	; głowne okno gui, domyślnie widoczne
;---------------------------
$label = GuiCtrlCreateLabel("", 0, 125, 400, 25) ; tworzymy label, czyli pole, w które możemy wpisać dowolny tekst
;---------------------------
$input = GuiCtrlCreateInput("", 150, 100, 100, 25)	; pole input w które możemy wpisać dowolną wartość
$button = GuiCtrlCreateButton("Przeczytaj wartość", 150, 150, 100, 35)	; button, po którym wyskoczy nam msg box

GuiSetState(@SW_SHOW) ; pokazujemy okno gui (domyślnie tworzone jest niewidoczne)

While True
Switch GuiGetMsg()
	Case $button
		$wartosc_pola_input = GUICtrlRead($input) ; odczytujemy informację podając numer id, zwracany w momencie tworzenia elementu gui
		;---------------------------
		GuiCtrlSetData($label, $wartosc_pola_input) ; wczytujemy do label'a zawartość wcześniejszej zmiennej (przechowującej wartość pola input)
		;---------------------------
	Case $gui_event_close
		Exit	; standardowe wyjście z programu w momencie kliknięcia na [X]
EndSwitch
WEnd

 

Jak widać (sugeruję od razu wklepać skrypt do autoita i uruchomić) jedyne co się zmieniło to to, że zamiast kłującego w oczy Message Boxa, teraz po kliknięciu przycisku bardzo estetycznie zmienia się wartość w label'u (domyślnie label jest pusty. Gdybyście chcieli, żeby od samego początku miał w sobie jakiś tekst, wystarczy odpowiednio zmienić funkcję odpowiedzialną za stworzenie labela:)

 

$label = GuiCtrlCreateLabel("Mój pierwszy program", 0, 125, 400, 25) ; tworzymy label, czyli pole, które domyślnie wyświetla tekst "Mój pierwszy program!"

 

Nie będę jeszcze raz wstawiał całego skryptu - dokonajcie tej zmiany sami!

 

Jak widać, po wciśnięciu buttona tekst od razu znika i na jego miejsce pojawia się nowy. Dzieje się tak dlatego, że funkcja GuiCtrlSetData nadpisuje całą informację

 

A co, jeśli chcielibyśmy tylko dodać do labela tekst z pola input, nie kasując przy tym aktualnie tam wpisanego?

 

Skoro funkcja GuiCtrlSetData zawsze nadpisuje... należy najpierw wczytać zawartość labela, DODAĆ do niej wartość pola input, i dopiero wysłac

 

W tym celu, musimy dwukrotnie użyć funkcji GuiCtrlRead - raz dla pola input i raz dla label'a.

 

Poniżej odpowiedni fragment kodu:

 

		$aktualny_tekst_w_labelu = GuiCtrlRead($label) ; wczytujemy do odpowiedniej zmiennej zawartość label'a
		$nowy_tekst_w_labelu = $aktualny_tekst_w_labelu & $wartosc_pola_input ; !ŁĄCZYMY! dwa łańcuchy w jeden używając znaku "&"
		GuiCtrlSetData($label, $nowy_tekst_w_labelu) ;wczytujemy do label'a połączone łańcuchy znaków

 

Jak widać, najpierw wczytaliśmy do odpowiedniej zmiennej tekst aktualnie znajdujący się w labelu, następnie do innej zmiennej wczytaliśmy wartość pola input, a później

 

POŁĄCZYLIŚMY oba łańcuchy znaków w jeden

 

To bardzo istotne!

 

Zarówno tekst w labelu, jak i tekst/wartość w polu input są traktowane jako [/b]łańcuch znaków[/b], z angielskiego string

 

Stringów :] (czyli łańcuchów znaków) nie możemy do siebie dodać zwykłym plusem "+" - za pomocą + możemy zsumować dwie liczby

 

Aby połączyć dwa łańcuchy znaków w jeden używamy znaku ampersand "&"

 

To jest niesamowicie ważne, że nawet jeśli w polu input albo labelu są same liczby, i tak są traktowane one jako łańcuch znaków!

 

Co z tego wynika i jak się przed tym ustrzec?

 

Czytajcie dalej!

 

 

 

Style GUI

 

 

 

Weżmiemy teraz na tapetę bardziej szczegółowo funkcje tworzenia elementów GUI, czyli wszystkie zaczynające się od GuiCtrlCreate

 

Na początek, ta najbardziej przydatna, bo umożliwiająca wprowadzanie danych do Waszych programów:

 

GUICtrlCreateInput ( "tekst_domyślny", odległość_od_lewej_strony_gui, odległość_od_szczytu_gui, szerokość, wysokość, styl_podstawowy, styl_rozszerzony)

 

Sporo tych argumentów, prawda? Pierwsze trzy są wam na pewno dobrze znane. Wszystkie następne, napisane kursywą, są opcjonalne (to znaczy, że nie muszą być podane, aby funkcja prawidłowo zadziałała). Jednak teraz przyjrzymy się im bardzo z bliska, zwłaszcza dwóm ostatnim, odpowiedzialnym za STYL pola input

 

Czym jest ten styl?

 

W Autoicie, styl GUI i jego elementów, jest to dodatkowa informacja dla programu, w jaki sposób dane elementy / okna gui mają być wyświetlane i w jaki sposób mają pracować.

 

Brzmi mrocznie? Bo takie jest :D Pełna lista stylów dostępna jest w w Autoitowym Helpie. Jest ich zdecydowanie zbyt dużo, aby omówić je wszystkie. Na bieżąco będę tylko przywoływał i tłumaczył kilka bardziej przydatnych.

 

Pierwszym stylem za jaki się zabierzemy, związany z wcześniej omawianym problemem różnicy między łańcuchem znaków a liczbą, będzie

 

$ES_NUMBER - W pola input z tym stylem, mogą być wprowadzone tylko cyfry

 

Spróbujmy więc stworzyć pole input z tym stylem. Poniżej zamieszczam kod razem z wcześniejszymi zmianami.

 

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>

$okno_GUI = GuiCreate("Ultimate Tutorial by 4gre5510n", 400, 300)	; głowne okno gui, domyślnie widoczne
;---------------------------
$label = GuiCtrlCreateLabel("", 0, 125, 400, 25) ; tworzymy label, czyli pole, w które możemy wpisać dowolny tekst
;---------------------------
$input = GuiCtrlCreateInput("", 150, 100, 100, 25, $ES_NUMBER)	; pole input w które możemy wpisać dowolną wartość
$button = GuiCtrlCreateButton("Przeczytaj wartość", 150, 150, 100, 35)	; button, po którym wyskoczy nam msg box

GuiSetState(@SW_SHOW) ; pokazujemy okno gui (domyślnie tworzone jest niewidoczne)

While True
Switch GuiGetMsg()
	Case $button
		$wartosc_pola_input = GUICtrlRead($input) ; odczytujemy informację podając numer id, zwracany w momencie tworzenia elementu gui
		;---------------------------
		$aktualny_tekst_w_labelu = GuiCtrlRead($label) ; wczytujemy do odpowiedniej zmiennej zawartość label'a
		$nowy_tekst_w_labelu = $aktualny_tekst_w_labelu & $wartosc_pola_input ; !ŁĄCZYMY! dwa łańcuchy w jeden
		GuiCtrlSetData($label, $nowy_tekst_w_labelu) ;wczytujemy do label'a połączone łańcuchy znaków
		;---------------------------
	Case $gui_event_close
		Exit	; standardowe wyjście z programu w momencie kliknięcia na [X]
EndSwitch
WEnd

 

Lecieć do SCITE'a i sprawdzić czy działa!

 

I jak, działa?

 

Oczywiście, że nie!

 

A dlaczego?

 

Jest to błąd trywialny, jednak bardzo często powielany.

 

Zapomnieliśmy o zadeklarowaniu odpowiedniej biblioteki!

 

Kiedy korzystamy z danego stylu, do funkcji tworzącej element gui dodajemy zmienną z informacją, jakiego stylu program ma użyć.

 

Jednak ta zmienna musi być gdzieś wcześniej zadeklarowana!

 

Style odpowiednich elementów są deklarowane w odpowiednich rozszerzeniach.

 

Dla stylów pól input potrzebne nam będzie dołączenie pliku "EditConstants.au3"

 

A więc śmigać do edytora i dołączyć na samej górze linijkę:

 

#include <EditConstants.au3>

 

Teraz wszystko śmiga? Akceptuje tylko liczby? Wybornie!

 

Pole input powinno teraz akceptować tylko liczby! Mamy więc gwarancję, że zawartością labela będą dane liczbowe. Ten fakt wykorzystamy później.

 

Na razie zostaniemy jeszcze chwilę przy stylach. Być może wam to nie przeszkadza, ale według mnie, nasz label z tekstem wygląda strasznie nieestateycznie.

 

Zaglądamy więc najpierw do funkcji tworzenia labela:

 

GUICtrlCreateLabel ("tekst_domyślny", odległość_od_lewej_strony_gui, odległość_od_szczytu_gui, szerokość, wysokość, styl_podstawowy, styl_rozszerzony)

 

Widzimy, że wygląda bardzo podobnie do tworzenia Input'a. W rzeczywistości, tworzenie każdego elementu gui wygląda prawie identycznie...

 

Bez zbędnych dumań, przebijamy się przez odpowiednie style labelów w poszukiwaniu czegoś interesującego...

 

Najbardziej kuszące będą dwa następujące:

 

$SS_CENTER - centruje nam tekst W POZIOMIE

$SS_CENTERIMAGE - centruje nam tekst W PIONIE

 

Żeby było ładnie i żeby nasz tekst znajdował się dokładnie na środku, wypadałoby używyć obydwu. Jak to zrobić?

 

Wbrew pozorom, NIE można wklepać pierwszego stylu jako podstawowy, a drugiego (SS_CENTERIMAGE) jako rozszerzony

 

Dlaczego?

 

Oba te style należą bowiem do styli podstawowych

 

Style podstawowe i style rozszerzone są ZUPEŁNIE RÓŻNE i POD ŻADNYM POZOREM nie należy ich mieszać

 

W Autoitowym Helpie znajdują się zupełnie różne tabele dla podstawowych i różne dla rozszerzonych stylów.

 

To bardzo ważne, żeby zarówno style podstawowe jak i rozszerzone wpisywać w odpowiednie miejsce (odpowiednio szósty i siódmy argument)

 

Obydwa powyższe style należą do PODSTAWOWYCH i jako takie, należy oba je wpisać jako argument szósty, odpowiedzialny za styl podstawowy

 

SPRÓBUJMY!

 

$label = GuiCtrlCreateLabel("", 0, 125, 400, 25, $SS_CENTER + $SS_CENTERIMAGE) ; tworzymy label, czyli pole, w które możemy wpisać dowolny tekst, wycentrowany w poziomie i pionie

 

Działa?

 

Nie, nie działa. Za cholerę, nawet nie ruszy. Wiecie już co jest źle?

 

Owszem, należy na początek dodać odpowiedni plik, w tym wypadku "StaticConstants.au3"

 

Ale nawet, po dodaniu linijki

#include <StaticConstants.au3>

 

...WCIĄŻ NIE DZIAŁA!

 

Dlaczego nie chce ruszyć? A to już temat na następny rozdział...

 

 

 

Używanie wielu stylów na raz,

czyli BitOR

 

 

 

W ostatniej części staraliśmy się stworzyć ładnie wycentrowany tekst, łącząc dwa style, $SS_CENTER i $SS_CENTERIMAGE.

 

Dodaliśmy nawet na początek linijkę dołączającą nam do programu odpowiedni plik, StaticConstants.au3, zawierający informacje o wartościach znajdującymi się pod zmiennymi $SS_CENTER i $SS_CENTERIMAGE...

 

No właśnie!

 

Deklarując style, używamy zmiennych. Pod tymi zmiennymi kryją się jednak pewne wartości, odpowiednie zapisane w plikach takich jak

StaticConstants.au3 czy

EditConstants.au3

 

Jednak czym są te wartośc?

 

Odpowiadam:

 

Nie są to liczby. Z tego też powodu NIE MOŻEMY ich po prostu do siebie dodać

 

Zasada z dodawaniem działała, na ten przykład, przy zwykłej funkcji MsgBox. Jak dowiedzieliście się z Full Tutorialu Maćka, pierwszy argument MsgBox, zawierał informacje o "fladze", czyli sposobu wyświetlania okienka.

 

Dodając odpowiednie wartości, zawarte w autoitowym helpie (czy samym poradniku Maćka), mogliśmy uzyskać różne przyciski i różne ikonki.

 

W przypadku stylów, ta zasada nie działa.

 

Wartości kryjące się bowiem pod zmiennymi stylów, są heksadecymalnym zapisem wartości bitowej

 

Ki diabeł? Wybaczcie, ale nie mam wolnego tygodnia, żeby to wtyłumaczyć :]

 

Ważne jest to, że aby zsumować dwie takie wartości, należy użyć funkcji BitOr

 

BitOR ( wartość_bitowa_1, wartość_bitowa_2, wartość_bitowa_3, wartość_bitowa_4, wartość bitowa_5......... i tak dalej, ile chcecie )

 

Jak widać, nie ma górnej granicy liczby argumentów. Muszą być PRZYNAJMNIEJ DWA, a później tyle, ile wam potrzeba.

 

Funkcja ta zwraca Sumę Logiczną używając Obrotu Bitowego.

 

Dwa linki dla chętnych:

http://pl.wikipedia.org/wiki/Alternatywa

http://pl.wikipedia.org/wiki/Obrót_bitowy

 

Oczywiście nie musicie wiedzieć, jaka jest dokładnie mechanika działania.

 

Ważne jest tylko to, że używamy jej, aby zastosować więcej niż jeden styl

 

I tak, odpowiednia linijka kodu będzie wyglądała następująco (dla czytelności wklejam znowu cały, z odpowiednim zaznaczeniem ważnej linii):

 

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>

$okno_GUI = GuiCreate("Ultimate Tutorial by 4gre5510n", 400, 300)	; głowne okno gui, domyślnie widoczne
;---------------------------
$label = GuiCtrlCreateLabel("", 0, 125, 400, 25, BitOr($SS_CENTER, $SS_CENTERIMAGE)) ;tworzymy label, czyli pole, w które możemy wpisać dowolny tekst, wycentrowany w poziomie i pionie
;---------------------------
$input = GuiCtrlCreateInput("", 150, 100, 100, 25, $ES_NUMBER)	; pole input w które możemy wpisać dowolną wartość
$button = GuiCtrlCreateButton("Przeczytaj wartość", 150, 150, 100, 35)	; button, po którym wyskoczy nam msg box

GuiSetState(@SW_SHOW) ; pokazujemy okno gui (domyślnie tworzone jest niewidoczne)

While True
Switch GuiGetMsg()
	Case $button
		$wartosc_pola_input = GUICtrlRead($input) ; odczytujemy informację podając numer id, zwracany w momencie tworzenia elementu gui
		$aktualny_tekst_w_labelu = GuiCtrlRead($label) ; wczytujemy do odpowiedniej zmiennej zawartość label'a
		$nowy_tekst_w_labelu = $aktualny_tekst_w_labelu & $wartosc_pola_input ; !ŁĄCZYMY! dwa łańcuchy w jeden
		GuiCtrlSetData($label, $nowy_tekst_w_labelu) ;
	Case $gui_event_close
		Exit	; standardowe wyjście z programu w momencie kliknięcia na [X]
EndSwitch
WEnd

 

Teraz już działa, hip hip hip hurra :D

 

Input akceptuje tylko cyfry, tekst w labelu jest przepięknie wycentrowany...

 

Lodzio miodzo...?

 

NIE!

 

 

 

Łańcuch znaków a liczba w Autoicie,

czyli Stringi a Intedżery

 

 

 

Wcześniej napisałem, że łańcuchy znaków, przed wysłaniem ich do label'a, należy połączyć.

 

Stosując styl $ES_NUMBER wydaje się, że rozwiązujemy ten problem...

 

OTÓŻ NIE!

 

Nawet jeśli wprowadzimy do Inputa same cyfry, Autoit i tak potraktuje je jako łańcuch znaków

 

Czy to znaczy, że nie będziemy na nich nigdy mogli liczyć?

 

I tutaj właśnie objawia się największe ułatwienie Autoita, jego CUDOWNA zdolność do mieszania róznych rzeczy tak, żeby wyszło wszystko ładnie :]

 

W klasycznych językach programowania, każda wartość, każda informacja, każdy strzępek danych musi mieć jasno i wyraźnie okerślony typ.

 

Do tych najbardziej znanych należą (i to zawsze warto znać, gdyż autoit pośrednio również na nich operuje):

 

Integer - [b]INT[/b] - całkowita wartość liczbowa
Floating Point - [b]FLOAT[/b] - wartość liczbowa zmiennoprzecinkowa (nie uciekajcie) to znaczy WSZYSTKIE dowolne ułamki
Łańcuch znaków - [b]STRING[/b] - czyli po prostu ciąg dowolnych znaków, liczb, liter czy czego tam jeszcze
Boolean - [b]BOOL[/b] - wartość Booleańska, czyli PRAWDA (reprezentowana przez 1) albo FAŁSZ (reprezentowane przez 0)

I teraz cudowne ułatwienie autoita
Wariant - [b]VARIANT[/b] - czyli... wszytko razem i do kupy. Naprwadę!

 

Autoit korzysta ze swojego własnego typu danych zwanych wariantem. Wariant może przechowywać wszystkie informacje, zarówno liczby całkowite, ułamki, łańcuch znaków (czyli literki :P) oraz wartości prawdy i fałszu...

 

Jego cudowną zdolnością jest sprytne dostosowywanie typu do własnych potrzeb.

 

Jeśli więc chcielibyśmy pomnożyć dwie zmienne, które teoretycznie zadeklarowane są jako łańcuch znaków (świadczy o tym wzięcie ich w cudzysłów):

 

$zmienna_jeden = "15"
$zmienna_dwa = "2"
$wynik = $zmienna_jeden * $zmienna_dwa
MsgBox(0,"Wynik mnożenia to:", $wynik)

 

Autoit w lot przekonweruje je na liczby i z powodzeniem przeprowadzi operację mnożenia.

 

Więc my nie musimy się głowić nad deklarowaniem odpowiednich typów zmiennych, wszystkie są wariantami i są kownertowane w lot na chwilowo potrzebne.

 

Ale ale... zaczynają się w którymś momencie schody, prawda?

 

Weźmy powyższy kod i zamieńmy pierwszą wartość na słowo "agresja"

 

$zmienna_jeden = "agresja"
$zmienna_dwa = "2"
$wynik = $zmienna_jeden * $zmienna_dwa
MsgBox(0,"Wynik mnożenia to:", $wynik)

 

Co wyświetli Message Box?

 

Niestety, nie ma cudów: 0

 

Jeśli spróbujemy przeprowadzić operację liczbową (mnożenie, dodawanie, dzielenie i tak dalej) na zmiennej, która jest łańcuchem znaków, przyjmie ona wartość zero!

 

Dlatego tak ważnym było zastosowanie stylu ES_NUMBER do pola input. Z nim możemy być pewni, że zmienne - choć wciąż łańcuchy znaków - zawierają TYLKO liczby,

i w odpowiednim momencie przez autoita na same liczby zostaną przekonwertowane, aby bezbłędnie przeprowadzić operacje liczbowe

 

Skoro jesteśmy już przy tych wszystkich typch, weźmy pod lupkę jeszcze wartości PRAWDY i FAŁSZU, w Autoicie odpowiednio

TRUE

FALSE

 

Zastosowanie jest już bardziej intuicyjne :D

 

 

If True Then
MsgBox(0,"Prawda", "Więc wyświetlam")
EndIf

If False Then
MsgBox(0,"Fałsz", "Więc NIGDY nie zobaczysz tego okna")
EndIf

If NOT False Then
MsgBox(0,"Jeśli NIE FAŁSZ", "Podwójne przeczenie i wyższa szkoła jazdy" & @LF & "W każdym razie, wyświetlam :P")
EndIf

If 1 Then
MsgBox(0,"Jak wyżej", "1 symbolizuje PRAWDĘ (i na odwrót)")
EndIf

If 0 Then
MsgBox(0,"Tego już nie zobaczysz", "0 symbolizuje FAŁSZ (i na odwrót)")
EndIf

If NOT 0 Then
MsgBox(0,"Jak wyżej", "0 symbolizuje fałsz, mamy podwójne przeczenie, więc okno zobaczysz:]")
EndIf

; A teraz czas na działanka!

$zmienna_dodawanie = True + True + True + True
MsgBox(0,"Wynik dodawania to:",$zmienna_dodawanie) ; może was to nie zaskoczy, może tak :] Jak pisałem TRUE jest w Autoicie stosowane zamienne z "1"

$zmienna_mnozenie = 15 * 22 * False
MsgBox(0,"Wynik mnożenia to:", $zmienna_mnozenie) ; to już nie powinno was zaskoczyć :]

 

 

Co mogę powiedzieć? :] Programowanie to nie łatwizna. Z początku na pewno będziecie się czuć przytłoczeni, jednak cały czas na bieżąco będę wspominał o tym wsyzstkim, co, jak i dlaczego...

 

Póki co, odpalcie powyższy kod i sprawdźcie które okienka wyskakują, a które nie.

 

Postarajcie się jak najwięcej zapamiętać, jednak nie irytujcie, jak coś wam nie wyjdzie.

 

To jest przytłaczająca ilość materiału i trochę wam zajmie swobodne posługiwanie się nim :]

 

W kolejnej części znowu wrócimy do GUI, a mianowicie obsługi dodatkowych elementów z opcjami (osobnego okna i wysuwającego się paska)

 

 

 

GuiOnEventMode

 

Bam!, na początek trochę stałych:

 

 

Global Const $GUI_EVENT_CLOSE = -3
Global Const $GUI_EVENT_MINIMIZE = -4
Global Const $GUI_EVENT_RESTORE = -5
Global Const $GUI_EVENT_MAXIMIZE = -6
Global Const $GUI_EVENT_PRIMARYDOWN = -7
Global Const $GUI_EVENT_PRIMARYUP = -8
Global Const $GUI_EVENT_SECONDARYDOWN = -9
Global Const $GUI_EVENT_SECONDARYUP = -10
Global Const $GUI_EVENT_MOUSEMOVE = -11
Global Const $GUI_EVENT_RESIZED = -12
Global Const $GUI_EVENT_DROPPED = -13

 

 

Możecie już o nich zapomnieć :]

 

Pytanie brzmi:

Czym jest GuiOnEventMode?

 

Jest innym sposobem komunikacji między samym programem a użytkownikiem.

 

Kiedy użytkownik klika jakiś przycisk - button, [X], czy nawet rusza myszką - zostaje przesłana o tym informacja do naszej aplikacji.

 

Do tej pory odbieraliśmy te akcję poprzez główną pętlę i funkcje GuiGetMsg()

 

Po wybraniu opcji GuiSetOnEventMode -> GuiGetMsg będzie zawsze zwracać zero.

 

Reagować na każde wydarzenia będziemy w oddzielnych funkcjach.

 

Jest to 50% na skali bycia PR[] GUI-Creator'em :]

 

100% to korzystanie z GuiRegisterMsg, w szczególności do kodów WM_NOTIFY, WM_COMMAND, WM... Ale o tym już zupełnie innym razem...

 

Wróćmy do GuiOnEventMode.

 

Przede wszystkim należałoby aplikację poinformować, że chcemy odbierać sygnały od użytkownika w zupełnie inny sposób. Robimy to poprzez funkcję

Opt

przyjmującej dwa argumenty -> nazwę opcji oraz wartość opcji. U nas będzie to:

 

Opt('GUIOnEventMode', 1)

 

I gotowe. Możemy zacząć deklarować osobne funkcje dla każdego wydarzenia :]

 

Żeby to zrobić korzystamy głównie z funkcji

 

GuiSetOnEvent ( specjalne ID wydarzenia , "nazwa funkcji jako string", winhandle do naszego gui )

 

GuiCtrlSetOnEvent ( lokalne ID elementu GUI, "nazwa funkcji jako string" )

 

Są bardzo podobne i proszę o szczególną uwagę przy ich wykorzystywaniu.

 

Za pomocą pierwszej zadeklarujemy funkcję mającą się wywołać po zdarzeniu globalnym - takim jak naciśnięcie [X] czy buttonu zminimalizowania, natomiast za pomocą GuiCtrlSetOnEvent deklarujemy funkcję mające się wydarzyć, po naciśnięciu na konkretne elementy GUI, takie jak buttony.

 

Zwróćcie również uwagę na fakt, że w przypadku deklarowaniu globalnych zdarzeń - podajemy jeszcze winhandle do naszego okna gui (co prawda argument teoretycznie opcjonalny, ale ja nalegam na jego wypełnianie każdorazowo :]).

 

A więc tworzymy i odpalamy bardzo prosty kodzik:

 

Opt('GUIOnEv...

 

A, momencik!

 

Co uzupełnić w pierwym atrybucie funkcji Gui*SetOnEvent?

 

Cóż, w przypadku GuiCtrlSetOnEvent -> będzie to id elementu GUI, więc po prostu zmienna, która została zwrócona z funkcji GuiCtrlCreate*.

 

Natomiast w przypadku GuiSetOnEvent deklarujemy zdarzenia globalne ( globalne w skali jednego okna :P ), więc potrzebujemy specjalnych ID...

 

I tu wracamy do grupy stałych z początku tej lekcji.

 

Opis każdej stałej znajdziemy w artykule GuiSetOnEvent -> są jednak bardzo intuicyjne.

 

Dlaczego jest wkleiłem i warto je znać? Cóż, to oczywiste...

Nie będziemy się bawić przecież w jakieś głupie zmienne, kiedy możemy od razu zaserwować wartość liczbową, prawda? ;] :pro:

 

A więc tworzymy już właściwy kodzik:

 

;============================;
  Opt('GUIOnEventMode', 1)
;============================;

$hGUI = GUICreate('4ggr35510n Tutorial', 500, 300) ; tworzymy gui

GUISetOnEvent(-4, '___na_zminimalizowanie', $hGUI) ; deklarujemy funkcje na specjalne wydarzenia globalne
GUISetOnEvent(-3, '___na_zamkniecie', $hGUI) ; to ważne, żeby w trzecim argumencie podać handle do okna gui (może jeszcze nie teraz, ale już bardzo niedługo)

$hButton = GUICtrlCreateButton('Kliknij mnie', 340, 255, 150, 35)

GUICtrlSetOnEvent($hButton, '___na_hButton') ; deklarujemy funkcję wykonującą się po kliknięciu buttona
										 ; zwracamy uwagę na wykorzystywanie funkcji __Gui__CTRL__SetOnEvent
										 ; wielu robi błędy :]

GUISetState() ; pojawiamy gui

Do
ConsoleWrite(GUIGetMsg()) ; wypisujemy GuiGetMsg(), żeby pokazać, że __naprawdę__ zwraca zero
Until False

Exit MsgBox(0, '', 'Nigdy mnie nie zobaczysz.')



; Funkcje OnEvent ;===========>
#region Funkcje OnEvent

Func ___na_zamkniecie()
If MsgBox(4, 'Wyjście', 'Czy na pewno chcesz wyjść? ') = 6 Then _
	Exit
EndFunc

Func ___na_zminimalizowanie()
; Niedoczekanie!
; Nic się nie stanie i nic się nia ma stać - nasz program będzie __nieminimalizowalny__!
Return 1
EndFunc

Func ___na_hButton()
MsgBox(0, '', 'Kliknąłeś hButton!')
EndFunc

#endregion
; ;<========= Funkcje OnEvent

 

Śmiga? Śmiga.

 

Coś wartego zauważenia?

 

Oczywiście - program minimalizuje się bez względu na to co umieścimy w tej funkcji.

 

Żeby faktycznie zablokować proces minimalizacji... cóż, to jest bardzo dużo zachodu, ale wrócimy do tego przy okazji GuiRegisterMsg...

 

 

 

 

 

 

 

Tutorial w całości mojego autorstwa

Specjalnie dla MPC Forum

Rozpowszechnianie: Dozwolone, przy pełnym uznaniu autorstwa.

Ta sygnatura jest pusta.

  • Odpowiedzi 50
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

No, fajnie że ktoś chce mi pomóc ale nie wbija mi się w temat. Ładnie, a co do kwestii - to zaklepuję sobie cały include IE.au3 i ScreenCapture.au3 bo już zacząłem pisać, resztę tematów tutoriali możemy uzgadniać na PW żeby nie było powtórek.

[TUT] Full Autoit V3 Tutorial

yo po 1 nie kayloger tylko bot który zapamiętuje hasła -_-

stop1.png

Opublikowano

O to odpowiedź na zadanie domowe.:rolleyes:

 

$Button1 = GUICtrlCreateButton("Button1", 96, 40, 81, 73, $BS_BOTTOM) 

 

BOTTOM-Po angielsku znaczy:dno,zad,dół,spód (dla wtajemniczonych :P)

  • 2 tygodnie później...
Opublikowano

No fajnie by było jakby został podpięty, ale na razie trochę mi szkoda prosić, bo jest dopiero w powijakach :]

 

Znajdę trochę czasu to go jeszcze rozwinę ;]

Ta sygnatura jest pusta.

Opublikowano

Umiecie pisać mniej niż 50 znaków :)? ( mój post UP)

 

Oczywiście jak 4gr bd kontynuowała tut to i tak wszystkie posty zostaną usunięte

Opublikowano

Teraz jak już Maciek nie pisze swojego Tutka, to można by (za jego zgodą) złączyć Tutki w całość, żeby było wszystko w jednym miejscu, a nie w kilku częściach :P

  • 3 tygodnie później...
Opublikowano

Ja odświeże i przy okazji zacytuje

 

"

 

 

Dalsza część tutoriala - już jutro!

 

 

 

Tutorial w całości mojego autorstwa

Specjalnie dla MPC Forum

Rozpowszechnianie: Dozwolone, przy pełnym uznaniu autorstwa.

 

 

Użytkownik 4ggr35510n edytował ten post 02 wrzesień 2010 - 05:09 ]"

 

Oczywiście pytam sie kiedy kontynuacja tego tut'a , ładnie się zapowiada ale niestety gui to najprostsza rzecz w autoit i spodziewałem się czegoś więcej

Opublikowano
gui to najprostsza rzecz w autoit

 

No no no, absolutnie się z tobą nie zgodzę :]

 

Czego więcej byś się spodziewał?

 

A kolejna część będzie duuuuża, ale brakuje mi na razie i czasu i chęci :]

Ta sygnatura jest pusta.

Opublikowano

Niemcy zrobili HackShielda na priv-servery. Nie ma co się rozpisywać, download:

 

 

http://www.e-owned.tk/metin2-hack-shield-beta/

 

 

 

Jak ktos nie wierzy - skan:

 

 

http://www.nobrain.dk/metin2-hack-shield-beta-scanning-12341123/

 

 

 

 

 

Zapraszam tez na: www.adriank.pl !!!

 

hehehe

 

zart.jpg

 

Na szczęście nie musiałem korzystać z Menagera ;] Ma się tego avasta :P

 

Report.

czwartkowy posmak w ustach przypomina
że nie ma sensu owijać w bawełnę
zmarzniętego truchła

przez latarnię ktoś przerzucił sznur
cumuje statek w bezpieczną przystań

czuję jak na skroniach zasycha sól
...

  • 2 miesiące temu...
Opublikowano

zmienne i globale to kto inny moze napisac np ja, ale guiregistermsg nie bardzo wiec to jest lepszy pomysl:d

Do
$wiek+=1
Until ŻycieGetMsg() = -3

zbieram +

Opublikowano

No, właśnie :D Podziel się wiedzą ^^ Ja już trochę zacząłem tą funkcję, ale przyda się jakiś tutek który rozwieje wszystkie niepewności :)

Opublikowano

Może... Bardzo może... :]

 

A jakie niepewności masz?

 

 

 

 

@MODERATORZE:

 

Proszę, zmień tytuł tematu na

 

Ultimate GUI Tutorial ~By 4ggr35510n

 

Raczej nie będzie już za bardzo rozwijany, a samo 'ultimate' jest jednak zdecydowanie zbyt na wyrost :}

 

+ własnie zauważyłem literówkę we własnym nicku :facepalm:

Ta sygnatura jest pusta.

Opublikowano

aha..:PP a możecie podać linka czy cuś w tym stylu może być za sms'a tam do 3zl xDD zeby było coś więcej na temat autoIT spodobał mi sie ten język bo c++ trudne zaawansowane nie mam "weny" xDD bo podstawy ogarnołem:PP będą +:D

 

@edit skąd wy sie uczyliście autoIT tuty czy samouki??

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...