Последние записи
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
21st
Сен
Печать содержимого окна инструментами WinAPI
Posted by obzor under Win Api
Пытаюсь научится печатать содержимое окна. Из того, что я нашел в интернете, все выглядит очень просто, также как и рисование в окне. Только лишь надо сначала выбрать принтер, да еще добавить функции StartDoc и StartPage в начале и EndDoc и EndPage в конце печати. Только почему-то не получается. Принтер выбрать удается и он начинает работать, но выдает пустую страницу. Если вместо реального принтера выбрать pdf файл, то файл создается. Но при попытке открыть его выдается сообщение о «внутренней ошибке».
alexcoder
PRINTDLG pd;
RECT rc;
GetClientRect(hwnd, &rc);
ZeroMemory(&pd, sizeof(pd));
pd.lStructSize = sizeof(pd);
pd.hwndOwner = hwnd;
pd.hDevMode = NULL;
pd.hDevNames = NULL;
pd.Flags = PD_RETURNDC | PD_SELECTION;
pd.nCopies = 1;
pd.nFromPage = 0;
pd.nToPage = 0;
pd.nMinPage = 0;
pd.nMaxPage = 0;
//dialog pechati
if (PrintDlg(&pd)
{
HDC printerDC = pd.hDC; //poluchaem kontekst vybrannogo printera
DOCINFO di;
memset(&di, 0, sizeof(di));
di.cbSize = sizeof(di);
// Opredelyaem razreshenie printera po vertikali
int cx = GetDeviceCaps(printerDC, HORZRES);
int cy = GetDeviceCaps(printerDC, VERTRES);
//iskhodnye razmery oblasti pechati
int wsrc = ...;
int hsrc = ...;
//i ee koordinaty
int xsrc = ...;
int ysrc = ...;
//vychislyaem masshtaby po osyam
double scalex = (double)cx / (double)wsrc;
double scaley = (double)cy / (double)hsrc;
//vybiraem men'shij ih nih, chtoby vsya vybrannaya oblast' bez iskazhenij pomestilas' na liste
double scale = min(scalex, scaley);
//razmer oblasti pechati
int wdst = wsrc*scale;
int hdst = hsrc*scale;
//nachalo pechati
StartDoc(printerDC, &di);
StartPage(printerDC);
//sdelat' kopiyu pechataemogo izobrazheniya, a to napryamuyu ne na vse printery vyvoditsya
HDC copy = CreateCompatibleDC(hdc);
HBITMAP bmcopy = CreateCompatibleBitmap(hdc, wdst, hdst);
SelectObject(copy, bmcopy);
//natyanut' oblast' pechati
StretchBlt(copy, 0, 0, wdst, hdst, hdc, xsrc, ysrc, wsrc, hsrc, SRCCOPY);
//I vyvod na printer
BitBlt(printerDC, 0, 0, wdst, hdst, copy, 0, 0, SRCCOPY);
//Zakonchit' pechat'
EndPage(printerDC);
EndDoc(printerDC);
//Udalit' nenuzhnye deskriptory
DeleteDC(pd.hDC);
DeleteObject(bmcopy);
DeleteDC(copy);
}
У меня так печатает
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)