- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Delphi. Трюки и эффекты - Валерий Борисок
Шрифт:
Интервал:
Закладка:
Таблица 6.3. Режимы смешивания фона
Если функция завершается успешно, то она возвращает предыдущий установленный режим смешивания фона. В противном случае она возвращает ноль.
Стоит отметить, что данная функция оказывает эффект на стили линий, которые рисуются с использованием карандаша, созданного посредством функции CreatePen. Если карандаш создан при помощи функции ExtCreatePen, то никакого эффекта не будет.
Параметр nBkMode может быть установлен и в другие значения, отличные от указанных, которые специфичны для данного драйвера устройства. GDI передает драйверу устройства полученное специфическое значение.
Теперь необходимо установить определенный цвет текста при помощи функции SetTextColor для нашего контекста устройства.
...SetTextColor(hCurDC, RGB(0, 0, 255));
Данная функция имеет следующий формат заголовка:
...Function SetTextColor(hdc: HDC; crColor: COLORREF): COLORREF;
Первый параметр задает контекст устройства, для которого устанавливается цвет текста. Второй параметр задает сам цвет, который необходимо установить. В качестве результата функция возвращает предыдущий установленный цвет, но в случае неудачного завершения она возвращает CLRINVALID.
Цвет текста используется при рисовании изображения каждого символа при помощи функций TextOut и ExtTextOut, а также для преобразования растрового изображения при конвертировании из цветного в монохромный режим.
Мы сделали все необходимые подготовки к выводу текста и теперь просто выводим его с центра нашей формы.
...TextOut(hCurDC, Width div 2, Height div 2, PAnsiChar(sText), Length(sText));
Но для нас недостаточно обработки лишь события OnPaint. Поэтому поместим на форму таймер и установим интервал его срабатывания равным 100. А в обработчике будем менять атрибуты текста, которые задают угол его наклона при выводе. После чего заставляем сработать обработчик события OnPaint нашей формы посредством вызова функции RePaint (листинг 6.3).
...Листинг 6.3.
Обработчик события таймера OnTimer
procedure TfmText.TurnTimerTimer(Sender: TObject);
begin
with LogFontData do
begin
lfEscapement := lfEscapement + 60;
lfOrientation := lfEscapement;
end;
RePaint;
end;
Переменная LogFontData объявлена следующим образом:
...LogFontData: LOGFONT;
На основании ее мы создаем шрифт, которым выводится текст. Здесь мы изменяем только два ее поля, которые влияют на наклон текста при выводе. Все остальные параметры мы единожды заполняем при создании формы. Там же мы активизируем таймер (листинг 6.4).
...Листинг 6.4.
Обработчик события формы OnCreate
procedure TfmText.FormCreate(Sender: TObject);
begin
with LogFontData do
begin
lfHeight := 30; // высота шрифта
lfWidth := 0; // средняя ширина символа
lfEscapement := 0; // наклон строки относительно оси oX
lfOrientation := 0; // наклон символа
// относительно оси oX
lfWeight := FW_BOLD; // вес шрифта
lfItalic := 0;
lfUnderline := 0;
lfStrikeOut := 0;
// кодовая страница по умолчанию
lfCharSet := DEFAULT_CHARSET;
lfOutPrecision := OUT_DEFAULT_PRECIS; // точность
// вывода
lfClipPrecision := CLIP_DEFAULT_PRECIS; // отсечение
// вывода
lfQuality := PROOF_QUALITY; // качество вывода
lfPitchAndFamily := VARIABLE_PITCH or FF_DONTCARE;
// семейство шрифта
lfFaceName := 'Arial // название шрифта
end;
TurnTimer.Enabled := True;
end;
Результат работы приложения можно увидеть на рис. 6.2.
Рис. 6.2. Результат работы приложения «Работа с текстом»
6.8. Работа с растровыми изображениями
Вы можете использовать точечный рисунок, чтобы запомнить изображение, а потом сохранить его в памяти, отобразить в другом месте окна вашего приложения или вообще в другом окне.
В некоторых случаях вы можете захотеть, чтобы ваше приложение запоминало и хранило изображение только временно. Например, когда вам необходимо промасштабировать его в каком-нибудь приложении для рисования. Для этого необходимо временно запомнить нормальное представление изображения и показать измененное. После того как пользователь опять выберет нормальное представление изображения, приложение будет обязано заменить промасштабированное изображение копией нормального, которое временно сохранено.
Чтобы временно запомнить изображение, вашему приложению необходимо вызвать функцию CreateCompatibleDC, чтобы создать контекст устройства памяти, совместимый с контекстом устройства экрана текущего окна. После этого вы создаете точечный рисунок с соответствующими атрибутами посредством вызова функции CreateCompatibleBitmap, а затем выбираете его в контексте устройства памяти уже известным вам образом.
После того как создан совместимый контекст устройства и выбран соответствующий точечный рисунок, вы можете запоминать изображение. Функция BitBlt получает изображение, а также копирует данные из исходного точечного рисунка и помещает их в точечный рисунок приемника. Однако два параметра функции не являются описателями точечных рисунков. Вместо этого функция получает два описателя контекстов устройств и копирует растровые данные из точечного рисунка, выбранного в исходном контексте устройства, в точечный рисунок, выбранный в целевом контексте устройства. В этом случае целевой контекст устройства является совместимым контекстом устройства. Когда копирование растровых данных завершается, изображение помещается в память. Чтобы восстановить изображение, вызовите повторно BitBlt, указав теперь в качестве источника совместимый контекст устройства и в качестве приемника контекст устройства экрана (принтера и т. д.).
Следующий пример демонстрирует, как можно получать изображения всего Рабочего стола, а также как полученное изображение можно масштабировать. В данном приложении мы будем обрабатывать три события формы: OnCreate, OnPaint, OnClose, а также одно событие кнопки Onclick.
Рассмотрим исходный код обработчика события OnCreate (листинг 6.5).
...Листинг 6.5. Обработчик события OnCreate
procedure TfmCaptureImage.FormCreate(Sender: TObject);
begin
//создаем контекст устройства экрана
hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
//создаем совместимый контекст устройства памяти
hdcCompatible := CreateCompatibleDC(hdcScreen);
bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);
//создаем совместимый точечный рисунок для hdcScreen
hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth,
bmpHeight);
if hbmScreen <> 0 then
hOldBitmap := SelectObject(hdcCompatible, hbmScreen)
else
hOldBitmap := 0;
Captured := False;
end;
Здесь происходит создание контекста устройства Рабочего стола посредством вызова функции CreateDC.
...hdcScreen:= CreateDC('DISPLAY', nil, nil, nil);
После этого создается совместимый контекст устройства памяти для только что основанного контекста. Затем создается совместимый точечный рисунок.
...bmpWidth := GetDeviceCaps(hdcScreen, HORZRES);
bmpHeight := GetDeviceCaps(hdcScreen, VERTRES);
//создаем совместимый точечный рисунок для hdcScreen
hbmScreen := CreateCompatibleBitmap(hdcScreen, bmpWidth, bmpHeight);
Если нам удалось создать совместимый точечный рисунок, то выбираем его в совместимом контексте устройства памяти. Еще мы вводим флаг, который указывает, сохранено ли в данный момент изображение. Все полученные данные сохраняются в полях формы, объявленных при описании ее класса.
...hdcScreen, hdcCompatible: HDC;
hbmScreen, hOldBitmap: HBITMAP;
bmpWidth, bmpHeight: Integer;
Captured: LongBool;
Рассмотрим исходный код обработчика события OnPaint (листинг 6.6).
...Листинг 6.6.
Обработчик события OnPaint
procedure TfmCaptureImage.FormPaint(Sender: TObject);
var
hCurDC: HDC;
begin
if Captured then
begin
hCurDC := GetDC(Handle);
StretchBlt(hCurDC, 0, 0, Width, Height, hdcCompatible,
0, 0, bmpWidth, bmpHeight, SRCCOPY);
ReleaseDC(Handle, hCurDC);
end;
end;
Проверяем, есть ли изображение, которое нам необходимо показывать. Если да, то получаем контекст устройства нашего окна и масштабируем на него полученное изображение при помощи функции StretchBlt.
Перед закрытием формы мы должны освободить занятые нами ресурсы системы. Поэтому мы обрабатываем событие OnClose, исходный код обработчика которого приведен ниже (листинг 6.7).
...Листинг 6.7.
Обработчик события OnClose
procedure TfmCaptureImage.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
//восстанавливаем точечный рисунок по умолчанию
if hOldBitmap <> 0 then
SelectObject(hdcCompatible, hOldBitmap);
//удаляем совместимый точечный рисунок
if hbmScreen <> 0 then
DeleteObject(hbmScreen);
//удаляем совместимый контекст устройства памяти
if hdcCompatible <> 0 then
DeleteDC(hdcCompatible);
//удаляем контекст устройства экрана
if hdcScreen <> 0 then
DeleteDC(hdcScreen);
end;
Нам осталось рассмотреть последний обработчик события Onclick кнопки, помещенной на нашу форму. В нем мы прячем окно, сохраняем изображение экрана и затем показываем наше окно (листинг 6.8).
...Листинг 6.8.
Сохранение захваченного изображения
procedure TfmCaptureImage.btnCaptureClick(Sender: TObject);
var
hdcForm: HDC;
begin
//прячем наше окно
Hide;
//сохраняем текущее изображение экрана

