как я делаю предварительный просмотр в win32 C++?

У меня есть функция рисунка, которая просто берет HDC. Но я должен показать ТОЧНУЮ масштабированную версию того, что распечатает.

Таким образом, в настоящее время я использую CreateCompatibleDC () с принтером HDC и CreateCompatibleBitmap () с HDC принтера.

Я изображаю этот способ, которым DC будет иметь точную ширину и высоту принтера. И когда я выбираю шрифты в этот HDC, текст будет масштабироваться точно, как принтер был бы.

К сожалению, я не могу к StretchBlt () для копирования пикселей этого HDC в HDC управления, так как они имеют различные типы HDC, которые я предполагаю.

Если я создаю "холст памяти" из окна HDC с тем же w, h как страница принтера, шрифты выходят ПУТЬ подросток, так как они масштабируются для экрана, не страницы...

Должен я CreateCompatibleDC () от DC окна и CreateCompatibleBitmap () от DC принтера или чего-то??

Если кто-то мог бы объяснить ПРАВИЛЬНЫЙ способ сделать это. (И все еще имейте что-то, что смотрит ТОЧНО, как это было бы на принтере)...

Ну, я ценил бы его!!

... Steve

9
задан Adrian McCarthy 10 February 2010 в 23:51
поделиться

3 ответа

В зависимости от того, насколько точными вы хотите быть, это может быть сложно.

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

  1. Создайте DC (или еще лучше, IC - информационный контекст) для принтера.
  2. Запросить DC принтера, чтобы узнать разрешение, размер страницы, физические смещения и т. Д.
  3. Создайте DC для окна / экрана.
  4. Создайте совместимый DC (память DC).
  5. Создайте совместимое растровое изображение для окна / экрана, но его размер должен соответствовать размеру страницы принтера в пикселях. (Проблема с этим подходом в том, что это ОГРОМНОЕ растровое изображение, и оно может дать сбой.)
  6. Выберите совместимое растровое изображение в DC памяти.
  7. Нарисуйте в DC памяти, используя те же координаты, которые вы использовали бы при рисовании на реальном принтере. (Когда вы выбираете шрифты, убедитесь, что вы масштабируете их до логического дюйма принтера, а не до логического дюйма экрана.)
  8. StretchBlt DC памяти для окна, которое будет уменьшать масштаб всего изображения. Возможно, вы захотите поэкспериментировать с режимом растяжения, чтобы увидеть, что лучше всего подходит для того типа изображения, которое вы собираетесь отображать.
  9. Освободите все ресурсы.

Но прежде чем идти в этом направлении, рассмотрите альтернативы. Этот подход включает выделение ОГРОМНОГО растрового изображения вне экрана. Это может привести к сбою на компьютерах с ограниченными ресурсами. Даже если это не так, возможно, вам не хватает других приложений.

Подход с использованием метафайлов, описанный в другом ответе, является хорошим выбором для многих приложений. Я бы начал с этого.

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

Проблема с этим последним подходом (и, возможно, с метафайловым) заключается в том, что шрифты GDI не масштабируются идеально линейно. Ширина отдельных символов настраивается в зависимости от целевого разрешения. На устройстве с высоким разрешением (например, лазерном принтере с разрешением 300+ dpi) эта настройка минимальна. Но на экране с разрешением 96 dpi настройки могут привести к значительной погрешности по длине строки. Таким образом, текст в окне предварительного просмотра может выглядеть непропорционально (обычно шире), чем на распечатанной странице.

Таким образом, хардкорный подход заключается в измерении текста в контексте принтера, повторном измерении в контексте экрана и корректировке несоответствия. Например (используя выдуманные числа), вы можете измерить ширину некоторого текста в контексте принтера, и получится 900 пикселей принтера. Предположим, что соотношение пикселей принтера и пикселей экрана составляет 3: 1. Вы ожидаете, что тот же текст на экране будет шириной 300 пикселей. Но вы измеряете в контексте экрана и получаете значение вроде 325 пикселей экрана. Когда вы рисуете на экране, вам нужно как-то сузить текст на 25 пикселей. Вы можете расположить символы ближе друг к другу или выбрать шрифт чуть меньшего размера, а затем растянуть их.

Жесткий подход предполагает большую сложность. Вы можете, например, попытаться обнаружить замену шрифта, сделанную драйвером принтера, и максимально точно сопоставить ее с доступными экранными шрифтами.

