Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 390

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

PC_WIDESTYLED - устройство может рисовать широкие и стилизованные бордюры;

PC_INTERIORS - устройство может рисовать внутренности.

TEXTCAPS - значение, показывающее совместимость устройства с текстом.

Возвращаемые значения:

TC_OP_CHARACTER - устройство поддерживает посимвольный вывод;

TC_OP_STROKE - устройство поддерживает строковый вывод;

TC_CP_STROKE - устройство поддерживает объединение строк;

TC_CR_90 - устройство поддерживает поворот символов на 90 градусов;

TC_CR_ANY - устройство поддерживает любые повороты символов;

TC_SF_X_YINDEP - устройство поддерживает независимое масштабирование по осям x и y; TC_SA_DOUBLE - устройство поддерживает двойное увеличение символов;

TC_SA_INTEGER - устройство поддерживает целочисленное масштабирование символов; TC_SA_CONTIN - устройство поддерживает любое масштабирование символов;

TC_EA_DOUBLE - устройство может отображать символы двойной ширины;

TC_IA_ABLE - устройство поддерживает стиль italic; TC_UA_ABLE - устройство поддерживает подчеркивание;

TC_SO_ABLE - устройство поддерживает зачеркивание; TC_RA_ABLE - устройство может отображать растровый шрифт;

TC_VA_ABLE - устройство может отображать векторный шрифт; TC_RESERVED зарезервировано;

71

o o o o
o o o o
o

TC_SCROLLBLT - устройство не может использовать перемещение битовых блоков.

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

строковые параметры текущего принтера: o название принтера;

o имя драйвера; o порт вывода;

параметры и режимы, поддерживаемые заданным

принтером:

версия драйвера; позиция страницы на бумаге;

количество копий, которое можно напечатать; количество типов данных, поддерживаемых драйвером; доступные разрешения;

oсписок файлов, которые также нужно загрузить вместе с драйвером;

максимальные размеры бумаги; минимальные размеры бумаги; поддерживаемые повороты изображения;

поддерживаемые имена размеров бумаги (Letter, Legal и.т.д);

o поддерживаемые размеры бумаги (в численном виде);

o способ использования шрифтов True Type; o ширина физической страницы (dpi);

o высота физической страницы (dpi);

oдистанция от левого края физической страницы до левого края площади, на которой возможна печать (dpi);

72

o дистанция от верхнего края физической страницы до верхнего края площади, на которой возможна печать (dpi) и т.д.

Получение названия принтера, имя драйвера и порта вывода

Компоненты Edit1-Edit3 выводят название принтера, имя драйвера и порт вывода соответственно.

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3; void main()

{

int i,j;

char lpReturnedString[50]; char lpszDriver[35];

char lpszDevice[35]; char pPort[10];

GetProfileString("windows","device","Нет",lpReturnedString,50); for

(i=0;(lpReturnedString[i]!=',')&&(lpReturnedString[i]!='\0');++i)

-lpszDevice[i]=lpReturnedString[i];

lpszDevice[i]='\0';

if (lpReturnedString[i])++i; j=i;

for (i;(lpReturnedString[i]!=',')&&(lpReturnedString[i]!='\0');++i)

-lpszDriver[i-j]=lpReturnedString[i];

lpszDriver[i-j]='\0';

if (lpReturnedString[i])++i; j=i;

for (i;(lpReturnedString[i]!=',')&&(lpReturnedString[i]!='\0');++i)

-pPort[i-j]=lpReturnedString[i]; pPort[i-j]='\0'; Edit1->Text=lpszDevice; Edit2->Text=lpszDriver; Edit3->Text=pPort;

}

73

Получение ширины физической страницы

Ширина физической страницы выводится компонентой Edit1.

TEdit *Edit1; void main()

{

HDC hdc; // идентификатор контекста устройства (device context)

//... получение идентификатора контекста устройства с помощью CreateDC или PrintDlg

Edit1->Text=(int)GetDeviceCaps(hdc,PHYSICALWIDTH);

}

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

WriteFile;

