arrowHome Tuesday, 07 September 2010  



 
Google
Web winapi.org
Main Menu
Home
News
FAQ
Links
Download
Kontakt
FORUM

Artykuły
Podstawy
GDI i Multimedia
Kontrolki
inne
Winapi + asm
WinSock
Soft
Login Form
Login

Hasło

Zapamiętaj mnie
Nie pamiętasz hasła?
Nie masz konta? Załóż je sobie
Okna dialogowe part I Drukuj E-mail
Oceny: / 106
KiepskiBardzo dobry 
Nadesłał Dawid Węgrzyn (xantos)   
Saturday, 21 February 2004

Wstęp

Witam wszystkich zainteresowanych. Artykuł ten miał się ukazać już dawno, ale sprawy się skomplikowały i artykuł pojawił się z "drobnym" poślizgiem. Na wstępie dodam, że jest to mój pierwszy "wykład" na temat programowania i liczę na Wasza wyrozumiałość oraz tolerancję. Jeżeli po przeczytaniu będziesz miał wątpliwości i jakieś pytania chętnie na nie odpowiem (adres kontaktowy: ). To tyle tytułem wstępu, teraz przechodzimy do konkretów, a więc zapiąć pasy odpalić szare komórki i hey'a.

Okno dialogowe

Okno dialogowe służy głownie do pobierania dodatkowych informacji od użytkownika. W menu różnych aplikacji bardzo często, choć nie zawsze, można spotkać w nazwie trzy kropki np.: "Open File..."- wtedy wiem już, że będziemy mieć do czynienia z oknem dialogowym. Okno dialogowe podobnie jak główne okno aplikacji może mieć tytuł, przyciski, kontrolki itp. Obsługa okien dialogowych jest częściowa prostsza, nie musimy się martwic focusem (przeskakiwaniem klawiszem TAB) danej kontrolki - wszystko za nas zrobi Windows.

Podział okien dialogowych

Okna dialogowe możemy podzielić na dwa typy. Pierwszy typ to okna dialogowe modalne. Gdy program otworzy taki typ okna, to użytkownik nie przełączy się na inne (w tym programie), dopóki nie wyłączy okna przyciskiem 'ok.' lub 'anuluj'. Wyjątek stanowią tutaj okna systemowe, które nie pozwalają zrobić nic w Windows dopóki okna się nie zamknie. Drugi typ to okna dialogowe niemodalne. Są one stosowane znacznie rzadziej niż okna modalne. W oknach tego typu możemy przechodzić do innych okiem dialogowych i innych programów.

Bardzo ogólnie o plikach zasobów

Choć okna dialogowe najczęściej spotykamy w menu danych aplikacji, to można również zbudować program oparty wyłącznie na samym oknie dialogowym. Zanim zaczniemy pisanie, wyjaśnię jeszcze kilka pojęć - między innymi, co to są zasoby użytkownika (tzw. pliki resources). Do utworzenia okna dialogowego potrzebny jest nam właśnie plik zasobów, w którym znajdują się ikony, bitmapy, menu oraz okna dialogowe, które po kompilacji znajdują się w pliku wykonywalnym exe. Przed stworzeniem pliku resources tworzymy nowy projekt i wybieramy New -> Resource Script oraz nadajemy dowolną nazwę. W projekcie pojawiła się nam nowa zakładka resource's oraz dwa nowe pliki "nazwa_zasobu".rc oraz resources.h. Teraz zajmiemy się "budowaniem" okna dialogowego i dołączaniem go do kodu. Wybieramy z menu polecenie Insert -> Resources -> Dialog, następnie edytujemy plik "nazwa_zasobu".rc i "budujemy" okienko z dostępnych narzędzi. Na potrzeby tego artykułu stworzymy okno z dwoma przyciskami oraz polem static.

Pierwsza aplikacja na oknie dialogowym

Teraz, kiedy mam już gotowe okno dialogowe, napiszemy krótki program wyświetlający informacje. Komentarze do kodu zamieszczam na końcu listingu.

Listing 1.1 // DialogBox //

BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
return DialogBox ( hInstance, TEXT("IDD_DIALOG"), NULL, DialogProc );
}

BOOL CALLBACK DialogProc ( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch ( message )
{
case WM_INITDIALOG:
return true;

case WM_COMMAND:
switch ( LOWORD(wParam))
{
case IDOK:
case IDCANCEL:
EndDialog( hDlg, 0);
return true;
}
break;
}
return false;
}

