66568

РАБОТА С ГРАФИЧЕСКОЙ СРЕДОЙ ОС UNIX И WINDOWS

Лабораторная работа

Информатика, кибернетика и программирование

Цель работы – изучить архитектуру системы X Window, базовых механизмов отображения графической информации и способов управления графическими окнами в UNIX, основные компоненты оконного интерфейса в Windows.

Русский

2014-08-22

118.91 KB

0 чел.

Министерство образования и науки Российской Федерации

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра «Информационная безопасность компьютерных систем»

ОТЧЕТ

по лабораторной работе №7

«РАБОТА С ГРАФИЧЕСКОЙ СРЕДОЙ ОС UNIX И WINDOWS»

по курсу «Операционные системы»

Выполнил

студент гр. 2088/4    А.А.Чернышев

                           <подпись>

Руководитель     А.С. Коноплев

                           <подпись>

Санкт-Петербург

2011

1. Формулировка задания

Цель работы – изучить архитектуру системы X Window, базовых механизмов отображения графической информации и способов управления графическими окнами в UNIX, основные компоненты оконного интерфейса в Windows.

2. Использованные теоретические сведения

Материалы из методического пособия 07.pdf, материалы интернет ресурсов msdn.com, и rus-linux.net, unix-manuals.com.

3. Результаты работы

3.1. Выполнение индивидуального задания

1)  X Window. Выполнить компиляцию и запуск программы из примера 3. Выполнить интерпретацию всех параметров графического контекста, используемых в нем при выводе графических элементов.

//=========================================================//

//========================Пример 3=========================//

#include <stdio.h>

#include <stdlib.h>

#include <X11/Xlib.h>

#include <X11/Xutil.h>

//#include <string.h>

//#include <unistd.h>

/* основные структуры данных X Window */

Display* d = NULL;// дисплей

Screen* s = NULL;// экран

Window root;// корневое окно экрана

unsigned long white, black;// значения цветов пикселов

unsigned long color;// значения цветов пикселов

int err;

Window w1;          //окна приложения

XSetWindowAttributes xswa;    // атрибуты окна

XWindowAttributes xwa;  // атрибуты окна

XWindowChanges xwc;    // состояние окна

XEvent event;  // событие

Pixmap pmp1,pmp2;  // пискельные карты

GC gc;     //  графический контекст

XGCValues xgcv;      // значения атрибутов контекста

XFontStruct *xfs; // дескриптор шрифта

Colormap cmap; // палитра

void do_graphics()

{

   XColor clrgb, clhard; // RGB и значения цвета пикселов int i, j, err;

   #define STRING "hello"

   #define COLOR "magenta"

   #define FONT "-adobe-times-medium-i-normal--*-180-*-*-p-*-iso8859-1"

   /* создание окна с черным фоном */

   w1 = XCreateWindow(d, root, 1, 1, 400, 400, 1,

                      CopyFromParent, InputOutput, CopyFromParent, 0, NULL);

   XMoveWindow(d, w1, 50, 50);

   xswa.background_pixel = black;

   XChangeWindowAttributes(d, w1, CWBackPixel, &xswa);

   XGetWindowAttributes(d, w1, &xwa);

   XMapWindow(d,w1);

   XFlush(d);

   sleep(2);

   /* вычисление значений цвета пикселов для фиолетового цвета палитры по умолчанию */

   cmap = XDefaultColormapOfScreen(s);

   err = XLookupColor(d, cmap, COLOR, &clrgb, &clhard);

   if(err==0)

   {

       printf("Not found %s\n", COLOR);

       color = white;

   }

   else

   {

       printf("%s rgb:%x:%x:%x\n", COLOR, clrgb.red, clrgb.green, clrgb.blue);

       XAllocColor(d, cmap, &clrgb);

       color = clrgb.pixel;

   }

   printf("%s: color:%x\n", COLOR, color);

   /* создание графического контекста */

   xgcv.background = black;

   xgcv.foreground = white;

   gc = XCreateGC(d, w1, (GCBackground|GCForeground), &xgcv);

   /* вывод графических примитивов без изменения значений по умолчанию */

   XDrawString(d, w1, gc, 150, 50, STRING, strlen(STRING));

   XDrawPoint(d, w1, gc, 100, 100);

   XDrawLine(d, w1, gc, 200, 100, 280, 100);

   XDrawRectangle(d, w1, gc, 100, 200, 80, 60);

   XDrawArc(d, w1, gc, 200, 200, 80, 60, 0, (90+45)*60);

   XFillRectangle(d, w1, gc, 100, 300, 80, 60);

   XFillArc(d, w1, gc, 200, 300, 80, 80, (360-45)*60, 90*60);

   XFlush(d);

   sleep(2);

   /*смещение изображения путем копирования через pixmap */

   pmp1 = XCreatePixmap(d, w1, 400, 400, xwa.depth);

   XCopyArea(d, w1, pmp1, gc, 0, 0, 400, 400, 0, 0);

   XClearArea(d, w1, 0, 0, 400, 400, False);

   XCopyArea(d, pmp1, w1, gc, 0, 0, 400, 400, 100, 100);

   XFlush(d);

   sleep(2);

   /* вывод графических примитивов без изменения значений по умолчанию */

   /* очистка окна */

   XClearArea(d, w1, 0, 0, 400, 400, False);

   /* загрузка шрифта и печать строки с его использованием */

   xfs = XLoadQueryFont(d, FONT);

   if(xfs == NULL)

   {

       printf("Not found %s", FONT);

   }

   else

   {

       xgcv.font = xfs->fid;

       XChangeGC(d, gc, GCFont, &xgcv);

   };

   XDrawString(d, w1, gc, 150, 50, STRING, strlen(STRING));

   /* вывод цветной точки */

   xgcv.foreground = color;

   XChangeGC(d, gc, GCForeground, &xgcv);

   XDrawPoint(d, w1, gc, 100, 100);

   /*Вывод жирных пунктирных цветных линий, прямоугольника и дуги*/

   xgcv.line_style = LineDoubleDash;

   xgcv.line_width = 2;

   XChangeGC(d, gc, (GCLineStyle|GCLineWidth), &xgcv);

   XDrawLine(d, w1, gc, 200, 100, 280, 100);

   XDrawRectangle(d, w1, gc, 100, 200, 80, 60);

   XDrawArc(d, w1, gc, 200, 200, 80, 60, 0, (90+45)*60);

   /* Заливка прямоугольника при помощи pixmap, хранящего старое знаечение состояния окна (в прямоугольник должен попасть текст строкиSTRING) */

   xgcv.fill_style = FillTiled;

   xgcv.ts_x_origin = 0;

   xgcv.ts_y_origin = 300;

   xgcv.tile = pmp1;

   XChangeGC(d,gc,

             (GCFillStyle|GCTile|GCTileStipXOrigin|GCTileStipYOrigin),

             &xgcv);

   XFillRectangle(d, w1, gc, 100, 300, 80, 60);

   /* цветная заливка дуги эллипса */

   xgcv.fill_style = FillSolid;

   xgcv.arc_mode = ArcChord;

   XChangeGC(d, gc, (GCFillStyle|GCArcMode), &xgcv);

   XFillArc(d, w1, gc, 200, 300, 80, 80, (360-45)*60, 90*60);

   XFlush(d);

   sleep(2);

   /* освобождение созданных объектов X-сервера */

   XFreeFont(d, xfs);

   XFreePixmap(d, pmp1);

   XFreeGC(d, gc);

   XFreeColormap(d, cmap);

   XDestroyWindow(d, w1);

   XFlush(d);

}

main()