PrintDlg (для вызова диалога);

BitBlt и др.

PrintDlg отображает диалог печати или диалог установки печати. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL PrintDlg(lppd)

LPPRINTDLG lppd; // указатель на структуру PRINTDLG

Описание структур PRINTDLG и DEVNAMES приведено в приложении.

BitBlt копирует прямоугольную битовую поверхность из контекста устройства источника в контекст устройства приемника. Контекст устройства получают функциями GetDC или GetWindowDC. Функция возвращает true при корректном ее завершении. Если происходит копирование между разными устройствами (дисплей-принтер), то функция всегда возвращает false.

74

Синтаксис: BOOL

BitBlt(hdcDest,nXDest,nYDest,nWidth,nHeight,hdcSrc,nXSrc,nYSrc,dwR

op)

HDC hdcDest;// идентификатор контекста устройства-источника

(device context)

int nXDest;// координата x левого верхнего угла копируемой поверхности в приемнике

int nYDest;// координата y левого верхнего угла копируемой поверхности в приемнике

int nWidth;// ширина копируемой поверхности int nHeight;// высота копируемой поверхности

HDC hdcSrc;// идентификатор контекста устройства-приемника

(device context)

int nXSrc;// координата x левого верхнего угла копируемой поверхности в источнике

int nYSrc;// координата y левого верхнего угла копируемой поверхности в источнике

DWORD dwRop;// код операции копирования

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

CreateDC;

DeleteDC;

PrintDlg (для получения контекста устройства);

CreateFile;

StartDoc;

EndDoc;

StartPage;

EndPage;

CharToOemBuff.

CreateDC создает контекст устройства (device context).

Синтаксис: HDC

CreateDC(lpszDriver,lpszDevice,lpszOutput,lpInitData)

75

LPCTSTR lpszDriver; // указатель на имя драйвера (дисплей -

"DISPLAY", принтер - обычно "WINSPOOL")

LPCTSTR lpszDevice; // указатель на название устройства LPCTSTR lpszOutput; // не используется, следует установить в

NULL

CONST DEVMODE *lpInitData; // указатель DEVMODE

DeleteDC удаляет контекст устройства

Синтаксис: BOOL DeleteDC(hdc) HDC hdc;

StartDoc сообщает принтеру о начале работы. При корректном завершении возвращает идентификатор задания принтера.

Синтаксис: int StartDoc(hdc,lpdi)

HDC hdc; // идентификатор контекста устройства

CONST DOCINFO *lpdi; // указатель на структуру DOCINFO

Описание структуры DOCINFO приведено в приложении.

EndDoc сообщает принтеру о завершении работы. Функция возвращает нуль при ошибке.

Синтаксис: int EndDoc(hdc)

HDC hdc; // идентификатор контекста устройства

StartPage подготавливает принтер к приему данных (начало страницы). Функция возвращает нуль при ошибке.

Синтаксис: int StartPage(hDC)

HDC hDC; // идентификатор контекста устройства

76

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

Синтаксис: int EndPage(hdc)

HDC hdc; // идентификатор контекста устройства

CharToOemBuff транслирует строку символов в стандарт OEM (original equipment manufacturer). Функция возвращает всегда true.

Синтаксис: BOOL CharToOemBuff(lpszSrc,lpszDst,cchDstLength)

LPCTSTR lpszSrc; // указатель на строку для трансляции LPSTR lpszDst; // указатель на выходную строку

DWORD cchDstLength; // длина транслируемой строки в символах

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

печать текста;

печать графики;

отображение диалога печати и диалога установок печати.

Печать текста

Выводится на принтер текст, содержащийся компонентой

RichEdit1.

TRichEdit *RichEdit1; void main()

{

HANDLE hFile; DWORD byteNum;

77

char *buf;

buf=(char*)malloc(RichEdit1->Text.Length());// выделение памяти CharToOemBuff(RichEdit1->Text.c_str(),buf,RichEdit1- >Text.Length());//конвертер hFile=CreateFile("PRN",GENERIC_WRITE,FILE_SHARE_WRITE,NU LL,OPEN_EXISTING,0,

NULL);