Мне повезло с гибридом большого растрового изображения и жесткого подхода. Вместо того, чтобы делать гигантское растровое изображение для всей страницы, я делаю одно достаточно большим для строки текста. Затем я рисую в размере принтера до растрового изображения вне экрана и StretchBlt уменьшаю его до размера экрана. Это устраняет проблему несоответствия размера при небольшом ухудшении качества шрифта. Он подходит для фактического предварительного просмотра печати, но вы не захотите создавать такой редактор WYSIWYG. Однострочное растровое изображение достаточно мало, чтобы сделать это практичным.

Хорошая новость в том, что труден только текст. Все остальные чертежи представляют собой простое масштабирование координат и размеров.

Я нечасто использовал GDI +, но думаю, что он избавился от нелинейного масштабирования шрифтов. Поэтому, если вы используете GDI +, вам просто нужно масштабировать свои координаты. Недостатком является то, что я не думаю, что качество шрифтов в GDI + такое же хорошее.

И, наконец, если вы используете собственное приложение в Vista или более поздней версии, убедитесь, что вы пометили свой процесс как « с учетом DPI ». В противном случае, если пользователь находится на экране с высоким разрешением, Windows солгает вам и заявит, что разрешение составляет всего 96 точек на дюйм, а затем произведет нечеткое масштабирование всего, что вы рисуете. Это ухудшает визуальное качество и может еще больше усложнить отладку предварительного просмотра. Поскольку так много программ плохо адаптируются к экранам с более высоким разрешением, Microsoft добавила по умолчанию «масштабирование с высоким разрешением», начиная с Vista.

Отредактировано для добавления

Еще одно предостережение: если вы выберете HFONT в DC памяти с растровым изображением размера принтера, возможно , что вы получите другой шрифт, чем тот, который был бы получен при выборе того же самого HFONT в фактический DC принтера. Это потому, что некоторые драйверы принтеров заменяют обычные шрифты шрифтами из памяти. Например,некоторые принтеры PostScript заменяют некоторые распространенные шрифты TrueType внутренним шрифтом PostScript.

Вы можете сначала выбрать HFONT в ИС принтера, а затем использовать функции GDI, такие как GetTextFace , GetTextMetrics и, возможно, GetOutlineTextMetrics , чтобы узнать о фактических шрифт выбран. Затем вы можете создать новый LOGFONT, чтобы попытаться более точно соответствовать тому, что будет использовать принтер, превратить его в HFONT и выбрать его в DC вашей памяти. Это признак действительно хорошей реализации.

10
ответ дан 4 December 2019 в 13:47
поделиться

WSGI-сервер CherryPy работает так же быстро, как и WSGI-сервер Python. Я лично использую его за Nginx в производстве, но даже автономно на своей машине для разработки я могу загрузить каждый экземпляр с несколькими сотнями запросов/сек. без проблем.

Можете ли вы найти более быстрый сервер? Да. Является ли Cherra Py надежным веб-сервером, и достаточно хорошим для большинства людей, чтобы использовать его в производстве? Да.

-121--2685004-

Я полагаю, что ваша лучшая ставка заключается в вызове быстрого объекта на вашей веб-странице. Для воспроизведения файлов mp3 лучше всего использовать список воспроизведения в стиле Winamp .pls с аудио/x-scpls типа mimetype, который служит в качестве указателя для файлов mp3. Создайте вокруг него внедренный объект быстрого времени. Попробуйте документы для быстрого:

http://www.apple.com/quicktime/tutorials/embed.html

-121--5086099-

Одна вещь, которая может стоить того, чтобы попытаться создать улучшенный метафайл DC, использовать его в обычном режиме и затем масштабировать этот метафайл с помощью метрик принтера. Это подход, используемый образцом WTL BmpView - я не знаю, насколько точным это будет, но, возможно, стоит посмотреть (это должно быть легко перенести соответствующие классы в Win32, но WTL является отличной заменой для Win32 программирования, поэтому может стоить использовать.)

3
ответ дан 4 December 2019 в 13:47
поделиться

Ну, это не будет выглядеть так же, потому что у вас есть более высокое разрешение в принтере DC, так что вам придется написать функцию преобразования видов. Я бы пошел с методом, который вы должны работать, но текст был слишком мал и просто умножить каждую позицию/размер шрифта на ширину окна принтера и разделить на ширину исходного окна.

2
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: