Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Оконные координаты, цвета, отображение строк

Rusa




TextOut() является стандартной функцией вывода текста в Win­dows. Она выводит текст в заданных координатах, которые всегда указываются относительно начала рабочей области окна. Таким образом, координаты строки, выводимой при помощи 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




Document Info


Accesari: 2019
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )