Шаг 45 - Печать из диалогового окна

Создание проекта

Мучаем наш проект. Изменим код кнопки и всё.

Создаем код

Описание классов диалога печати.

.......
#include "resource.h" // ссылка на ресурсы
#include "afxdlgs.h" // для диалогового окна печати
#pragma comment(lib,"shell32.lib") // подключили LIB файл
.......

Код пишем по нажатию на кнопку.

void CTestDlg::OnSend()
{
CPrintDialog cp(FALSE); // выбираем принтер
if (cp.DoModal()==IDOK) // если выбрали
{
CDC PrintDC; // контекст принтера
PrintDC.Attach(cp.GetPrinterDC()); // получаем контекст принтера
DOCINFO infStru; // структура с информацией
::ZeroMemory (&infStru, sizeof (DOCINFO)); // обнулить
CString title="step 45 ";
infStru.cbSize = sizeof (DOCINFO); // заполняем структуру
infStru.lpszDocName=title;
infStru.lpszOutput=NULL;
if (PrintDC.StartDoc(&infStru )==-1)AfxMessageBox("Error StartDoc") ; // Начало документа
PrintDC.StartPage(); // начало страницы
PrintDC.MoveTo(10,10); // рисуем
PrintDC.LineTo(100,100);
if (PrintDC.EndPage()<0) AfxMessageBox("Error EndPage"); // конец страницы
if (PrintDC.EndDoc()==0) AfxMessageBox("Error EndDoc"); // конец документа
PrintDC.Detach(); // отсоединить контекст
}
}

А вот так это будет работать.

45_1.gif (9889 b)

Описание

В классе CView есть функция OnPrint и она умеет печатать. Обучить печати диалоговое окно сложнее, по причине отсутствия поддержки в классе. Но зато понятна суть происходящего. Перед началом печати нам необходимо получить ряд параметров - название принтера, размер бумаги и т.д. Класс CPrintDialog умеет выводить на экран диалоговое окно выбора принтера. У этого окна есть ряд параметров, но мы пока воспользуемся первым. Этот параметр, если сказать просто, отвечает за вид диалогового окна.

TRUE

45_2.gif (2513 b)

FALSE

45_3.gif (2519 b)

После создания класса принтера мы создаем класс CDC - универсальный класс контекста устройства. И этот контекст мы связываем с контекстом принтера, используя Attach, и взяв указатель на принтер функцией GetPrinterDC. Структура DOCINFO необходима для передачи информации менеджеру печати. Перед началом заполнения её свойства необходимо обнулить. Так вот это обнуление необходимо только для Win95 при использовании NT этого можно не делать. Структура имеет разный размер под Win95 и NT, и необходимо указывать её размер в соответствующем поле (cbSize). Дальше указываем имя документа и имя файла куда печатать, нам на принтер и поэтому NULL. Итак, создаем документ StartDoc передав адрес структуры. Эта операция может закончиться ошибкой. Попробуйте убрать ZeroMemory для Win95 и убедитесь. Дальше запускаем первую страницу. Команды печати, а они универсальные, что для принтера, что для экрана. Заканчиваем страницу, документ. Постоянно пытаясь поймать Windows на ошибках. И разрываем связь. Создавайте, запускайте, печатайте. На листе бумаги будет тонкая линия по диагонали. Вот и хорошо.

Шпаргалка

Диалоговое окно выбора и настройки принтера.

CPrintDialog cp(FALSE);			// выбираем принтер

Связь с контекстом устройства.

PrintDC.Attach(cp.GetPrinterDC());	// получаем контекст принтера

Информационная структура.

DOCINFO infStru;			// структура с информацией

Новый документ, новая страница.

if (PrintDC.StartDoc(&infStru )==-1)AfxMessageBox("Error StartDoc") ;	// Начало документа
PrintDC.StartPage(); // начало страницы

Команды вывода: конец страницы , конец документа.

if (PrintDC.EndPage()<0) AfxMessageBox("Error EndPage");		// конец страницы
if (PrintDC.EndDoc()==0) AfxMessageBox("Error EndDoc"); // конец документа

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 05.10.99 (обновлено 10.07.2001)