if (hFile!=INVALID_HANDLE_VALUE)

{

WriteFile(hFile,buf,RichEdit1->Text.Length(),&byteNum,NULL);//

печать

}

CloseHandle(hFile);

free(buf);

}

Вывод на принтер графических изображений

Выводится на принтер левый верхний угол окна текущего приложения.

void main()

{

PRINTDLG lppd; HDC dcPrinter;

lppd.lStructSize = sizeof(PRINTDLG); lppd.hDevMode = (HANDLE) NULL; lppd.hDevNames = (HANDLE) NULL;

lppd.Flags = PD_RETURNDC|PD_RETURNDEFAULT;// получить контекст, но диалог не отображать

lppd.hwndOwner = GetActiveWindow(); lppd.hDC = (HDC) NULL; lppd.nFromPage = 1;

lppd.nToPage = 1; lppd.nMinPage = 0; lppd.nMaxPage = 0; lppd.nCopies = 1;

lppd.hInstance = (HANDLE) NULL; lppd.lCustData = 0;

lppd.lpfnPrintHook = (LPPRINTHOOKPROC) NULL;

78

lppd.lpfnSetupHook = (LPSETUPHOOKPROC) NULL; lppd.lpPrintTemplateName = (LPSTR) NULL; lppd.lpSetupTemplateName = (LPSTR) NULL; lppd.hPrintTemplate = (HANDLE) NULL; lppd.hSetupTemplate = (HANDLE) NULL;

if (PrintDlg(&lppd)&&lppd.hDC!=NULL)

{

HWND hCurWin; HDC dcCurWin;

hCurWin=GetActiveWindow();

dcCurWin=GetWindowDC(hCurWin); DOCINFO di;

di.cbSize=sizeof(di);

di.lpszDocName=0;

di.lpszOutput=NULL;

di.lpszDatatype=0;

di.fwType=0;

StartDoc(lppd.hDC,&di);

StartPage(lppd.hDC);

BitBlt(lppd.hDC,10,10,50,50,dcCurWin,0,0,SRCCOPY);

EndPage(lppd.hDC);

EndDoc(lppd.hDC);

ReleaseDC(hCurWin,dcCurWin);

}

DeleteDC(lppd.hDC);

}

Отображение диалога и выбор принтера

Отображается диалог выбора принтеров и их установок. void main()

{

PRINTDLG lppd; HDC dcPrinter;

lppd.lStructSize = sizeof(PRINTDLG); lppd.hDevMode = (HANDLE) NULL; lppd.hDevNames = (HANDLE) NULL; lppd.Flags = PD_RETURNDC; lppd.hwndOwner = GetActiveWindow();

79

lppd.hDC = (HDC) NULL; lppd.nFromPage = 1; lppd.nToPage = 1; lppd.nMinPage = 0; lppd.nMaxPage = 0; lppd.nCopies = 1;

lppd.hInstance = (HANDLE) NULL; lppd.lCustData = 0;

lppd.lpfnPrintHook = (LPPRINTHOOKPROC) NULL; lppd.lpfnSetupHook = (LPSETUPHOOKPROC) NULL; lppd.lpPrintTemplateName = (LPSTR) NULL; lppd.lpSetupTemplateName = (LPSTR) NULL; lppd.hPrintTemplate = (HANDLE) NULL; lppd.hSetupTemplate = (HANDLE) NULL; PrintDlg(&lppd);

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

DeleteDC(lppd.hDC);

}

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

5. ОРГАНИЗАЦИЯ СВЯЗИ ПО ПОСЛЕДОВАТЕЛЬНОМУ ИНТЕРФЕЙСУ

5.1. Назначение обмена данными и способы обмена

Одним из важнейших вопросов компьютерной техники является возможность обмена данными между ЭВМ. Обмен данными предназначен для решения следующих задач:

быстрого перемещения данных на большие расстояния; многократного дублирования данных на разные

носители;

80