{

   int i, j, err;

   /* установка соединения с X-сервером */

   d = XOpenDisplay(":0.0");

   if(d == NULL )

   {

       printf("Cann't connect to X server\n");

       exit(-1);

   }

   /* определение характеристик сервера */

   printf("Connected to %s\n", XDisplayString(d));

   printf("XServer: %s rel %d\n", XServerVendor(d),

          XVendorRelease(d));

   printf("XProtocol: %d.%d\n", XProtocolVersion(d),

          XProtocolRevision(d) );

   /* проверка соединения */

   XNoOp(d);

   /* определение параметров экрана */

   i = XDefaultScreen(d);

   s = XScreenOfDisplay(d, i);

   printf("Screens available: %d, using default screen %d\n",

          XScreenCount(d), i);

   printf("Screen size: %dx%d\n", XWidthOfScreen(s),

          XHeightOfScreen(s));

   /* получение дескриптора корневого окна */

   root = RootWindowOfScreen(s);

   /* определение глубины цвета */

   printf("Depth:%d, ", XDefaultDepthOfScreen(s));

   /* определение значений цветов для пикселов окна */

   white = XWhitePixelOfScreen(s);

   black = XBlackPixelOfScreen(s);

   printf("Colors: white:%x black:%x\n", white, black);

   /* синхронизация выходной очереди запросов */

   XFlush(d);

   /* вызов функции вывода графики */

   do_graphics();

   /* разрыв соединения с сервером */

   XCloseDisplay(d);

}

В результате получаем:

a) Вывод графических примитивов без изменения значений по умолчанию;

b) Вмещение изображения в окне путем копирования через pixmap;

c) Вывод жирных пунктирных цветных линии, прямоугольника и дуги + заливка прямоугольника при помощи pixmap, хранящего старое состояние окна (в прямоугольник должен попасть текст строки) + цветная заливка дуги эллипса.

                                

a)     b)     c)

2) WINAPI. Написать программу, позволяющую пользователю при помощи выпадающего списка (стандартный класс окна COMBOBOX) выбрать цвет, которым будет закрашиваться квадрат (или любая другая плоская фигура) (от 5 различных значений, например, "жёлтый", "синий" и т.д). Должна быть так же кнопка "REDRAW", по нажатию на которую и произойдёт перерисовка фигуры и её закрашивание в выбранный цвет.

//=========================================================//

//========================COMBO_2==========================//

#include "stdafx.h"

#include "COMBO_2.h"

#define MAX_LOADSTRING 100

#define IDC_COMBO_COLOR 5

#define IDC_BTN_REDRAW 7

HINSTANCE hInst;

TCHAR szTitle[] = _T("COMBO_LAB");

TCHAR szWindowClass[] = _T("WindowClass");

TCHAR szComboBox[] = _T("Choose Color");

COLORREF cl[7] =

{

   RGB(255,0,0),

   RGB(255,165,0),

   RGB(255,255,0),

   RGB(0,255,0),

   RGB(66,170,255),

   RGB(0,0,255),

   RGB(139,0,255),

};

int nColor = 0;

HWND hCombo, hButton;

ATOM    MyRegisterClass(HINSTANCE hInstance);

BOOL    InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

                      HINSTANCE hPrevInstance,

                      LPTSTR    lpCmdLine,

                      int       nCmdShow)

{

   MyRegisterClass(hInstance);               //  Регистрируем класс;

   if (!InitInstance (hInstance, nCmdShow))  //  Создаем окно;

       return FALSE;

   MSG msg;

   while (GetMessage(&msg, NULL, 0, 0))      //  Бесконечный цикл;

   {

       TranslateMessage(&msg);

       DispatchMessage(&msg);

   }

   return (int) msg.wParam;

}

ATOM MyRegisterClass(HINSTANCE hInstance)

