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


 

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

81851. Железнодорожный транспорт. Достоинства и недостатки 27.17 KB
  Но в неё в силу природных условий входили вспомогательные субъекты – больницы школы общепит учреждения культуры и другие. В законодательном порядке определена государственная политика в области железнодорожного транспорта направленная на создание условий для удовлетворения потребностей населения и экономики страны в перевозках. Преимущества: быстрая доставка на большие расстояния; независимость от климатических условий; большая грузоподъёмность 34 тыс.
81852. Понятие о транспортно-экономических балансах 21.37 KB
  Транспортно-экономический баланс состоит из трех основных частей: баланс производства или отправления грузов их потребления или прибытия объема перевозок и транспортно-экономических связей. Оптимальные внутрирайонные и межрайонные связи являются исходной базой для определения потоков грузов по участкам транспортной сети грузооборота и средней дальности перевозок. невозможности определения коэффициента повторное перевозок; отсутствие учета объема перевозок тары и др.
81854. Морской транспорт. Роль морского транспорта в перевозочном процессе 26.92 KB
  Роль морского транспорта в перевозочном процессе. Перестройка экономики и неизбежный спад производства приватизация речных судов в основном привели к наблюдаемому практическому отсутствию этого вида транспорта в перевозочном процессе. Для возрождения речного транспорта Казахстана необходимо выполнить большие объемы работ по улучшению дна рек созданию навигационных систем судоходства регулированию сроков навигации с учетом периода нереста рыб и т. Для развития водного транспорта Казахстана особое значение имеет Каспийское море и порт Актау.
81855. Техническая политика в области специализации различный видов транспорта 28.16 KB
  Научно-техническая политика на транспорте тесно связана со структурной определение темпов пропорций и приоритетов в развитии транспортной отрасли и инвестиционной определение объема структуры и направлений капиталовложений с целью обновления основных транспортных фондов. Структурная политика направлена: на ускоренное развитие наукоемких составных частей различных видов транспорта определяющих рост производительности труда и повышение социальноэкономической эффективности транспортного производства; на свертывание неэффективных...
81856. Речной транспорт. Тенденции развития 27.28 KB
  Речной транспорт внутренний водный транспорт транспорт осуществляющий перевозки грузов и пассажиров судами по внутренним водным путям как по естественным реки озёра так и по искусственным каналы водохранилища. Перевозки по Каспийскому морю относятся к морскому транспорту хотя фактически это море является озером самым большим в мире. Главным преимуществом речного транспорта является низкая себестоимость перевозок; благодаря ей он продолжает занимать важное место в транспортной системе несмотря на низкие скорости и сезонность.
81857. Транспортный процесс и его элементы 30.31 KB
  Транспортный процесс – это совокупность операций с грузами и транспортными средствами в результате выполнения которых грузы изменяют своё положение в пространстве. Структура транспортного процесса включает три элемента подпроцесса: – процесс погрузки; – процесс перевозки; – процесс разгрузки. Основной элемент транспортного процесса – перевозка грузов все другие элементы подчинены ему.
81858. Основные принципы проектирования транспортных узлов 28.9 KB
  Принцип общей эффективности. Принцип комплексной оптимизации. В основе этого принципа лежит утверждение что независимая оптимизация отдельных подсистем не обеспечивает оптимальности режимов функционирования узла как системы в целом.