ALTE DOCUMENTE
|
||||||||
TextOut() является стандартной функцией вывода текста в Windows. Она выводит текст в заданных координатах, которые всегда указываются относительно начала рабочей области окна. Таким образом, координаты строки, выводимой при помощи TextOut() X Y
TextOut() TextOut() TextOut() (и любых других функций, отображающих что-либо на экране, включая функции вывода фафики, которые описаны в следующей главе) являются логическими единицами. В процессе вывода изображения на экран Windows преобразует логические единицы в пикселы. До сих пор нам не нужно было беспокоиться по этому поводу, поскольку по умолчанию логические единицы как раз и являются пикселами. Однако следует иметь в виду, что в Windows можно использовать различные режимы отображения (mappind modes), в которых подобное умолчание не работает.
TextOut() текст отображается на экране черным цветом на текущем фоне окна. Существует также возможность явного задания цвета текста и фона для него с помощью функций API SetTextColor() SetBkColor()
COLORREF SetTextColor(HOC hdc, COLORREF color);
COLORREF SetBkColor (HDC hdc, COLORREF color);
SetTextColor hdc color SetBkColor() color CLR_INVALID
COLORREF. Windows позволяет задать цвет тремя различными способами. Первый, и наиболее общий, способ заключается в задании RGB-значения (Red, Green, Blue). RGB-значение комбинирует относительные интенсивности трех различных цветов, в результате чего получается реальный цвет. Второй способ определения цвета предполагает задание индекса цвета в логической палитре, а третий заключается в определении RGB-значения относительно текущей логической палитры. В этой главе используется только первый способ задания цвета.
Длинное целое, хранящее RGB-значение и передаваемое в качестве параметра в функции SetTextColor() SetBkColor()
Кодировка RGB-значений
Интенсивность каждого цвета в RGB-значении может задаваться в диапазоне от О до 255, причем значение 0 определяет минимальную, а значение 255 - максимальную интенсивность задаваемого цвета. Например, следующее длинное целое задает фиолетовый («марганцовочный» - magenta) цвет:
Хотя RGB-значения можно формировать вручную, в Windows определен макрос RGB(), предназначенный для этих целей:
COLORREF RGB(int red, int green, int blue);
Здесь значения Red, Ggreen и Blue должны принадлежать диапазону от 0 до 255. Таким образом, для задания марганцовочного цвета можно использовать RGB(255,0,255). Белый цвет задается при помощи RGB(255,255,255), а черный - при помощи RGB(0,0,0). Для задания других цветов необходимо комбинировать три базовых цвета с различной интенсивностью. Например, RGB(0,100,100) задает темный серо-голубой цвет. Вы можете поэкспериментировать с различными комбинациями RGB и определить наиболее подходящие цвета для своего приложения.
Установка режима отображения фона. Способом отображения фона при выводе текста можно управлять с помощью функции API SetBkMode()
int SetBkMode(HDC hdc, int mode);
mode OPAQUE TRANSPARENT mode равно OPAQUE, цвет фона при выводе текста каждый раз будет меняться на текущий цвет фона, заданный функцией SetBkColor() mode TRANSPARENT SetBkColor() OPAQUE
Большинство шрифтов в Windows являются пропорциональными, поэтому символы одного и того же кегля могут иметь различную ширину. Кроме того, высота символов и размер нижних выносных элементов (например, как у букв g) могут быть различными у разных шрифтов. Разными могут быть и расстояния между строками текста. Однако то, что эти (и многие другие) атрибуты шрифта могут изменяться, в данном случае не имеет большого значения; важно лишь то, что Windows требует, чтобы программист самостоятельно управлял практически всем процессом отображения текста.
Windows обеспечивает только минимальную поддержку отображения текста в рабочей области окна. Основной функцией вывода текста является TextOut(). Эта функция лишь выводит строку текста на экран, начиная с заданной позиции. Она никак не форматирует выводимый текст и даже не выполняет операции возврата каретки (CR) или перехода на новую строку (LF). Управление выводом текста в рабочую область окна полностью возлагается на программиста.
То обстоятельство, что размеры шрифтов могут быть разными (и что сами шрифты могут изменяться в процессе выполнения программы), предполагает, что должен существовать способ определения атрибутов текущего шрифта. Например, чтобы вывести на экран новую строку текста под выведенной строкой, необходимо определить высоту шрифта и интервал между строками. Функция API, с помощью которой приложение может получить информацию о текущем шрифте, называется GetTextMetrics()
BOOL GetTextMetrics(HDC hdc, LPTEXTMETRIC lpTAttrib);
hdc GetDC() BeginPaint() a lpTAttrib TEXTMETRIC TEXTMETRIC
typedef struct tagTEXTMETRIC
Y GetTextMetrics() tmHeight tmExternalLeading
tmExternalLeading
TEXTMETRIC NEWTEXTMETRIC. Дополнительные поля предназначены для поддержки работы с TrueType-шрифтами, обеспечивающими более широкие возможности масштабирования, поворотов и других операций над шрифтами. Вот эти новые поля:
DWORD ntmFlags; // Индикатор типа шрифта
UINT ntmSizeEM; // Размер комбинации em
UINT ntmCellHeight; // Высота шрифта
UINT ntmAvgWidth; // Средняя ширина символа
И хотя эти поля не используются в данной главе, в дальнейшем они могут сыграть важную роль при написании Ваших собственных приложений. Более подробную информацию о них Вы найдете в Руководстве Программиста по функциям и структурам данных API.
strlen() не позволяет управлять выводом текста в окне. Для этих целей в Windows предусмотрена функция API GetTextExtentPoint32()
BOOL GetTextExtentPoint32(HDC hdc, LPCSTR lpszString,
int len, LPSIZE lpSize);
hdc lpszString len SIZE lpSize SIZE
typedef struct tagSIZE
SIZE;
GetTextExtentPoint32() SIZE
. Хотя Windows автоматически воспринимает и преобразует логические координаты в пиксели, Вам иногда может понадобиться определить реальные размеры и другие параметры экрана компьютера, на котором запускается Ваше приложение. Для получения этой информации используется функция API GetSystemMetrics()
int GetSystemMetrics(int what);
what
SM_CXFULLSCREEN | ||
SM_CYFULLSCREEN | ||
SM_CXICON | ||
SM_CYICON | ||
SM_CXSMICON | ||
SM_CYSMICON | ||
SM_CXSCREEN | ||
SM_CYSCREEN |
. Теперь, когда Вы кое-что узнали о функциях работы с текстом в Windows, полезно будет привести небольшой пример программы, демонстрирующий описанные возможности:
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Text.h"
LRESULT CALLBACK Window
Func(HWND,UINT,WPARAM,LPARAM);
char szWinName[] = " "; //
char str[255]; // Буфер строки вывода
int X=0, Y=0; // Текущие координаты строки
int maxX, maxY; //
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
return msg. wParam;
}
// Следующая функция вызывается операционной системой // Windows и получает в качестве параметров сообщения
LRESULT CALLBACK WindowFunc HWND hwnd
UINT message,
WPARAM wParam,
LPARAM lParam)
break;
case WM_DESTROY: //
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в данной
// функции, направляются на обработку по
// умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
return 0;
}
#include <Windows.h>
#include "Text.h"
MYMENU MENU
MYMENU ACCELERATORS
Кроме того, потребуется файл определений Text.h:
#define ID_SHOW 100
#define ID_RESET 101
#define ID_HELP 102
WM_CREATE mахХ maxY GetSystemMetrics()
X Y
WM_COMMAND ID_SHOW ID_SHOW
sprintf() TextOut() TextOut(), ни любая другая функция API не выполняет форматирование выводимого текста, так что задача формирования строк для вывода и размещения их на экране полностью возлагается на программиста. После того как строка выведена на экран, координата Y
sprintf() GetTextExtentPoint32() X Y Y X
Наконец, выводится строка с информацией о размерах экрана и координата Y снова увеличивается для последующего вывода текста с новой строки. Поэтому каждый раз по команде Текст строки выводятся ниже уже отображенного текста и не затирают то, что выведено раньше.
X Y
|