MONITOR"> Subsections

A. Przegląd konstrukcji biblioteki XView użytych w programie MONITOR

A.1 Ramki

A.1.1 Wprowadzenie

Ramka (FRAME) jest to pojęcie oznaczające okienko na ekranie. Ramka składa się z:

Zasadniczo istnieją dwa rodzaje ramek:

A.1.1.1 FRAME i FRAME_BASE

Są to ramki, tworzące główne okno programu. Składają się one z elementów wymienionych powyżej. Ich obszar właściwy jest pusty.

A.1.1.2 FRAME_CMD i FRAME_PROPS

Są to ramki pomocnicze, pomocne przy ustawianiu opcji, zmianie parametrów programu, wprowadzaniu danych i.t.p. Ramka ta nie posiada narożników zmiany rozmiaru, ani przycisku zwijania w ikonę, za to posiada pinezkę (PIN) pozwalający ją przyszpilić. Ramka ta ma automatycznie tworzony obszar przycisków (PANEL) w obszarze właściwym.

A.1.2 Sposób tworzenia

A.1.2.1 Ramka główna

#include <xview/xview.h>
...
Frame   frame;
frame = (Frame)xv_create( NULL , FRAME ,<atrybuty> , NULL );
...

A.1.2.2 Ramka pomocnicza

#include <xview/xview.h>
...
Frame   frame_cmd;
frame_cmd = (Frame)xv_create( frame , FRAME_CMD ,<atrybuty> , NULL );
...


Tabela: Ważniejsze atrybuty ramek
 Atrybut  typ argumentu  komentarz  
 FRAME_LABEL  char *  nazwa wyświetlana na górnej belce  
 FRAME_ICON  Icon  ikona ramki  
 FRAME_SHOW_FOOTER  int  czy stopki są widoczne  
 FRAME_LEFT_FOOTER  char *  napis wyświetlany w lewej stopce  
 FRAME_RIGHT_FOOTER  char *  napis wyświetlany w prawej stopce  
 FRAME_SHOW_RESIZE_CORNER  int  czy narożniki zmiany rozmiaru są widoczne  
 XV_X  int  współrzędna X lewego górnego rogu ramki  
 XV_Y  int  współrzędna Y lewego, górnego rogu ramki  
 XV_WIDTH  int  szerokość ramki  
 XV_HEIGHT  int  wysokość ramki  
 XV_SHOW  int  czy ramka widoczna na ekranie  
 FRAME_CMD_PUSHPIN_IN  int  czy ramka pomocnicza przyszpilona  


A.2 Panele

A.2.1 Wprowadzenie

Panel (PANEL) czyli obszar przycisków pozwala na stworzenie różnych obiektów, służących do np. ustawiania opcji, uruchamiania innych funkcji programu, wczytywania danych. Obiektami tymi są:

Każdy panel (za wyjątkiem: PANEL_ABBREV_MENU_BUTTON i PANEL_BUTTON) posiada nazwę i pola. Nazwa to dowolny napis, mówiący o przeznaczeniu panela. Pole jest obszarem dynamicznym, zmienianym przez manipulację klawiaturą bądź myszką.

A.2.2 Sposób tworzenia

A.2.2.1 Tworzenie obszaru przycisków

#include <xview/panel.h>
...
Panel   panel;
panel = (Panel)xv_create( frame , PANEL , <atrybuty> , NULL );
...

A.2.2.2 Tworzenie poszczególnych paneli

#include <xview/panel.h>
...
Panel   panel_obiekt;
panel_obiekt = (Panel)xv_create( panel , <typ panela> , <atrybuty> , NULL );
...
Jako <typ panela> należy wpisać dowolny z obiektów , wymienionych powyżej. Niektóre atrybuty paneli są przedstawione w tablicy A.2.


