LEKCJA 44
O Okienkach dialogowych.
O tym, jak konstruuje się okienka dialogowe.
Do wyświetlania okienek dialogowych w Windows API służy funkcja DialogBox(), a do zakończenia ich "życia na ekranie" - EndDialog(). Podobnie jak każde okno, również okno dialogowe musi mieć swoją funkcję, obsługi komunikatów Windows. Zamiast WindowProc() nazywa się ją tradycyjnie DlgProc():
BOOL FAR PASCAL DlgProc(HWND hDLG, unsigned Message, WORD
wParam, LONG lParam);
{
switch (message)
{
...
default: return (0);
}
}
Za wyjątkiem braku domyślnego handlera Windows - DefWindowProc(), który jest zbędny, w związku z wewnętrznie przyjmowanymi wartościami domyślnymi, funkcja podobna jest bardzo w swojej konstrukcji do WindowProc(). Funkcja zwraca wartość FALSE (czyli 0), jeśli przesłany komunikat nie został obsłużony. Typowymi komunikatami, które rozpatruje większość okienek dialogowych, są WM_INITDIALOG oraz WM_COMMAND. Przykład okienka dialogowego:
------------------Plik: DLGBOX1.H-------------------------------
#define szAppName "DLGBOX1"
#define IDM_DLG1 100
------------------Plik zasobów: DLGBOX1.RC----------------------
#include "DLGBOX1.H"
#include <windows.h>
IDI_ICON ICON CONTROL.ICO
DLGBOX1 MENU
BEGIN
MENUITEM "&O DlgBox" IDM_DLG1
/* to menu pojawi się w oknie macieżystym */
END
DLGBOX1 DIALOG 30,30,200,100
/* Pierwsze liczby to współrzędne lewego-górnego rogu okna, dwie
następne - to szerokość i długość. Współrzędne są względne.
Punkt (0,0) to narożnik okna macieżystego */
STYLE WS_POPUP | WS_DLGFRAME
BEGIN
LTEXT "Przyklad" -1, 0, 12, 160, 8
CTEXT "DLGBOX1 - Przyklad" -1, 0, 36, 160, 8
DEFPUSHBUTTON "OK" IDOK, 64, 60, 32,14, WS_GROUP
END
----------------------------------------------------------------
Pomiędzy parą słów kluczowych BEGIN-END można umieszczać różne instrukcje sterujące. Definiują one, jaki rodzaj okna sterującego ukaże się w okienku dialogowym. Instrukcje te można stosować w następującym formacie:
typ_okna "tekst" ID, x, y, szerokość, wysokość [styl]
Parametr styl jest opcjonalny. Styl okna określają identyfikatory predefiniowane w API Windows (WS_...). Parametr ID jest odpowiednikiem identyfikatora dla okien potomnych typu Child Window; dla okien sterujących, które nie zwracają komunikatów do okna macierzystego, ma wartość -1. IDOK wykorzystaliśmy jako identyfikator dla okna sterującego typu BUTTON. Zostanie on wysłany do funkcji okienkowej jako wartość parametru wParam, gdy użytkownik kliknie klawisz.
------------------Plik główny: DLGBOX1.CPP----------------------
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "DLGBOX1.H"
#pragma argused
HANDLE hInst;
long FAR PASCAL WndProc (HWND, unsigned, WORD, LONG) ;
BOOL FAR PASCAL ControlProc (HWND, unsigned, WORD, LONG) ;
int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow )
{
WNDCLASS wndClass;
MSG msg;
HWND hWnd;
if ( !hPrevInstance )
{
wndClass.style= CS_HREDRAW | CS_VREDRAW ;
wndClass.lpfnWndProc= WndProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra= 0;
wndClass.hInstance = hInstance;
wndClass.hIcon = LoadIcon(NULL, szAppName);
wndClass.hCursor= LoadCursor(NULL, IDC_ARROW );
wndClass.hbrBackground= GetStockObject(WHITE_BRUSH );
wndClass.lpszMenuName= szAppName;
wndClass.lpszClassName= szAppName;
if (!RegisterClass(&wndClass))
return 0;
}
hInst = hInstance;
hWnd = CreateWindow(szAppName, "DLGBOX1", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, 0, 0, hInstance, 0);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg );
DispatchMessage(&msg );
}
return 0;
}
BOOL FAR PASCAL ControlProc (HWND hDlg, unsigned Message,
WORD wParam, LONG lParam)
{
switch(msg)
{
case WM_INITDIALOG:
return TRUE;
break;
case WM_COMMAND:
switch(wParam)
{
case IDOK:
case IDCANCEL:
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return (0);
}
long FAR PASCAL WndProc (HWND hWnd, unsigned msg,
WORD wParam, LONG lParam)
{
FARPROC lpControlProc;
switch(Message)
{
case WM_COMMAND:
switch(wParam)
{
case IDM_ABOUT:
lpControlProc = MakeProcInstance((FARPROC) ControlProc, hInst);
DialogBox(hInst, "DLGBOX1", hWnd, lpControlProc);
return 0;
}
break;
case WM_DESTROY:
hDC = BeginPaint(hWnd , &ps);
TextOut(hDC, 30, 50,"Demo okienka dialogowego", 25);
TextOut(hDC, 30, 70,"Zastosuj menu...", 17);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd,Message,wParam,lParam));
}
return 0;
}
Stosując okienko edycyjne możemy użyć następujących predefiniowanych parametrów:
CONTROL
|
określa okno elementu sterującego zdefiniowane przez użytkownika. |
CONTROL
|
"tekst", klasa, styl, x, y, szerokość, wysokość |
LTEXT |
element sterujący: okienko tekstowe Wyrównywanie tesktu: do lewej. |
RTEXT |
j. w. Wyrównywanie tesktu: do prawej |
CTEXT |
j. w. Wyrównywanie tesktu: centrowanie w okienku |
CHECKBOX |
pole tekstowe po prawej stronie przełącznika typu Check Box. |
PUSHBUTTON |
Klawisz z napisem. |
LISTBOX |
okienko z listą |
GROUPBOX
|
grupa elementów sterujących typu BUTTON; zgrupowanie kilku elementów sterujących i otoczenie ramką. Tekst zostanie umieszczony w lewym górnym rogu. |
DEFPUSHBUTTON |
Klawisz domyślny w stylu BS_DEFPUSHBUTTON. |
RADIOBUTTON |
analogicznie jak dla stylu BS_RADIOBUTTON. |
EDITTEXT |
tworzy okno oparte na klasie EDIT. |
COMBOBOX |
tworz okno oparte na klasie COMBOBOX. |
ICON |
definiuje ikonę opartą na klasie STATIC; w okienku dialogowym. |
SCROLLBAR |
tworzy okno oparte na klasie SCROLLBAR. |
[!!!]UWAGA
W niektórych przypadkach okienko dialogowe może być głównym oknem aplikacji.
1