Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Выбор семейств шрифтов. Окна сообщений Windows. Окна диалога Windows. Шрифты Windows. Растровые изображения Windows. Перья Windows. Кисти Windows.

Читайте также:
  1. II. Курсы по выбору
  2. Unique способность» — умение задать точный вопрос, чтобы определиться с выбором.
  3. Активные изображения
  4. Актиноиды (или акт и н и д ы) — это семейство четырна­дцати /-элементов с порядковыми номерами от 90 до 103, следую­щее в периодической системе после актиния.
  5. Анализ альтернативных проектов и выбор наиболее предпочтительного
  6. Анализ внешней среды и выбор целевого рынка
  7. Аналитический обзор технологии получения широкогорлой тары и выбор способа производства

Windows можно отнести к классу многозадачных ОС, основанных на передаче

сообщений. В "глубине" ОС реализован механизм, преобразующий информацию от

различных устройств ввода/вывода (события) в некоторую структуру данных – со-

общение. Примерами событий являются нажатие клавиши, перемещение мыши, тик таймера. Типичное приложение (так обычно называются прикладные программы для Windows) строится на базе каркаса, содержащего цикл обработки сообщений. В этом цикле выполняется прием сообщений и передача их в соответствующие функции-обработчики сообщений.

Сообщения, хотя и посылаются приложениям, но адресуются не им, а другим

важнейшим компонентам ОС – окнам. Окно – это не просто прямоугольная область

на экране, а некоторый объект, предназначенный для организации взаимодействия

между пользователем и приложением.

При запуске приложения в Windows происходит создание процесса. Но ОС не

выделяет для него процессорного времени. Процессу принадлежат открытые файлы, участки оперативной памяти и другие ресурсы. Кроме того, ему принадлежит программный поток. Поток, фактически, – это набор значений внутренних регистров процессора. Поток содержит информацию о том, какая машинная команда выполняется процессором в данный момент и где расположены локальные переменные. ОС выделяет квант времени каждому из работающих на компьютере потоков, т.о. в ОС обеспечивается многозадачность.

У одного процесса может быть несколько потоков. Например, в текстовом ре-

дакторе один поток может обрабатывать ввод данных от пользователя, а другой передавать документ на принтер.

Окно всегда "принадлежит" потоку. Поток может владеть одним или несколь-

кими окнами, а также может не иметь ни одного окна. Окна потока сами находятся в иерархической связи: некоторые из них являются окнами верхнего уровня, а некоторые – дочерними окнами других окон (рис. 1.1).

 

В Windows существует большое количество разных типов окон. Некоторые из

них очевидны, например, главное окно приложения (о котором пользователь обычно думает, что это и есть приложение) и диалоговые окна. Менее очевидно, что большинство элементов управления в окнах приложений и диалоговых окнах тоже являются окнами. Каждая кнопка, строка ввода, полоса прокрутки, список, пиктограмма и даже фон рабочего стола рассматриваются ОС как окна.

На рис. 1.2 показан рабочий стол Windows 95 c двумя запущенными приложе-

ниями (Блокнот и Калькулятор). Каждое окно, в том числе кнопки, выделено черной рамкой (изображение получено с помощью утилиты Spy++ из комплекта Visual C++).

 

По трем признакам (ширина штриха, ширина символов и наличию засечек) в Windows принято выделять так называемые семейства шрифтов. Сводка характеристик разных семейств шрифтов в Windows:

Семейство Ширина штриха Ширина символов Наличие засечек Примеры
MODERN постоянная постоянная Courier New
ROMAN переменная переменная есть Times New Roman, Antiqua, Garamond, Palatino, Bodoni
SWISS переменная переменная нет Arial, Helvetica, Futura, Avantgarde, Optima, Swiss
SCRIPT Script, Odessa Script FWF, Decor, Jikharev, Parsek
DECORATIVE Windings, MusicalSymbols, Symbol
DONTCARE

 

Обычно к семейству MODERN относят все шрифты фиксированной ширины (получили распространение с развитием печатающей техники и компьютеров, тогда как другие виды шрифтов возникали с XV века, когда заканчивалась эпоха готического шрифта). В те времена начинал формироваться шрифт, похожий по своему начертанию на один из древнейших шрифтов - римский капитальный (такие шрифты относятся к семейству ROMAN). Шрифты, кот-е не имеют контраста и засечек (sans serif), в Windows им соответствует семейство SWISS. Семейство DONTCARE реально не соответствует никакой группе шрифтов. Оно используется только при указании, из какого семейства надо выбирать шрифт - при этом оно обозначает “любое семейство”.

В стандартной поставке Windows присутствует небольшой набор шрифтов, представляющий все (определенные в Windows) семейства шрифтов. Этот набор включает в себя растровые, векторные и TrueType шрифты, информация о которых сведена в небольшую таблицу:

 

Имя шрифта семейство кодовая таблица файл(ы)
растровые шрифты
System SWISS ANSI xxxSYS.FON
FixedSys DONTCARE ANSI xxxFIX.FON
Terminal MODERN OEM xxxOEM.FON
Courier MODERN ANSI COURy.FON
MS Sans Serif SWISS ANSI SSERIFy.FON
MS Serif ROMAN ANSI SERIFy.FON
Small Fonts ROMAN ANSI SMALLy.FON
Symbol DECORATIVE SYMBOL SYMBOLy.FON
векторные шрифты
Modern MODERN OEM MODERN.FON
Roman ROMAN OEM ROMAN.FON
Script SCRIPT OEM SCRIPT.FON
TrueType
Arial SWISS ANSI ARIALzz.TTF(.FOT)
Courier New MODERN ANSI COURzz.TTF(.FOT)
Times New Roman ROMAN ANSI TMSRMN.TTF(.FOT)
Windings DONTCARE ANSI WINDINGS.TTF(.FOT)

 

В этой таблице следует внимательно рассмотреть имена файлов. В этих именах маленькими буквами (xxx,y,zz) обозначены изменяющиеся части.

Так xxx обозначает устройство, для которого был спроектирован шрифт. Вместо этой последовательности реально написано CGA, EGA, VGA или 8514.

Символ y обозначает категорию устройств, к которой относится данный шрифт.

Последовательность zz указывает, какого типа шрифт описан в этом файле: нормальный (пустая последовательность), жирный BD, наклонный I или жирный наклонный BI.

Если Вам надо получить хендл, он же дескриптор (это как id в базах данных, все операции с окнами (окно-практически всё от кнопки, надписи, переключателя, панельки)... т. е. показать, переместить, задать цвет, текст -- это всё можно делать только указав handle объекта. handle у любого объекта появляется при его создании, и удаляется при уничтожении, т. е. создалась кнопка - ей присвоили handle, все дальнейшие операции с ней делаются по этому handle (его надо хранить в переменной)) стандартного шрифта, то Вы можете воспользоваться функцией:

HFONT GetStockObject(nIndex);

где параметр nIndex соответствует разл шрифтам(наприм, ANSI_FIXED_FONT соответствует шрифту Courier)

Если Вам надо создавать собственный шрифт, то Вы можете воспользоваться одной из двух функций:

HFONT CreateFont(

nHeight, nWidth, nEscapement, nOrientation, nWeight,

bItalic, bUnderline, bStrikeOut,

bCharSet, bOutputPrecision, bClipPrecision, bQuality, bPitchAndFamily,

lpszFacename);

или

HFONT CreateFontIndirect(lpLogFont);

После того, как Вы получили хендл шрифта, Вы можете осуществить вывод текста, используя этот шрифт. Для этого Вы должны выбрать шрифт в контекст устройства с помощью функции

SelectObject(hDC, hFont);

Все последующие операции вывода будут использовать тот шрифт, который Вы выбрали в контекст устройства. Если Вам надо получить информацию о загруженном шрифте, то Вы можете воспользоваться функциями:

int GetTextFace(hDC, nMaxBuffer, lpsBuffer);

int GetObject(hFont, sizeof(LOGFONT), &stLogfont);

Функция GetTextFace() заполняет указанный буфер именем применяемого шрифта, а функция GetObject() позволяет заполнить структуру LOGFONT информацией о конкретном шрифте.

В Windows есть понятия дескрипторов (Handle) окна, дескрипторов контекста устройства и дескрипторов объекта, соответственно английские термины handle window (hWND), handle device context (hDC) и handle object (это общее название). Под hWND понимаются такие элементы как форма, кнопки, панели и т.д., с помощью этого дескриптора элементам передаются сообщения и данные, а вот с помощью hDC производятся графические операции с содержимым самого объекта.

Контекст устройства - структура, которая определяет набор графических объектов, их свойств и способов воздействия на объект. Графические объекты включают перо (pen) для линии, кисть (brush) для заполнения, битовая плоскость (bitmap) для копирования или прокручивания частей экрана, палитра (palette) для определения набора доступных цветов, регион (region) для усечения областей и других действий.

Дескриптор объекта - это вообще независимая штука, она может существовать отдельно от hWND и hDC (эти же работают в паре). К дескрипторам объекта (далее hOBJ) относятся перья системы рисования (Pen - цвет пера, толщина и тип линии), кисть, заполняющая область (Brush - цвет кисти, стиль и вид шаблона заполнения) и т.д.

Для осуществления операций вы всегда должны, затребовать какой - либо дескриптор. Затребовав hDC, вы обязаны вернуть его системе, иначе по истечению времени Windows прекратит все операция рисования и просто зависнет.

Поясним на примере понятия дескрипторов. Лист бумаги назовем оконным элементом, т.е. он имеет hWND, чтобы что-либо на нем нарисовать необходимо, получить его hDC. У вас есть три карандаша разного цвета (красный, черный, зеленый). Взяв карандаш в руки, производится выбор объекта в контекст листа бумаги. Затем, используя методы перемещения карандаша, вы рисуете по поверхности. Вот в принципе и все.

Общий принцип работы (упрощенно) можно свести к следующему:


ВНИМАНИЕ! Когда вы создали объект и выбрали его в контекст, сохраните предыдущий объект. Затем после всех своих операций верните его в контекст и удалите созданный объект.

Составим техническое задание на разработку. Написать редактор векторной графики, который позволял бы изменять свойства фигур (цвет, толщина линий и заливка областей), перемещал фигуры по плоскости и изменял их размеры. Для простоты используем всего две фигуры: прямоугольник и окружность. Нарисуем их сначала в фиксированных позициях и с заранее заданными свойствами. Выбор фигур (пока) производится через меню.

Большинство коммерческих программ (например, кроме ErWin) используют принцип виртуального окна, т.е. окна находящегося в оперативной памяти с размерами и характеристиками области вывода на экране. Все операции рисования производятся с ним, а затем оно выводится в нужное место экрана (хотя необязательно на экран, но и на принтер), операцией копирования битовых плоскостей.

Структуры и константы

Хранит координаты прямоугольника.

Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type


Хранит координаты точки.

Public Type POINTAPI
X As Long
Y As Long
End Type


Хранит параметры пера.

Public Type LOGPEN
lopnStyle As Long - стиль пера
lopnWidth As POINTAPI - толщина пера (это структура)
lopnColor As Long - цвет пера
End Type


Хранит параметры кисти.

Public Type LOGBRUSH
lbStyle As Long - стиль кисти
lbColor As Long - цвет кисти
lbHatch As Long - шаблон заполнения
End Type


Константы приведены не все, за полным списком обратитесь в SDK графики MSDN.

Public Const BS_SOLID = 0 - Полная заливка фигуры
Public Const BS_HATCHED = 2 - Стиль установки шаблона
Public Const HS_CROSS = 4 - Шаблон сетки
Public Const HS_BDIAGONAL = 3 - Диагональный шаблон
Public Const PS_SOLID = 0 - Сплошное перо
Public Const WHITENESS = &HFF0062 - Заливка шаблона белым цветом
Public Const SRCCOPY = &HCC0020 - Копирование битовых карт


Функции

Где пропущено описание типа подразумевается тип Long.

GetDC (hwnd) --- Получает дескриптор контекста устройства для указанного hWnd.

