http://tikitak.narod.ru ---- Главная страница сайта
Шаг 45 - Печать из диалогового окна
Создание проекта
Мучаем наш проект. Изменим код кнопки и всё.
Создаем код
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();
}
}
Описание
В классе CView есть функция OnPrint и она умеет печатать. Обучить печати диалоговое окно сложнее, по причине отсутствия поддержки в классе. Но зато понятна суть происходящего.
Перед началом печати нам необходимо получить ряд параметров - название принтера, размер бумаги и т.д. Класс CPrintDialog умеет выводить на экран диалоговое окно выбора принтера. У этого окна есть ряд параметров, но мы пока воспользуемся первым. Этот параметр, если сказать просто, отвечает за вид диалогового окна.
После создания класса принтера мы создаем класс CDC - универсальный класс контекста устройства. И этот контекст мы связываем с контекстом принтера, используя Attach, и взяв указатель на принтер функцией GetPrinterDC.
Структура DOCINFO необходима для передачи информации менеджеру печати. Перед началом заполнения её свойства необходмо обнулить. Так вот это обнуление необходимо только для Win95 при использовании NT этого можно не делать. Структура имеет разный размер под Win95 и NT, и необходимо указывать её размер в соотвествующем поле (cbSize).
Дальше указываем имя документа и имя файла куда печатать, нам на принтер :-) и поэтому NULL.
Итак создаем документ StartDoc передав адрес структуры. Эта операция может закончиться ошибкой. Попробуйте убрать ZeroMemory для Win95 и убедитесь. Дальше запускаем первую страницу. Команды печати, а они универсальные что для принтера, что для экрана. Заканчиваем страницу, документ. Постоянно пытаясь поймать Windows на ошибках. И разрываем связь.
Создавайте, запускайте, печатайте. На листе бумаги будет тонкая линия по диагонали. Вот и хорошо.
Шпаргалка
Диалоговое окно настройки принтера
CPrintDialog cp(....);
Связь с контекстом устройства
PrintDC.Attach(cp.GetPrinterDC());
Информационная структура
DOCINFO infStru;
Новый документ, новая страница.
PrintDC.StartDoc(.....)
PrintDC.StartPage();
Команды вывода: конец страницы , конец документа
PrintDC.EndPage();
PrintDC.EndDoc();
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|