Tabela: Ważniejsze atrybuty paneli
 Atrybut  typ argumentu  komentarz  
 XV_X  int  współrzędna X początku obszaru  
 XV_Y  int  współrzędna Y początku obszaru  
 XV_WIDTH  int  szerokość obszaru przycisków  
 XV_HEIGHT  int  wysokość obszaru przycisków  
 PANEL_NOTIFY_PROC  ((*)())  adres procedury obsługi panela  
 PANEL_DIRECTION  PANEL_VERTICAL  określenie położenia  
    PANEL_HORIZONTAL  obiektu  
    PANEL_CURENT  wyświetlaj tylko wybraną opcję  
 PANEL_DISPLAY_LEVEL  PANEL_ALL  wyświetl wszystkie opcje  
    PANEL_NONE  nie wyświetlaj żadnych opcji  
 PANEL_FEEDBACK  PANEL_INVERTED  opcja(e) wybrana - pogrubioną linią  
    PANEL_MARKED  -\\- - kwadracik ``z dziobkiem''  
 PANEL_CHOOSE_ONE  TRUE  można wybrać tylko jedną opcję  
    FALSE  można wybrać kilka opcji  
 PANEL_MIN_VALUE  int  min wartość w panelu numerycznym  
 PANEL_MAX_VALUE  int  max. wartość w panelu numerycznym  
 PANEL_TICKS  int  ilość pomocniczych kresek suwaka  
 PANEL_VALUE  int  wartość panela  
 PANEL_LABEL_STRING  char *  nazwa panela  
 PANEL_CHOICE_STRINGS  char * , ... , char * , NULL  opcje podlegające wyborowi  
 PANEL_LABEL_WIDTH  int  szerokość pola z nazwą panela  
 PANEL_ITEM_X  int  współrzędna X lewego końca panela  
 PANEL_ITEM_Y  int  współrzędna Y lewego końca panela  
 PANEL_VALUE_DISPLAY_LENGTH  int  szerokość pola  
 PANEL_VALUE_UNDERLINED  int  czy dane pole podkreślone ?  


A.3 Płachta

A.3.1 Wprowadzenie

Płachta (CANVAS) jest to nazwa obszaru, w którym można tworzyć rysunki. Obszar ten powinien być umieszczony w obszarze właściwym ramki. W obszarze tym możemy korzystać z różnych funkcji powodujących np. rysowanie linii (ciągłej lub przerywanej), przenoszenie części obszaru w inne miejsce itp.

A.3.2 Sposób tworzenia

#include <xview/canvas.h>
...
Canvas          canvas;
...
canvas = (Canvas)xv_create( frame , CANVAS , <atrybuty> , NULL )


Tabela: Ważniejsze atrybuty płachty
 Atrybut  typ argumentu  komentarz  
 OPENWIN_AUTO_CLEAR  int  czy sami czyścimy okienko  
 CANVAS_FIXED_IMAGE  int  czy okienko ma zmienną zawartość  
 CANVAS_REPAINT_PROC  int  czy używamy Xlib do obsługi  
 CANVAS_REPAINT_PROC  ((*)())  procedura do przerysowywania  
 XV_WIDTH  int  szerokość obszaru  
 XV_HEIGHT  int  wysokość obszaru  


W obszarze graficznym istnieje możliwość obsługi różnych zdarzeń takich jak np. ruch myszką (LOC_MOVE), zmiana rozmiarów okienka (WIN_RESIZE), przeniesienie kursora poza obszar okienka (LOC_WINEXIT), wciśnięcie lewego klawisza myszy (MS_MIDDLE) i wiele innych. Aby zarejestrować procedurę obsługi zdarzeń należy wpisać do programu:

 xv_set(canvas_paint_window(canvas),
        WIN_EVENT_PROC,         <nazwa procedury>,
        WIN_CONSUME_EVENTS,
            <pierwsze zdarzenie> , ... , <i-te zdarzenie> , ... , <n-te zdarzenie>
            NULL,
        NULL);
