LEKCJA44.TXT

(6 KB) Pobierz
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.  
________________________________________________________________ 
 
Zgłoś jeśli naruszono regulamin