{

   WNDCLASSEX wcex;

   wcex.cbSize = sizeof(WNDCLASSEX);

   wcex.style   = CS_HREDRAW | CS_VREDRAW;

   wcex.lpfnWndProc = WndProc;

   wcex.cbClsExtra  = 0;

   wcex.cbWndExtra  = 0;

   wcex.hInstance  = hInstance;

   wcex.hIcon   = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_COMBO_2));

   wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

   wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

   wcex.lpszMenuName = MAKEINTRESOURCE(IDC_COMBO_2);

   wcex.lpszClassName = szWindowClass;

   wcex.hIconSm  = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

   return RegisterClassEx(&wcex);

}

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

   HWND hWnd;

   hInst = hInstance;

   hWnd = CreateWindow(

              szWindowClass,

              szTitle,

              WS_OVERLAPPEDWINDOW,

              CW_USEDEFAULT,

              0,

              495,

              260,

              NULL,

              NULL,

              hInstance,

              NULL);

   if (!hWnd)

       return FALSE;

   ShowWindow(hWnd, nCmdShow);

   UpdateWindow(hWnd);

   return TRUE;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

   switch (message)

   {

   case WM_CREATE:

   {

       hCombo = CreateWindow ( L"ComboBox",

                               szComboBox,

                               CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE ,

                               25,  20,

                               200, 200,

                               hWnd,

                               (HMENU)IDC_COMBO_COLOR,

                               hInst,

                               NULL

                             );

       SendMessage(hCombo, CB_ADDSTRING, 0, (LPARAM)L"red");

       SendMessage(hCombo, CB_ADDSTRING, 1, (LPARAM)L"orange");

       SendMessage(hCombo, CB_ADDSTRING, 2, (LPARAM)L"yellow");

       SendMessage(hCombo, CB_ADDSTRING, 3, (LPARAM)L"green");

       SendMessage(hCombo, CB_ADDSTRING, 4, (LPARAM)L"sky");

       SendMessage(hCombo, CB_ADDSTRING, 3, (LPARAM)L"blue");

       SendMessage(hCombo, CB_ADDSTRING, 4, (LPARAM)L"purple");

       hButton = CreateWindow (L"Button", L"Redraw",

                               BS_PUSHBUTTON| WS_CHILD | WS_VISIBLE,

                               25, 50, 200, 150,

                               hWnd,

                               (HMENU)IDC_BTN_REDRAW,

                               hInst, NULL);

   };

   break;

   // Рисуем в окне;

   case WM_PAINT:

   {

       // Стандартная перерисовка окна и компонентов;

       DefWindowProc(hWnd, message, wParam, lParam);

       // Добавочная перерисовка того, что нам надо;

       HDC hdc = GetDC(hWnd);  // Получить поверхность для рисования;

       //  1. Создание кисти

       HBRUSH hBrush = CreateSolidBrush( cl[nColor] );

       //  2. Выбор на нашей поверхности hdc кисти hBrush, а прежнюю сохраним в hBrush_Old;

       HBRUSH hBrush_Old = (HBRUSH)SelectObject(hdc, hBrush);

       //  3. Рисуем прямоугольник;

       Rectangle(hdc, 235, 200, 450, 20);

       //  4. Выбор старой кисти;

       SelectObject(hdc, hBrush_Old);

       //  5. Удаление кисти;

       DeleteObject(hBrush);

       ReleaseDC(hWnd, hdc);   // Освобождение поверхности для рисования;

       return 0;

   }

   break;

   // Нажатие меню, кнопок и др.;

   case WM_COMMAND:

   {

       WORD wmId    = LOWORD(wParam);

       WORD wmEvent = HIWORD(wParam);

       if((wmId == IDC_BTN_REDRAW)&& (wmEvent == BN_CLICKED))

       {

           nColor = SendMessage(hCombo, CB_GETCURSEL, NULL, NULL);

           if (nColor == -1)

               nColor = 0;

           InvalidateRect(hWnd, NULL, FALSE);

       }

   };

   break;

   // Уничтожение окна;

   case WM_DESTROY:

       PostQuitMessage(0); //  Прерывание бесконечного цикла;

   }

   // DefWindowProc - Cтандартное поведение окна

   return DefWindowProc(hWnd, message, wParam, lParam);

}

В результате получилось:

3.2. Ответы на контрольные вопросы

Что происходит при перемещении по экрану окна, для которого не обрабатываются события типа Expose? (UNIX)

Окно не перерисовывается.

Какие атрибуты окон экрана контролирует оконный менеджер? (UNIX)

Глубина цвета экрана, палитра по умолчанию, значение цвета для черных пикселов, значение цвета для белых пикселов, ширина экрана в пикселах, высота экрана в пикселах, ширина экрана в миллиметрах, высота экрана в миллиметрах, графический контекст экрана по умолчанию.

Какая функция является точкой входа в Windows-программу?

Функция WinMain, определенная как:

