Advertisement
joker546645

Graf

Nov 16th, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.29 KB | None | 0 0
  1. #include <X11/Xlib.h>
  2. #include <X11/Xutil.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6.  
  7. #define TRUE 1
  8. #define FALSE 0
  9.  
  10. struct punkty{
  11. int stary_X;
  12. int stary_Y;
  13. int aktX;
  14. int aktY;
  15. int kolor;
  16. };
  17.  
  18. int main(int argc, char *argv[])
  19. {
  20.     int staryX;
  21.     int staryY;
  22.     int obiegiPetli=0;
  23.     struct punkty tablica[10000];
  24.  
  25.  
  26.   char            icon_name[] = "Grafika";
  27.   char            title[]     = "Grafika komputerowa";
  28.   Display*        display;    //gdzie bedziemy wysylac dane (do jakiego X servera)
  29.   Window          window;     //nasze okno, gdzie bedziemy dokonywac roznych operacji
  30.   GC              gc;         //tu znajduja sie informacje o parametrach graficznych
  31.   XEvent          event;      //gdzie bedziemy zapisywac pojawiajace sie zdarzenia
  32.   KeySym          key;        //informacja o stanie klawiatury
  33.   XSizeHints      info;       //informacje typu rozmiar i polozenie okna
  34.   int             screen_no;
  35.   unsigned long   foreground;
  36.   unsigned long   background;
  37.   char            buffer[8];  //gdzie bedziemy zapamietywac znaki z klawiatury
  38.   int             hm_keys;    //licznik klawiszy
  39.   int             to_end;
  40.   XPoint          current_point;
  41.  
  42.   Colormap        colormap;
  43.   int             red, green, blue, yellow;
  44.  
  45.   display    = XOpenDisplay("");                //otworz polaczenie z X serverem pobierz dane od zmiennej srodowiskowej DISPLAY ("")
  46.   screen_no  = DefaultScreen(display);          //pobierz domyslny ekran dla tego wyswietlacza (0)
  47.   background = WhitePixel(display, screen_no);  //niech tlo bedzie biale
  48.   foreground = BlackPixel(display, screen_no);  //niech ekran bedzie czarny
  49.  
  50.   colormap = DefaultColormap(display,screen_no);
  51.  
  52.   int AllocNamedColor(char *name)     //funkcja przydzielania kolorow
  53.   {
  54.     XColor col;
  55.     XParseColor(display,colormap,name,&col);
  56.     XAllocColor(display,colormap,&col);
  57.     return col.pixel;
  58.   }
  59.  
  60.   red=AllocNamedColor("red");
  61.   green=AllocNamedColor("green");
  62.   blue=AllocNamedColor("blue");
  63.   yellow=AllocNamedColor("yellow");
  64.  
  65.   //okresl rozmiar i polozenie okna
  66.   info.x = 100;
  67.   info.y = 150;
  68.   info.width = 600;
  69.   info.height = 300;
  70.   info.flags = PPosition | PSize;
  71.  
  72.   //majac wyswietlacz, stworz okno - domyslny uchwyt okna
  73.   window = XCreateSimpleWindow(display, DefaultRootWindow(display),
  74.                                info.x, info.y, info.width, info.height,
  75.                                7/* grubosc ramki */, foreground, background);
  76.   XSetStandardProperties(display, window, title, icon_name, None,
  77.                          argv, argc, &info);
  78.   //utworz kontekst graficzny do zarzadzania parametrami graficznymi (0,0) domyslne wartosci
  79.   gc = XCreateGC(display, window, 0, 0);
  80.  
  81.   XSetBackground(display, gc, background);
  82.   XSetForeground(display, gc, foreground);
  83.  
  84. /* okresl zdarzenia jakie nas interesuja tj. nacisniecie
  85.      klawisza (aby wyjsc z programu, oraz zdarzenie
  86.      odswiezania okna np. gdy jakies inne window, ktore
  87.      przykrywalo nasze okno zostalo zamkniete lub przesuniete,
  88.      nacisniecie klawisza, zwolnienie oraz ruch myszy*/
  89.   XSelectInput(display, window, (KeyPressMask | ExposureMask | ButtonPressMask|
  90.                                  ButtonReleaseMask | Button1MotionMask));
  91.   XMapRaised(display, window);  //wyswietl nasze okno na samym wierzchu wszystkich okien
  92.  
  93.   to_end = FALSE;
  94.  
  95.  
  96.  /* petla najpierw sprawdza, czy warunek jest spelniony
  97.      i jesli tak, to nastepuje przetwarzanie petli
  98.      a jesli nie, to wyjscie z petli, bez jej przetwarzania */
  99.   while (to_end == FALSE)
  100.   {
  101.     XNextEvent(display, &event);  // czekaj na zdarzenia okreslone wczesniej przez funkcje XSelectInput
  102.  
  103.     switch(event.type)
  104.     {
  105.       case Expose:
  106.         if (event.xexpose.count == 0)
  107.         {
  108.         XDrawArc(display, window, gc, 100, 100, 100, 100, 0, 360*64);
  109.         int i;
  110.         for (i = 0; i<obiegiPetli; i++)
  111.         {
  112.             if (tablica[i].kolor == red)
  113.                 XSetForeground(display, gc, red);
  114.             else
  115.                 XSetForeground(display, gc, foreground);
  116.             XDrawLine(display, window, gc, tablica[i].stary_X, tablica[i].stary_Y, tablica[i].aktX, tablica[i].aktY);
  117.         }
  118.  
  119.     //tu powinna byc przerysowana zawartosc okna
  120.        
  121.         }
  122.         break;
  123. XDrawLine(display, window, gc, staryX, staryY, current_point.x, current_point.y);
  124.       case MappingNotify:
  125.         XRefreshKeyboardMapping(&event.xmapping); // zmiana ukladu klawiatury - w celu zabezpieczenia sie przed taka zmiana trzeba to wykonac
  126.         break;
  127.  
  128.       case ButtonPress:
  129.         if (event.xbutton.button == Button1)  // sprawdzenie czy wciscnieto lewy przycisk
  130.                           // prawy przycisk to Button3
  131.         {
  132.           //odczytanie polozenia kursora
  133.               current_point.x = event.xbutton.x;
  134.           current_point.y = event.xbutton.y;
  135.  
  136.           // wymuszenie odswiezenia okna
  137.           event.type = Expose;          
  138.           event.xexpose.count = 0;
  139.           XSendEvent(display, window, 0, ExposureMask, &event);
  140.         }
  141.         break;
  142.  
  143.       case KeyPress:
  144.         hm_keys = XLookupString(&event.xkey, buffer, 8, &key, 0);
  145.         if (hm_keys == 1)
  146.         {
  147.           if (buffer[0] == 'q') to_end = TRUE;        // koniec programu
  148.          
  149.         }
  150.         break;
  151.  
  152.          case MotionNotify:
  153.        {
  154.             staryX = current_point.x;
  155.             staryY = current_point.y;
  156.                //odczytanie polozenia kursora
  157.               current_point.x = event.xbutton.x;
  158.           current_point.y = event.xbutton.y;
  159.          if (sqrt((current_point.x-150)*(current_point.x-150)+(current_point.y-150)*(current_point.y-150)) <=50)
  160.          {
  161.             XSetForeground(display, gc, red);
  162.             tablica[obiegiPetli].kolor = red;
  163.          }
  164.          else
  165.          {
  166.             XSetForeground(display, gc, foreground);
  167.             tablica[obiegiPetli].kolor = foreground;
  168.         }
  169.             XDrawLine(display, window, gc, staryX, staryY, current_point.x, current_point.y);
  170.                 tablica[obiegiPetli].stary_X = staryX;
  171.                 tablica[obiegiPetli].stary_Y = staryY;
  172.                 tablica[obiegiPetli].aktX = current_point.x;
  173.                 tablica[obiegiPetli].aktY = current_point.y;
  174.                 obiegiPetli++;
  175.        }
  176.        break;
  177.       default:
  178.         break;
  179.     }
  180.   }
  181.  
  182.   XFreeGC(display, gc);
  183.   XDestroyWindow(display, window);
  184.   XCloseDisplay(display);
  185.  
  186.   return 0;
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement