5877
Стили классов окон и оконные стили, Различные метрики Windows, Управление окнами Windows
Реферат
Информатика, кибернетика и программирование
Стили классов окон и оконные стили, Различные метрики Windows, Управление окнами Windows Рассмотрим различные типы окон, которые может создать приложение Windows. На базе одного класса окна приложение может создать несколько окон. Все эти окна могут...
Русский
2012-12-23
133.5 KB
11 чел.
Стили классов окон и оконные стили, Различные метрики Windows, Управление окнами Windows
Рассмотрим различные типы окон, которые может создать приложение Windows.
На базе одного класса окна приложение может создать несколько окон. Все эти окна могут быть сделаны в одном или нескольких стилях.
Стиль класса окна
Стиль класса окна определяется при регистрации класса окна. Стиль класса окна задается в виде отдельных битов, для которых определены символические константы с префиксом CS_. Определенный в классе окна стиль класса окна используется при создании всех окон на базе этого класса.
Чаще всего используются стиль CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS. Как уже говорилось, если для класса заданы стили CS_HREDRAW и CS_VREDRAW, то при изменении размеров окна функция окна может получить сообщение WM_PAINT. В этом случае функция окна должна перерисовать часть окна или все окно.
Стиль CS_DBLCLKS используется при необходимости отслеживать двойные щелчки мышью. При этом в функцию окна посылаются сообщения WM_LBUTTONDBLCLK и WM_RBUTTONDBLCLK. Если этот стиль не будет задан, функция окна получит только идущие парами сообщения об одиночном нажатии клавиш мыши WM_LBUTTONDOWN и WM_RBUTTONDOWN.
Стили окон, окна основных стилей
Определенный в классе окна стиль класса окна используется при создании всех окон на базе этого класса. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика - стиль окна. Стиль окна указывается при создании окна функцией CreateWindow. Для определения стиля окна используются символические константы с префиксом WS_.
Рассмотрим чаще всего используемые основные стили: перекрывающиеся окна (overlapped window), всплывающие (или временные, или выпадающие) окна (pop-up window), дочерние окна (child window).
Перекрывающиеся окна
Перекрывающиеся окна имеют заголовок (title bar), рамку и внутреннюю часть окна (client region). Дополнительно перекрывающиеся окна могут иметь системное меню, кнопки для максимального увеличения размера окна и для свертки окна в пиктограмму, вертикальную и горизонтальную полосу просмотра и меню.
Для определения стиля перекрывающегося окна существует символическая константа WS_OVERLAPPEDWINDOW, определенная как поразрядное ИЛИ нескольких констант:
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED| \
WS_CAPTION|WS_SYSMENU|WS_THICKFRAME| \
WS_MINIMIZEBOX|WS_MAXIMIZEBOX)
Приложение Windows может создавать несколько перекрывающихся окон, связанных между собой “узами родства” и “отношениями собственности”. При создании окон при помощи функции CreateWindow в качестве восьмого параметра функции можно указать дескриптор окна-владельца (переменная типа HWND). Окно-владелец уже должно существовать на момент создания окна, имеющего владельца.
Перечислим особенности перекрывающихся окон.
Временные окна
Другим базовым стилем является стиль временных окон, которые обычно используются для вывода информационных сообщений и остаются на экране непродолжительное время. Временные окна, в отличие от перекрывающихся, могут не иметь заголовка. Если для временного меню заголовок определен, тогда оно может иметь и системное меню.
Часто для создания выпадающих окон, имеющих рамку, используется стиль WS_POPUPWINDOW, определенный как поразрядное ИЛИ нескольких констант (для того чтобы к временному окну добавить системное меню и заголовок, следует использовать комбинацию WS_POPUPWINDOW | WS_CAPTION):
#define WS_POPUPWINDOW (WS_POPUP|WS_BORDER|WS_SYSMENU)
Перечислим особенности временных окон.
Дочерние окна
Дочерние окна чаще всего используются приложениями Windows. Эти окна нужны для создания органов управления, таких, как кнопки или списки. Все органы управления - дочерние окна.
Стиль дочернего окна определяется константой WS_CHILDWINDOW. В отличие от перекрывающихся и временных окон дочерние окна, как правило, не имеют рамки, заголовка, кнопок минимизации и максимального увеличения размеров окна, а также полос просмотра. Дочерние окна сами рисуют все, что в них должно быть изображено.
Перечислим особенности дочерних окон.
Пример создания окон различных стилей
Приведем фрагмент функции WinMain, создающей окна разных стилей на основе двух классов окон:
// регистрация классов окон с именами "MainWindow”, "Window1", "Window2"
. . .
// создание главного перекрывающегося окна
HWND hWndMain = CreateWindow("MainWindow","OVERLAPPEDWINDOW",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
if(hWndMain == 0) return FALSE;
ShowWindow(hWndMain, nCmdShow); UpdateWindow(hWndMain);
// создание временного окна
HWND hWndPopup = CreateWindow("Window1","POPUPWINDOW",
WS_POPUPWINDOW|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_VISIBLE,
100,100,300,300, hWndMain,NULL,hInstance,NULL);
if(hWndPopup == 0) { DestroyWindow(hWndMain); return FALSE; }
ShowWindow(hWndPopup, nCmdShow); UpdateWindow(hWndPopup);
// создание дочернего окна
HWND hWndChild = CreateWindow("Window2","CHILDWINDOW",
WS_CHILDWINDOW|WS_CAPTION|WS_MINIMIZEBOX|WS_MAXIMIZEBOX,
150,150,250,250, hWndMain,NULL,hInstance,NULL);
if(hWndChild== 0)
{ DestroyWindow(hWndMain); DestroyWindow(hWndPopup); return FALSE; }
ShowWindow(hWndChild, nCmdShow); UpdateWindow(hWndChild);
// цикл обработки очереди сообщений
. . .
Окна с полосами прокрутки
Полосы прокрутки являются одними из самых лучших возможностей, которые дает графический интерфейс и манипулятор мышь. Они просты в использовании и обеспечивают удобный просмотр информации как в вертикальном, так и в горизонтальном направлениях.
Добавить в окно приложения вертикальную или горизонтальную полосу прокрутки очень просто. Все, что необходимо сделать, это включить стиль WS_VSCROLL и WS_HSCROLL или оба сразу в описание стиля создаваемого функцией CreateWindow окна.
Следует заметить, что
Диапазон и положение полос прокрутки
Каждая полоса прокрутки имеет соответствующий диапазон (range) два целых числа, отражающих минимальное и максимальное значение, и положение (position) местоположение бегунка внутри диапазона. По умолчанию, устанавливается следующий диапазон прокрутки минимум 0 и максимум 100, но диапазон легко изменить на любое другое значение с помощью функции SetScrollRange (для полос прокрутки окна hWnd):
SetScrollRange(hWnd,iBar,iNewMin,iNewMax,bRedraw);
Параметр iBar равен либо SB_VERT, либо SB_HORZ, iNewMin и iNewMax являются минимальной и максимальной границами диапазона, а bRedraw устанавливается в TRUE, если необходимо, чтобы Windows перерисовала полосы в соответствии с новыми значениями.
Положение бегунка всегда дискретно. Например, полоса прокрутки с диапазоном от 0 до 4 имеет пять положений бегунка. Для установки нового положения бегунка можно использовать функцию SetScrollPos:
SetScrollPos(hWnd,iBar,iNewPos,bRedraw);
Если приложение использует полосы прокрутки, то оно совместно с Windows берет на себя ответственность за поддержку полос прокрутки и обновлению положения бегунка.
Перечислим сферы ответственности Windows:
Представим теперь сферы ответственности приложения по поддержке полос прокрутки:
Сообщения полос прокрутки
Windows посылает оконной процедуре сообщения WM_VSCROLL и WM_HSCROLL, когда на полосе прокрутки щелкают мышью или перетаскивают бегунок.
Сразу отметим, что
При работе с оконными полосами прокрутки следует игнорировать параметр lParam, он используется только для полос прокрутки элементов управления. Младшее слово параметра wParam этих сообщений это число, показывающее, что мышь осуществляет какие-то действия на полосе прокрутки. Его значение соответствует определенным идентификаторам, которые начинаются на SB_:
int nScrollCode=(int)LOWORD(wParam); // произведенное действие
short int nPos=(short int)HIWORD(wParam); // текущая позиция
Замечание. Согласно документации, сообщения с кодами SB_TOP и SB_BOTTOM показывают, что полоса прокрутки переведена в свое максимальное или минимальное положение. Однако, если приложение самостоятельно не реализовывает интерфейс для работы с полосой прокрутки при помощи клавиатуры и не посылает само себе такие сообщения по мере необходимости, то тогда оно никогда его не получит от Windows.
Пример обработки сообщений от полосы прокрутки окна
Пусть создано окно hWnd с вертикальной линейкой прокрутки и затем для нее установлены диапазон и текущее положение бегунка:
static int min_sb=1,max_sb=100,pos_sb=20;
SetScrollRange(hWnd,SB_VERT,min_sb,max_sb,TRUE);
SetScrollPos(hWnd,SB_VERT,pos_sb,TRUE);
Рассмотрим фрагмент оконной функции созданного окна, демонстрирующий возможную обработку действий пользователя с вертикальной линейкой прокрутки:
. . .
case WM_VSCROLL:
{
// запоминаем предыдущую позицию бегунка
int old_pos_sb=pos_sb;
// lParam для оконных полос просмотра всегда равен NULL
int nScrollCode=(int)LOWORD(wParam); // произведенное действие
short int nPos=(short int)HIWORD(wParam); // текущая позиция
// изменеяем текущую позицию бегунка
switch(nScrollCode)
{
case SB_PAGEDOWN: pos_sb+=10; break;
case SB_PAGEUP: pos_sb-=10; break;
case SB_LINEDOWN: pos_sb+=1; break;
case SB_LINEUP: pos_sb-=1; break;
case SB_THUMBPOSITION: pos_sb=nPos; break;
case SB_THUMBTRACK: pos_sb=nPos; break;
default: return 0l;
}
if(pos_sb<min_sb) pos_sb=min_sb;
else if(pos_sb>max_sb) pos_sb=max_sb;
if(old_pos_sb!=pos_sb)
SetScrollPos(hWnd,SB_VERT,pos_sb,TRUE);
}; return 0l;
. . .
Различные метрики Windows
В программном интерфейсе Windows имеются функции, позволяющие получить информацию о размерах отдельных компонент Windows, таких, как ширина рамки окна, ширина и высота экрана и т.п. Эта информация нужна для определения габаритов и расположения создаваемых окон и других изображений.
Системные метрики
Метрики системных компонент Windows можно определить при помощи функции GetSystemMetrics. Единственный аргумент этой функции задает параметр, значение которого необходимо определить:
int GetSystemMetrics(int nIndex);
Для определения того или иного компонента в заголовочных файлах Windows имеются константы с префиксом SM_. Рассмотрим некоторые из них:
Приведем пример определения высоты графического экрана:
int h=GetSystemMetrics(SM_CYSCREEN);
Определение возможностей устройств ввода/вывода
В программном интерфейсе Windows имеется функция, позволяющая по контексту устройства определить возможности и параметры драйверов, обслуживающих устройства ввода/вывода:
int GetDeviceCaps(HDC hdc, int iCapability);
Замечание. Остановимся на некоторых из возможных значений параметров устройства. Значения ASPECTX, ASPECTY, ASPECTXY определяют размеры пиксела. Дело в том, что пикселы не всегда квадратные. Поэтому масштаб изображения по оси x может отличаться от масштаба по оси y. Размеры пиксела позволяют вычислить отношение сторон пиксела и выполнить правильное масштабирование. В этом случае отображаемые окружности будут круглыми, а квадраты - квадратными.
Приведем пример получения информации о соотношение размеров пиксела по осям X и Y при обработке сообщения WM_PAINT в некоторой оконной функции:
case WM_PAINT:
{ PAINTSTRUCT ps;
HDC hDC=BeginPaint(hWnd,&ps); // получение контекста отображения окна hWnd
int asp_xy=GetDeviceCaps(hDC,ASPECTXY);
. . . // использование asp_xy
EndPaint(hWnd,&ps);
}; return 0;
Определение размера окна
Приложение Windows, как правило, не знает заранее размеров отведенных ему окон. К тому же в любой момент эти размеры можно изменить при помощи мыши. Поэтому приложение Windows должно уметь определять размеры своих окон.
Существует два разных метода определения размера окна.
Первый метод основан на том факте, что при изменении размера окна функция окна получает сообщение WM_SIZE, параметры которого несут с собой информацию о новых размерах. Параметры сообщения WM_SIZE описывают новый размер окна и способ, которым оно изменило размер:
wParam - способ, при помощи которого окно изменило свой размер;
LOWORD(lParam) - новая ширина клиентской части окна;
HIWORD(lParam) - новая высота клиентской части окна.
Параметр wParam может принимать одно из нескольких значений, символические имена которых начинаются с префикса SIZE_ (например, SIZE_MAXIMIZED окно было максимизировано).
Второй метод определения размеров окна заключается в вызове функций, возвращающих размеры окна по его идентификатору. Например, функция GetClientRect предназначена для определения координат внутренней области окна (эти координаты вычисляются относительно левого верхнего угла внутренней области окна):
void GetClientRect(HWND hwnd, RECT FAR* lprc);
Приведем фрагменты оконной функции, определяющей размеры клиентской части окна двумя способами и осуществляющей вывод в зависимости от этих размеров:
static h, w;
. . .
case WM_SIZE:
{ w=LOWORD(lParam); h=HIWORD(lParam);
InvalidateRect(hWnd,NULL);
UpdateWindow(hWnd);
}; return 0;
. . .
case WM_PAINT:
{ PAINTSTRUCT ps;
HDC hDC=BeginPaint(hWnd,&ps);
// 1-ый способ вывода в соответствии с текущими размерами окна
. . . // вывод с использованием значений w и h
EndPaint(hWnd,&ps);
}; return 0;
или
. . .
case WM_PAINT:
{ PAINTSTRUCT ps;
HDC hDC=BeginPaint(hWnd,&ps);
// 2-ой способ вывода в соответствии с текущими размерами окна
Rect r; GetClientRect(hWnd,&r);
. . . // вывод с использованием значений полей структуры r
EndPaint(hWnd,&ps);
}; return 0;
. . .
Определение расположения окна
В предыдущем разделе показано, как определять размеры окна. Другая важная задача - определение расположения окна на экране.
При перемещении окна функция окна получает сообщение WM_MOVE, вместе с ним она получает новые координаты внутренней области окна:
wParam - не используется;
LOWORD(lParam) - X-координата верхнего левого угла клиентской части окна;
HIWORD(lParam) - Y-координата верхнего левого угла клиентской части окна.
Замечание. Для окон, имеющих стили WS_OVERLAPPED и WS_POPUP, координаты отсчитываются от верхнего левого угла экрана. Для окон стиля WS_CHILD эти координаты отсчитываются от верхнего левого угла внутренней области родительского окна.
В любой момент времени приложение может также определить расположение и размер окна, вызвав функцию:
void GetWindowRect(HWND hwnd, RECT FAR* lprc);
Метрики текста
Приложения Windows могут выводить текст с использованием различных шрифтов. Прежде всего, следует отметить, что
Все шрифты можно разделить на две группы относительно ширины букв:
Кроме того,
Шрифты также можно разделить на следующие группы относительно начертания:
В контекст отображения по умолчанию выбран так называемый системный шрифт SYSTEM_FONT. Системный шрифт используется в Windows, например, для текста в заголовках окон, меню и диалоговых панелях.
Переменная ширина букв усложняет задачу вывода текста, но в составе программного интерфейса Windows имеется функция, предназначенная для подсчета длины текстовой строки lpszString длиной cbString
DWORD GetTextExtent(HDC hdc, LPSTR lpszString,int cbString);
Для получения информации о шрифте, выбранном в контекст устройства, предназначена функция:
BOOL GetTextMetrics(HDC hdc, TEXTMETRIC FAR* lptm);
Хорошо спроектированное приложение позволяет пользователю выбирать для отображения текста произвольные шрифты. Поэтому приложение никогда не должно ориентироваться на конкретные размеры шрифта. Вместо этого следует определять эти размеры динамически с помощью специально предназначенных для этого средств.
Управление окнами Windows
Окно в Windows можно определить как прямоугольную область на экране. Однако это определение в своей простоте скрывает множество функциональных возможностей под абстрактной идеей окна как основной единицы взаимодействия пользователя и Windows-приложения.
Окна Windows
Окно это не только область на экране, посредством которой приложение может представить свой вывод, это еще и адресат событий и сообщений в среде Windows.
Естественно, Win32 API предоставляет множество функций по созданию и управлению окнами.
Иерархия окон
Windows организует свои окна в иерархическую структуру:
Между окнами верхнего уровня (перекрывающиеся и всплывающие окна) существует еще одна иерархическая связь. Владельцем окна верхнего уровня может быть другое окно того же уровня. Окно, имеющее владельца, всегда отображается поверх своего владельца и исчезает при минимизации окна-владельца.
Рассмотрим несколько наиболее часто употребляемых функций, позволяющих приложению исследовать иерархию окон и находить определенные окна:
Сообщения управления окнами
Типичное окно отвечает на множество сообщений. Приведем обзор наиболее часто обрабатываемых сообщений:
Оконная процедура, стандартные оконные процедуры
Каждое окно связано с классом окна. Класс окна это класс, или предоставляемый Windows (заранее определенный класс), или определенный пользователем и зарегистрированный с помощью функции RegisterClass.
Наиболее примечательным, но, разумеется, не единственным свойством класса окна является оконная процедура. Именно через оконную процедуру реализуется поведение окна. Отвечая на различные сообщения, оконная процедура определяет реакцию окна на события мыши и клавиатуры и изменение его внешнего вида в соответствии с этими событиями.
Оконная процедура вызывается каждый раз, когда сообщение посылается окну с помощью функции SendMessage, и каждый раз, когда сообщение отправляется окну посредством функции DispatchMessage. Роль оконной процедуры заключается в обработке посланных и отправленных этому окну сообщений, при этом она может пользоваться оконной процедурой по умолчанию для обработки не интересующих ее сообщений.
Windows поддерживает две оконные процедуры по умолчанию: DefWindowProc и DefDlgProc.
Кроме оконных процедур по умолчанию, Windows также поддерживает множество классов окон. Они реализуют такие элементы управления диалоговых окон, как кнопки, поля ввода и другие. Такие классы называются системными (предопределенными)т классами.
Является ли класс поддерживаемым Windows или определенным приложением, приложение может использовать любой существующий класс (системный или определенный приложением) для порождения нового класса и реализации его нового или измененного поведения. Для этого используются механизмы, называемые разбиением на субклассы (подклассы) или объединение в суперклассы.
Замечание. Следует только заметить, что
Разбиение на субклассы - замещение оконной процедуры
Разбиение на суперклассы (subclassing) подразумевает замещение оконной процедуры класса окна другой процедурой. Это выполняется с помощью вызова функции SetWindowLong или SetClassLong.
Замечание. Отметим, что
Рассмотрим простой пример, в котором системный класс “button” разбивается на субклассы, обеспечивая замещение оконной процедуры. Замещающая процедура реализует специальную реакцию на получение сообщения WM_LBUTTONUP.
. . .
// глоб. переменная - для хранения адреса старой оконной функции
FARPROC OldWndProc;
// объявление новой оконной функции
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
. . .
. . .
// <--- начало фрагмента кода некоторой функции ---
// создание субкласса класса "button"
HWND hWnd=CreateWindow("button","subclass",WS_VISIBLE|BS_CENTER,
100,100,200,50,NULL,NULL,hInstance,NULL);
OldWndProc=(FARPROC)SetWindowLong(hWnd,GWL_WNDPROC,(LONG)WndProc);
// --- конец фрагмента кода некоторой функции --->
. . .
// определение новой оконной функции
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg, WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONUP: MessageBeep(-1); break;
default: return CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
}
return 0l;
}
Замечание. В приведенном выше примере разбиение на субклассы выполняется с помощью функции SetWindowLong; подразумевая, что это повлияет только на отдельное окно кнопки, для которого вызывается SetWindowLong. Если вместо этого вызвать SetClassLong, то изменится поведение всех кнопок, созданных приложением впоследствии.
Объединение в суперклассы - использование информации о классе
Объединение в суперклассы предполагает создание нового класса на основе поведения существующего. Чтобы применить эту операцию к существующему классу, приложение может использовать функцию GetClassInfo для получения описывающей этот класс структуры WNDCLASS. После соответствующего изменения этой структуры, ее можно использовать в вызове функции RegisterClass для регистрации нового класса.
Рассмотрим пример, который демонстрирует этот механизм объединения в суперклассы. В этом примере создается новый класс “beepbutton”, функциональные возможности которого основаны на классе по умолчанию “button”. Отметим, что поведение окон стандартного класса "button" при этом не изменяется.
. . .
// глоб. переменная - для хранения адреса старой оконной функции
FARPROC OldWndProc;
// объявление новой оконной функции
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
. . .
. . .
// <--- начало фрагмента кода некоторой функции ---
// создание суперкласса "button"
WNDCLASS wc;
GetClassInfo(hInstance,"button",&wc);
wc.lpszClassName="beepbutton";
wc.hInstance=hInstance;
OldWndProc=(FARPROC)wc.lpfnWndProc;
wc.lpfnWndProc=(WNDPROC)WndProc;
RegisterClass(&wc);
HWND hWnd=CreateWindow("beepbutton","superclassing",WS_VISIBLE|BS_CENTER,
100,100,200,50,NULL,NULL,hInstance,NULL);
// --- конец фрагмента кода некоторой функции --->
. . .
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_LBUTTONDOWN: MessageBeep(-1);
default: return CallWindowProc(OldWndProc,hWnd,msg,wParam,lParam);
}
return 0l;
}
Итак, разница между двумя между двумя механизмами разбиением на субклассы и объединением в суперклассы очевидна с точки зрения их реализации. Осталось выяснить их разницу в плане применения, определить, когда необходимо использовать разбиение на субклассы, а когда объединение в суперклассы:
Другими словами,
А также другие работы, которые могут Вас заинтересовать | |||
70594. | Построения организационно-функциональной модели компании | 149.76 KB | |
На основании миссии формируются цели и стратегии компании. Объединяя классификаторы в функциональные группы и закрепляя между собой элементы различных классификаторов с помощью матричных проекций можно получить модель организационной структуры компании. | |||
70595. | Шаблоны организационного бизнес-моделирования | 113.52 KB | |
Миссия представляет собой результат позиционирования компании среди других участников рынка. Поэтому миссию компании нельзя описывать путем анализа ее внутреннего устройства. Для построения модели взаимодействия компании с внешней средой определение миссии компании на рынке необходимо... | |||
70596. | Полная бизнес-модель компании | 98.29 KB | |
Организационный анализ компании при таком подходе проводится по определенной схеме с помощью полной бизнес-модели компании. Возможности компании определяются характеристиками ее структурных подразделений и организацией их взаимодействия. | |||
70597. | Типовое проектирование ИС | 46 KB | |
Типовое проектное решение ТПР это тиражируемое пригодное к многократному использованию проектное решение. Принятая классификация ТПР основана на уровне декомпозиции системы. Выделяются следующие классы ТПР: элементные ТПР типовые решения по задаче или по отдельному виду обеспечения... | |||
70599. | Безопасность жизнедеятельности, курс лекций | 626 KB | |
Чрезвычайная ситуация (ЧС) — обстановка на определенной территории, сложившаяся в результате аварии, опасного природного явления, катастрофы, стихийного или иного бедствия, которые могут повлечь или повлекли за собой человеческие жертвы, ущерб здоровью людей или окружающей природной среде, значительные материальные потери и нарушение жизнедеятельности людей. | |||
70602. | МОДУЛИРОВАННЫЕ СИГНАЛЫ | 177.5 KB | |
Дискретизация непрерывных сигналов заключается в том, что вместо передачи непрерывного сигнала передаются лишь значения его в отдельные моменты времени, взятые достаточно часто, чтобы по ним можно было воспроизвести непрерывный ситная | |||