int WINAPI WinMain(

HINSTANCE hInstance, //идентификатор экземпляра приложения.

HINSTANCE hPrevInstance, //идентификатор предыдущего экземпляра приложения. В Win32 он всегда равен нулю.

LPSTR lpCmdLine, //указатель на командную строку.

int nShowCmd  //флаги для окна.

);

Что такое оконная процедура? Для чего она предназначена? Кто ее вызывает в процессе работы приложения? (Windows)

Оконная процедура является функцией, которая принимает и обрабатывает все сообщения, отправленные окну. Каждый класс окна имеет оконную процедуру, и каждое окно, созданное с этим классом, чтобы отвечать на сообщения, использует эту же самую оконную процедуру. Система отправляет сообщение оконной процедуре, пересылая данные сообщения как параметры процедуры. Затем оконная процедура исполняет соответствующее действие с сообщением; она проверяет код сообщения и, при обработке сообщения, использует информацию, заданную его параметрами.

4. Выводы

Современные системы предоставляют широкий набор возможностей для создания графического интерфейса. В UNIX работа с интерфейсом заключается в обмене информацией между сервером и клиентом, а в Windows – в обмене сообщениями между окнами.


 

А также другие работы, которые могут Вас заинтересовать

17009. ЕТАЛОННІ СТРАТЕГІЇ РОСТУ (РОЗВИТКУ БІЗНЕСУ) 89.5 KB
  ЕТАЛОННІ СТРАТЕГІЇ РОСТУ РОЗВИТКУ БІЗНЕСУ Сутність і класифікація стратегій росту Якщо підприємство займає стійкі ринкові позиції стабільний розвиток і обирає за мету зростання обсягів збуту ринкової частки прибутку та розширення масштабів своєї діяльност...
17010. Еволюція управлінської думки 7.49 MB
  ТЕМА 2. Еволюція управлінської думки План лекції Виникнення науки менеджменту та напрямки еволюції управлінської думки. Ранні теорії менеджменту. Інтегровані підходи до управління. Сучасні напрямки розвитку науки управління 1. Виникнення науки...
17011. Основи теорії прийняття управлінських рішень 10.18 MB
  ТЕМА 3. Основи теорії прийняття управлінських рішень План лекції Поняття і моделі прийняття рішень. Процес прийняття рішень. Методи творчого пошуку альтернативних варіантів. 1. Поняття і моделі прийняття рішень У науковій літературі зустрічаєт
17012. Цілі управлінського планування 5.38 MB
  ТЕМА 5. Цілі управлінського планування План лекції Поняття і місце планування в системі управління. Типи планів в організації. Цілі управлінського планування. 1. Поняття і місце планування в системі управління Щоб спільні зусилля співробітників...
17013. Процес планування в організації 12.47 MB
  ТЕМА 6. Процес планування в організації План лекції Сутність стратегічного планування. Формулювання стратегії. Надання стратегії конкретної форми. 1. Сутність стратегічного планування У широкому розумінні стратегія – це взаємопов’язаний компл...
17014. Основи теорії організації 10.78 MB
  ТЕМА 7. Основи теорії організації План лекції Сутність і зміст функції організації. Класична теорія організації. Поведінковий підхід в теорії організації. Ситуаційний підхід в теорії організації. 1. Сутність і зміст функції організації В про
17015. Організаційне проектування 19.11 MB
  ТЕМА 8. Організаційне проектування План лекції Проектування робіт в організації. Департаменталізація. Делегування повноважень. Механізми координації. Типи організаційних структур управління 1. Проектування робіт в організації З практич...
17016. Управління організаційними змінами 57 KB
  ТЕМА 9. Управління організаційними змінами План лекції Сутність організаційних змін. Процес організаційних змін. 1. Сутність організаційних змін В процесі функціонування організації під впливом численних факторів зовнішнього середовища виникає
17017. Основи теорії мотивації 12.21 MB
  ТЕМА 10. Основи теорії мотивації План лекції Людський фактор в управлінні. Змістовні теорії мотивації. Процесні теорії мотивації. 1. Людський фактор в управлінні Привести в дію організовану систему для отримання необхідного результату можливо л