Teraz małe objaśnienia, co do kodu. Procedura okna dialogowego, ( DialogProc) musi zwracać wartość boolowską. Parametry, jakie przyjmuje, pozostawiam bez komentarza, wszystko powinno być jasne. Teraz największy szok dla niewtajemniczonych J. Pewnie zadajecie sobie pytanie, gdzie się podziała rejestracja klasy okna itp. Otóż, jak widać, nie ma jej - wszystko w funkcji WinMain przekazywane jest do funkcji DialogBox, która jako pierwszy parametr przyjmuje hInstance (uchwyt realizacji). Drugi parametr jest chyba najważniejszy, bo dzięki niemu jest identyfikowane nasze okno dialogowe. ID okna dialogowego w funkcji DialogBox musi być identyczne jak ID, które przypisaliśmy podczas tworzenia okna. ID zmieniasz klikając prawym przyciskiem myszy w " kreatorze budowania" okna dialogowego, domyślnie ustawione jest na "IDD_DIALOG1". Jeżeli nazwa okna dialogowego (ID) będzie postaci numerycznej to należy użyć makra MAKEINTRESOURCE np.: DialogBox(hInstance, MAKEINTRESOURCE(nasze_id), NULL, DialogProc), mówiąc krótko makra MAKEINTRESOURCE używamy wtedy, gdy ID nie jest w cudzysłowie. Trzeci parametr to uchwyt okna. Ostatnim parametrem jest wskaźnik do procedury okna dialogowego. W procedurze okna dialogowego znajduje się komunikat WM_INITDIALOG - ustawia on focus na pierwszą kontrolkę w oknie dialogowym alternatywnie można użyć funkcji SetFocus. LOWORD (wParam) zawiera identyfikator kontrolki, z którą związany jest komunikat ( w naszym przypadku kontrolki 'OK' i 'CANCEL' z identyfikatorami IDOK i IDCANCEL)

W naszym programie, kliknięcie któregokolwiek przycisku w dialogu powoduje wydołanie funkcji EndDialog. Funkcja przyjmuje jako pierwszy parametr uchwyt okna dialogowego, natomiast jako drugi jest wartością zwracaną przez funkcje DalogBox.

Podpinanie okna dialogowego pod menu

Teraz, kiedy już wiemy jak zbudować okno dialogowe zajmiemy się jego podpinaniem pod menu. Zaczniemy od razu od przykładu. Tworzymy nowy projekt tak samo jak w powyższym przykładzie i rejestrujemy klasę okna tak jakbyśmy robili aplikacje typu SDI. Na początku tworzymy własne menu, zatem przechodzimy do zakładki Insert -> Resource i wybieramy 'menu'. W tym artykule nie będę opisywał jak tworzy się menu (niebawem powstanie odpowiedni artykuł). Kiedy menu jest już gotowe to tworzymy dialgobox'a identycznie jak w pierwszym przykładzie. Zajmiemy się teraz obsługą menu w procedurze WndProc.

LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
swtch(message)
{
case WM_CREATE:
hInstance = ((LPCREATESTRUCT)lParam) -> hInstace;
return 0;

case WM_COMMAND:
hMenu = GetMenu(hWnd);

switch(LOWORD(wParam))
{
case IDM_DIALOG:
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWnd, DialogProc);
return 0;

case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0);
retrun 0;
}

//...dalsze instrukcje funkcji WndProc ...//

}

W komunikacie WM_CREATE pobieramy uchwyt realizacji do zmiennej hInstance, natomiast WM_COMMAND pobieramy na początku uchwyt naszego menu za pomocą funkcji GetMenu(hWnd). W instrukcji switch( LOWORD(lParam) ) obsługiwane są zdarzenia z menu nie będę tego opisywał dodam tylko, że wybierając z menu opcje o numerze IDM_DIALOG "obudzimy" naszego dialoga, który pojawi się na ekranie dzięki funkcji DialogBox. Procedura okna dialogowego jest identyczna jak w pierwszym przykładzie.

W następnej części opisze obsługę kontrolek w oknach dialogowych i kilka mniej lub bardziej ciekawych rzeczy ;)

Wielkie podziękowania dla Macieja Pacuły za nieocenioną pomoc i krytykę przy tworzeniu tego artykułu.

Wszelkie pytania i wątpliwości przesyłać na adres

Ostatnia aktualizacja ( Saturday, 21 February 2004 )
< Poprzedni   Następny >
Ankieta
Jak ocenisz poziom swoich umiejętnośći?
  
Dodaj do ulubionych
Ustaw stronę startową
Ostatnio dodane
Popularne
 
top

www.winapi.org © 2003 - 2007