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. ________________________________________________________________
rapper3d