gdzie <i-te zdarzenie> jest którymś z symboli zdarzenia wymienionych powyżej, zaś <nazwa procedury> jest identifikatorem funkcji obsługującej zdarzenia. Procedura obsługi zdarzeń może wyglądać następująco:
void <nazwa procedury>(window, event)
Xv_Window window;
Event    *event;
{
...
/* Odczytanie kodu klawisza */

if(event_is_ascii(event))
        printf("Wcisnieto klawisz %c na klawiaturze\n",event_action(event));
...
switch((event_action(event)) {

/* Odczytanie pozycji kursora */

case LOC_MOVE:
             printf("X =  %d Y = %d\n",event_x(event), event_y(event));
             break;
... 
}
Procedura do przerysowywania może wyglądać następująco:
void <nazwa procedury>(canvas, canvas_pw, repaint_area)
Canvas      canvas;
Pixwin      *canvas_pw;
Rectlist    *repaint_area;
{
...
        static Pr_brush    brush = {1}; /*grubosc linii przerywanej*/
        static short       dashed[] = {1,3,0};  /*struktura linii przerywanej*/
        static Pr_texture  tex = {dashed, 0, 0, 0, 0, 0, 0, 0 };
...
/* rysujemy linie przerywana od punktu (x1,y1) do punktu (x2,y2) */
        pw_line( canvas_pw, <x1> , <x2>, <y1> , <y2> , &brush , &tex , PIX_SET );
...
/* rysujemy linie ciagla od punktu (x1,y1) do punktu (x2,y2) */
        pw_vector( canvas_pw , <x1> , <y1> , <x2> , <y2> , PIX_SRC, 1 );
...
/*wypisujemy tekst w pozycji (x,y)*/
        pw_text( canvas_pw, <x> , <y> , PIX_SRC, NULL , <tekst> );
...
}

A.4 Ikony

A.4.1 Wprowadzenie

Ikona (ICON) to nazwa obiektu graficznego, którego zadaniem jest symboliczne przedstawienie zadania danego programu, możliwych operacji itp. Jak wcześniej nadmieniłem, ramka główna programu (FRAME) posiada przycisk zwijający ją w ikonę. Aby dołączyć ikonę do programu należy:
  1. utworzyć wzór ikony za pomocą programu iconedit.

  2. wpisać do programu poniższe instrukcje.

A.4.2 Dołączenie ikony do programu

#include <xview/xview.h>
...
char plik_z_ikona = {
#include "<nazwa pliku z wzorem ikony>"
}
...
Server_image	icon_image;
Icon		icon;

icon_image = (Server_image)xv_create( NULL , SERVER_IMAGE ,
                                             SERVER_IMAGE_BITS , icon_file ,
                                             SERVER_IMAGE_DEPTH , 1 ,
                                             XV_WIDTH , 64 ,
                                             XV_HEIGHT , 64 ,
                                             NULL );
icon = (Icon)xv_create( NULL , ICON ,
                               ICON_IMAGE , icon_image ,
                               ICON_TRANSPARENT , TRUE ,
                               NULL );
...
xv_set( frame , FRAME_ICON , icon );

A.5 Menu

A.5.1 Wprowadzenie

Menu (MENU) to zespół obiektów pozwalających krokowo dokonywać wyboru opcji, poprzez rozwinięcie innych podmenu, bądź wybór określonej opcji ze spisu.

A.5.2 Sposób tworzenia

#include <xview/xview.h>
...
Menu	menu;
menu = (Menu)xv_create( NULL , MENU , <atrybuty> , NULL );
...


Tabela: Ważniejsze atrybuty menu
 Atrybut  typ argumentu  komentarz  
 MENU_NOTIFY_PROC  ((*)())  procedura obsługi danej opcji  
 MENU_STRINGS  char * , ... , char *  nazwy opcji  
 MENU_SELECTED  int  numer wybranej opcji  
 MENU_PULLRIGHT  Menu  podmenu, rozwijane z prawej strony menu