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


 

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

46327. Выращивание зерновых и снижение затрат на их обработку 587.76 KB
  Однако в Россию завозится большое количество продуктов питания изза рубежа что способствует повышению продуктивной зависимости от стран запада и политическую зависимость страны. руб. руб. продукции руб.
46328. Проектирование приводной станции к полочному элеватору 1.74 MB
  Нахождение коэффициента запаса прочности. Нахождение коэффициента запаса прочности. Нахождение коэффициента запаса прочности Подбор подшипников по динамической грузоподъемности. Кинематический и энергетический расчет привода Мощность элеватора определяется по уравнению где Z – производительность элеватора.
46329. Увеличение мощности пути железных дорог. Совершенствование машин с точки зрения ремонтопригодности 16.83 MB
  Увеличение мощности пути железных дорог требует усовершенствования технологии и организации ремонтнопутевых работ. Своевременный и качественный ремонт пути снижение затрат времени труда и эксплуатационных расходов повышение производительности труда достигает акиалной1 еханизацией путевых работ. Основным направлением в вопросе механизации путевых работ является создание высокопроизводительных машин обеспечивающих производство больших объемов работ в сравнительно небольшие окна и вынесение значительной части работ на путевые...
46330. Повышене результативности камерального контроля 172.9 KB
  Для достижения поставленной цели необходимо решить следующие задачи: изучить теоретические подходы к содержанию камеральной проверки определить её место и роль в системе государственного налогового контроля; исследовать нормативноправовой механизм камерального контроля в России; исследовать современное состояние контрольной деятельности на примере Межрайонной инспекции ФНС России; определить результативности камерального и выездного контроля сравнить их; разработать рекомендации по повышению результативности камерального контроля....
46331. Вольтметр электростатической системы, подключенный к источнику напряжения, имеющего форму прямоугольных однополярных импульсов, со скважностью 100 имеет показание 100 В 131.54 KB
  Решение: Рассчитаем в MthCD действующее значение напряжения которое измеряет вольтметр электростатической системы: Мгновенное значение напряжения Действующее значение напряжения Найдем Um из полученного выражения: В Рассчитаем в MthCD показание выпрямительного вольтметра с однополупериодной схемой выпрямления подключенного к тому же источнику. В Найти показания вольтметра вида В3 с детектором СКЗ и открытым входом при измерении им напряжения сигнала если Uv= В Um 0 Ut T t Вольтметр вида В3 с открытым...
46332. Гражданское и торговое право зарубежных стран 108.3 KB
  Обязательство это правоотношения в силу которого одно лицо кредитор имеет право требовать от другого лица должника выполнения какихлибо действий или воздержание от какихлибо действий. В обязательственном правоотношении участвуют кредитор лицо имеющее право требовать совершения обусловленных действий или воздержания от их совершения и должник лицо обязанное совершить оговоренное в обязательстве действие или воздержаться от его совершения. Этот пробел был восполнен французской правовой доктриной определяющей обязательство как...
46333. Конфликт в организации как управленческий процес 82.16 KB
  Исходя из поставленной цели определены следующие задачи: определить понятие конфликта и конфликтной ситуации выделить виды и типы конфликтов описать процесс развития конфликта а также изучить способы и методы управления конфликтами.
46334. Соблюдение условий и требований таможенных процедур 319.54 KB
  Понятие виды и классификация таможенных процедур. Этапы развития таможенных режимов. Понятие и принципы таможенных процедур. Классификация и виды таможенных процедур.
46335. Расчёт холодильных камер для хранения молочного продукта 99.4 KB
  Искусственное охлаждение можно осуществлять двумя способами: с помощью другого вещества, имеющего более низкую температуру передавая тепло при изменении его агрегатного состояния с помощью специальных охлаждающих устройств холодильных машин и установок.