CreateCompatibleBitmap (HDC, nWidth, nHeight) --- Создает совместимую битовую карту из контекста HDC размерами (nWidth, nHeight).

CreateCompatibleDC (HDC) --- Создает совместимый дескриптор контекста из указанного HDC.

ReleaseDC (hwnd, HDC) --- Удаляет дескриптор контекста HDC для дескриптора окна hWnd.

SelectObject (HDC, hObject) --- Выбирает в контекст HDC объект, задаваемый дескриптором hObject.

PatBlt (HDC, x, y, nWidth, nHeight, dwRop) --- Заполняет контекст HDC от координат (x,y,nWidth,hHeight) используя текущую кисть контекста в соответствии с операцией dwRop.

DeleteObject (hObject) --- Удаляет дескриптор hObject.

DeleteDC (HDC) --- Удаляет контекст HDC.

BitBlt (hDestDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop) --- Копирует битовую область, из контекста hSrcDC, начиная с координат (xSrc, ySrc) в соответствии с растровой операцией dwRop в битовую область контекста hDestDC в координаты (x, y, nWidth, nHeight).

InvalidateRect (hwnd, pRect As RECT, bErase) --- Вызывает событие обновления поверхности окна для дескриптора окна hWnd в области прямоугольника, задаваемого координатами pRect. Если bErase равен истине, то производится очистка фона.

Rectangle (HDC, X1, Y1, X2, Y2) --- Рисует прямоугольник в контексте HDC по координатам (X1, Y1, X2, Y2).

Ellipse (HDC, X1, Y1, X2, Y2) --- Рисует окружность в контексте HDC по координатам (X1, Y1, X2, Y2).

Описание процедур программы

В форме Visual Basic свойство AutoRedraw установите в True, иначе при выводе виртуального окна будет происходить мерцание. Свойство ScaleMode установите в Pixels, т.к. все функции работаю с пикселями и для других единиц необходимо проводить преобразование.

Первым делом создаем виртуальное окно, процедурой CreateVirtualWindow. Вот её текст.

' В этой переменной хранится временный дескриптор контекста окна
Dim CDC As Long
' Получаем дескриптор контекста холста
CDC = GetDC(Me.hwnd)
' Создаем совместимый дескриптор
MDC = CreateCompatibleDC (CDC)
' Создаем совместимую битовую карту с картой битов холста
MBM = CreateCompatibleBitmap (CDC, RectForm.Right, RectForm.Bottom)
' Удаляем дескриптор
ReleaseDC Me.hwnd, CDC
' Выбираем битовую карту во временный контекст
SelectObject MDC, MBM
' Заливка области белым цветом (для простоты)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITENESS


Пояснение. Используя функцию GetDC, получаем дескриптор контекста формы через hWND объекта Me. Затем нам надо создать совместимый контекст устройства для нашего виртуального окна, т.к. это должно быть два разных объекта, но с идентичными характеристиками. Все это производится функций CreateCompatibleDC, полученный hDC сохраняем в глобальной переменной MDC типа Long. Так как виртуальное окно, по сути битовая карта, то с помощью функции CreateCompatibleBitmap создаем битовую карту нашего окна с размерами указанными нами заранее (смотрите исходный текст в процедуру Form_Load) и полученный дескриптор сохраняем в глобальной переменной MBM типа Long. Затем, обратите внимание, удаляем временный дескриптор CDC через функцию ReleaseDC, это важная операция. Напоследок выбираем в наш контекст полученную битовую карту с помощью функции SelectObject. Очистку области производим с помощью функции PatBlt.

Уничтожение виртуального окна, производится процедурой DestroyVirtualWindow.

Sub DestroyVirtualWindow()
' Удалить битовую карту
DeleteObject MBM
' Удалить дескриптор
DeleteDC MDC
End Sub


Пояснение. После окончания работы приложения виртуальное окно должно быть уничтожено, чтобы освободить ресурсы. Первым удаляем битовую карту функцией DeleteObject, затем уничтожаем контекст функцией DeleteDC.

Вывод виртуального окна на экран, процедурой InvalidateCanvas.

