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 – в обмене сообщениями между окнами.


 

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

16201. Документальная информация о хозяйственных обществах в Украине. Учебное пособие 682.5 KB
  В монографии исследованы возникновение и историческое развитие понятий «документ» и «документальная информация», дана классификация информации, а также изучена юридическая природа информационных отношений с участием государственных органов (реестров) на примере Единого государственного реестра предприятий и организаций Украины
16202. История государства и права. Учебное пособие 526.5 KB
  Цикл лекций охватывает первый раздел курса Истории государства и права зарубежных стран. В нем ставится задача показать два пути наиболее раннего становления политико-правовой формы человеческой жизнедеятельности. Один из этих путей в исторической литературе называется Восточным или азиатским
16203. Уголовно-исполнительное право. Учебное пособие 2.41 MB
  Перминов О. Г. Уголовноисполнительное право учебное пособие для студентов высших учебных заведений обучающихся по специальности юриспруденция Москва 1999 Былина ББК 67.99 П82 Перминов О.Г. Уголовноисполнительное право: учебное по
16204. Основы работы в текстовом редакторе MS Word 56.5 KB
  Отчет по лабораторной работе № 5 Тема работы: Основы работы в текстовом редакторе MS Word Цель работы: Ознакомиться с основами работы в текстовом редакторе WORD. Научиться редактировать документ овладеть способами копирования и перемещения текста применять стили форм...
16205. Вопросы по ключам 135 KB
  Вопросы по ключам. 1 .Чтотакое глубина насыщения транзисторного ключа и на какие его свойства и как она оказывает влияние Режим насыщения имеет место при прямом смещении обоих рп переходов транзистора. При этом падение напряжения на переходах как правило на превышает...
16206. Вопросы по компонентам ИС 36.5 KB
  Вопросы по компонентам ИС. 1.Какова физическая структура резистора ИС Есть ли ограничения на их свойства Простейшим резистором ИМС является слой полупроводника изолированный от других элементов ИМС. Существует несколько способов изоляции самый распространенный и
16207. Ответы по стабилизаторам напряжения 35 KB
  Вопросы по стабилизаторам напряжения. 38. Чем определяется амплитуда колебаний выходного напряжения в компенсационных стабилизаторах с импульсным регулированием при неизменном входом напряжении и токе нагрузки Наиболее распространенная силовая часть компенсацио
16208. Ответы по усилителям мощности 39 KB
  Вопросы по усилителям мощности. 24. Каким образом в УМ рабочую точку транзисторов смещают в класс А АВ В Рис. 1 Рис.2 В режиме класса А выбор рабочей точки покоя производится таким образом чтобы входной сигнал полностью помещался на линейном участке выходной ВАХ транзи
16209. Ответы по Усилителям постоянного тока 54.5 KB
  Вопросы по Усилителям постоянного тока 1.Какова максимально достижимая величина коэффициента усиления по напряжению у дифференциального усилителя Если дифференциальный усилитель рассматривается как два каскада выполненных по схеме с общим эмиттером то для каждог...