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


 

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

81320. Підстави та порядок відмови у відкритті виконавчого провадження 25.99 KB
  Про відмову у відкритті виконавчого провадження державний виконавець виносить постанову протягом трьох робочих днів, а за рішенням, що підлягає негайному виконанню, - не пізніше наступного робочого дня з дня надходження виконавчого документа і не пізніше наступного дня надсилає її заявникові разом з виконавчим документом.
81321. Підготовчі дії до виконання рішення. Об’єднання виконавчих проваджень 25.99 KB
  У разі якщо в органі державної виконавчої служби відкрито кілька виконавчих проваджень про стягнення коштів з одного боржника вони обєднуються у зведене виконавче провадження і на майно боржника накладається арешт у межах загальної суми стягнення виконавчого збору і можливих витрат повязаних з організацією та проведенням виконавчих дій...
81322. Добровільне виконання рішень 26.32 KB
  Державний виконавець починаючи виконувати рішення повинен пересвідчитись чи отримана боржником копія постанови про відкриття виконавчого провадження і чи здійснені ним дії спрямовані на добровільне виконання рішення у встановлений постановою строк. При цьому до отримання відомостей про одержання боржником копії постанови для захисту прав стягувача державний виконавець може вжити заходів щодо забезпечення виконання Постанова про відкриття виконавчого провадження вважається врученою боржнику за адресою зазначеною у виконавчому документі. У...
81323. Час провадження виконавчих дій 22 KB
  Конкретний час проведення виконавчих дій визначається державним виконавцем. Сторони виконавчого провадження мають право пропонувати зручний для них час проведення виконавчих дій. Проведення виконавчих дій у неробочі та святкові дні установлені законодавством допускається лише в разі коли зволікання неможливе або в разі коли вони не можуть бути здійснені в інші дні з вини боржника.
81324. Витрати виконавчого провадження 27.08 KB
  До інших витрат на організацію виконавчих дій належать витрати на виплату винагороди державним виконавцям відповідно до статті 47 Закону; придбання службових житлових приміщень; придбання службових приміщень; страхування державних виконавців; забезпечення державних виконавців форменим одягом
81325. Ускладнення у виконавчому провадженні. Відкладення провадження виконавчих дій 21.48 KB
  Відкладення провадження виконавчих дій. За наявності обставин що перешкоджають провадженню виконавчих дій або несвоєчасного одержання сторонами документів виконавчого провадження внаслідок чого вони позбавлені можливості використати надані їм Законом права державний виконавець може відкласти виконавчі дії за заявою стягувача або за заявою боржника або з власної ініціативи на строк до 10 днів. Про відкладення провадження виконавчих дій державний виконавець виносить відповідну постанову про що негайно повідомляє сторони суд або інший...
81326. Відстрочка або розстрочка виконання, встановлення чи зміна способу і порядку виконання рішення 21.43 KB
  За наявності обставин що ускладнюють виконання рішення або роблять його неможливим державний виконавець за власною ініціативою або за заявою сторін а також самі сторони мають право звернутися до суду який видав виконавчий документ із заявою про відстрочку або розстрочку виконання а також про встановлення чи зміну способу й порядку виконання Рішення суду чи іншого органу посадової особи про відстрочку або розстрочку виконання встановлення чи зміну способу й порядку виконання має бути прийнято в 10денний строк і може бути оскаржено у...
81327. Зупинення виконавчого провадження (поняття, види, порядок і строки зупинення) 29.99 KB
  Виконавче провадження підлягає обовязковому зупиненню у випадках: смерті стягувача або боржника оголошення померлим чи визнання безвісно відсутнім стягувача або боржника або припинення існування сторони юридичної особи якщо установлені судом правовідносини допускають правонаступництво; визнання стягувача або боржника недієздатним; проходження боржником строкової військової служби в Збройних Силах України та інших військових формуваннях якщо за умовами служби провадження виконавчих дій неможливе чи на прохання стягувача який проходить...
81328. Підстави та порядок повернення виконавчого документа стягувачеві 27.76 KB
  Виконавчий документ який прийнятий державним виконавцем до виконання і за яким стягнення не провадилося або було проведено частково повертається стягувачеві: за письмовою заявою стягувача; якщо в боржника відсутнє майно на яке може бути звернено стягнення і здійснені державним виконавцем відповідно до Закону заходи щодо розшуку такого майна виявилися безрезультатними; якщо стягувач відмовився залишити за собою майно боржника не реалізоване під час виконання рішення одержати певні предмети що повинні бути передані йому від боржника...