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 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 #include #include #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. ________________________________________________________________