Sub InvalidateCanvas()
' Используем переменную RectForm, чтобы ускорить операцию получения координат.
' Маленькая оптимизация.
Call InvalidateRect(Me.hwnd, RectForm, False)
' Заливка области белым цветом (для простоты)
PatBlt MDC, 0, 0, RectForm.Right, RectForm.Bottom, WHITENESS
' Перерисовать фигуры
Call DrawFigures(MDC, SHAPE_RECT)
Call DrawFigures(MDC, SHAPE_ELLIPSE)
' Вывести виртуальное окно на форму
BitBlt Me.HDC, RectForm.Left, RectForm.Top, RectForm.Right, RectForm.Bottom, MDC, 0, 0, SRCCOPY
End Sub


Пояснение. Чтобы вывести наше окно на экран, вызываем функцию InvalidateRect, которая посылает сообщение форме, что она должна перерисоваться (здесь кроется одна тонкость, связанная с событием Paint формы и свойством AutoRedraw, предлагаю вам самим с этим разобраться, тогда вы точно поймете тонкости рисования). Далее опять очищаем окно белым цветом. Выводим фигуры в окно через собственную процедуру DrawFigures. И самое главное, выводим виртуальное окно в форму через функцию битового копирования BitBlt.

Отображение фигуры на виртуальном окне, процедурой DrawFigures.

Sub DrawFigures(HDC As Long, IndexFigure As Byte)
' Дескрипторы пера
Dim NewPen, OldPen As Long
' Дескрипторы кисти
Dim NewBrush, OldBrush As Long
' Создаем перо из структуры заданной фигуры
NewPen = CreatePenIndirect(Figures(IndexFigure).Pen)
' Создаем кисть из структуры заданной фигуры
NewBrush = CreateBrushIndirect(Figures(IndexFigure).Brush)
' Выбираем созданные дескрипторы пера и кисти в контекст
OldPen = SelectObject(HDC, NewPen)
OldBrush = SelectObject(HDC, NewBrush)
Select Case Figures(IndexFigure).Shape
Case SHAPE_RECT:
Call ShapeRect(HDC, Figures(IndexFigure).Coord)
Case SHAPE_ELLIPSE:
Call ShapeEllipse(HDC, Figures(IndexFigure).Coord)
End Select
' Выбираем в контекст старые кисть и перо
' ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
SelectObject HDC, OldBrush
SelectObject HDC, OldPen
' Удаляем новые кисть и перо
' И ЭТО ОЧЕНЬ ВАЖНАЯ ОПЕРАЦИЯ
DeleteObject (NewBrush)
DeleteObject (NewPen)
End Sub


Пояснение. В данную процедуру передается дескриптор контекста и индекс типа фигуры, которую необходимо нарисовать. Далее используя функции CreatePenIndirect и CreateBrushIndirect, создаем из структур новое перо и кисть. Сохраняем полученные дескрипторы объектов в локальных переменных (после окончания процедуры они нам будут не нужны) NewPen и NewBrush типа Long. Выбираем новое перо и кисть в контекст, сохраняя при этом предыдущие значения в переменных OldPen и OldBrush, функцией SelectObject. Рисуем фигуры. Возвращаем предыдущие значения. Удаляем дескрипторы новых объектов.


Дата добавления: 2015-09-03; просмотров: 123 | Нарушение авторских прав


Читайте в этой же книге: Абстракция | Классы map и multimap | Сортировка. | Специальный класс string ( в методичках Белодеда по-другому, поэтому это только для ознакомления и на всякий случай) | Математические функции (math.h). Построение таблицы значений тригонометрических функций. | Интерфейс вызовов функций в Windows | Общие принципы и средства программирования для Windows. Графический интерфейс пользователя. Многозадачная среда. Преимущества ввода посредством очереди. | Преимущества ввода посредством очереди. | Окна в Windows | Элементы интерфейса Windows |
<== предыдущая страница | следующая страница ==>
Значок (пиктограмма)| Выбор семейств шрифтов. Прием и передача сообщений Windows. Формат сообщения Windows. Как создаются сообщения Windows. Ответ на сообщение Windows. Цикл обработки сообщений.

mybiblioteka.su - 2015-2024 год. (0.01 сек.)