Как увеличить размер формы или FlowLayoutPanel для печати, превышающей размер экрана?

У меня есть форма, главной панелью которой является FlowLayoutPanel, и это именно то, что я хочу напечатать (она разработана так, чтобы выглядеть как красиво отформатированный документ... без кнопок и т. д.... вы щелкаете правой кнопкой мыши для команд).

Итак, я использую DrawToBitmap для реализации печати почти бесплатно... Я просто изменяю размер формы таким образом, чтобы основная панель соответствовала размеру листа бумаги, на котором пользователь хочет печатать (минус поля), что приводит к автоматическому течь его содержимое должным образом для этого размера. Затем я просто использую DrawToBitmap для отображения этого FlowLayoutPanel и всего его содержимого на печатной странице. Я даже могу масштабировать, чтобы соответствовать размеру окна, увеличив его размер до размера страницы (такое же соотношение сторон), а затем уменьшив размер растрового изображения, которое я получаю от DrawToBitmap. Работает отлично...

НО это работает, только если ваш экран больше, чем размер страницы! Потому что любая попытка изменить размер формы или элемента управления больше, чем размер экрана + 12 пикселей в любом направлении, будет сорвана.

Фу!! Зачем дразнить меня простотой и полезностью DrawToBitmap, если вы собираетесь убить его применимость, отказавшись изменять размер больше экрана? (риторический)

Мои вопросы:

Есть ли способ обойти это ограничение и заставить форму или FlowLayoutPanel изменить размер больше, чем экран?

Если нет, есть ли способ добраться до прокручиваемой поверхности FlowLayoutPanel (а не только той части, которая прокручивается в поле зрения), чтобы я мог изменить ее размер в соответствии с печатной страницей и чтобы я мог вызвать на ней DrawToBitmap?

Если нет, есть ли другой способ использовать мои существующие функции макета для печати? Или я застрял, по сути, переписывая весь этот код WinForms только для того, чтобы сгенерировать тот же растровый рисунок, который он уже сгенерирует, если мой экран больше, чем моя печатная страница?


person Brian Kennedy    schedule 18.12.2012    source источник
comment
Вы действительно видели распечатку? Вы, должно быть, заметили, как каждый пиксель на экране превратился в пятно 6x6 на бумаге. Очень некрасиво, в частности, для сглаженного текста. Сравните вывод PrintDocument, прежде чем выберете паршивое решение.   -  person Hans Passant    schedule 18.12.2012
comment
Да, мы просмотрели распечатки... там нет клочков 6x6. Текст довольно гладкий. Если бы мы делали очистку экрана (CopyFromScreen), то увидели бы то, о чем вы говорите... но это не так. Мы делаем DrawToBitmap, который вызывает OnPrint вместо OnPaint, передавая контекст растрового изображения/устройства, сгенерированный принтером... с его высоким DPI... поэтому, когда он рисует на нем текст, он использует более высокое разрешение принтера (несмотря на размеры в пикселях остаются прежними). На самом деле работает на удивление хорошо.   -  person Brian Kennedy    schedule 18.12.2012
comment
С учетом сказанного, это НЕ текст качества Postscript ... но наше приложение не пытается генерировать документы журнального качества ... это инженерное приложение ... и его разрешение достаточно хорошее, чтобы инженеры были счастливы его читать ( рисование на нем и др.). Но это, по общему признанию, будет не лучшим подходом, если вы создаете документы, предназначенные для публикации или продажи.   -  person Brian Kennedy    schedule 18.12.2012


Ответы (1)


Я не уверен, но можно ли было бы сделать все это виртуально. IE:

Dim FLP as FlowLayoutPanel = Form1.FlowLayoutPanel1
For Each flp_subobject as Object in FlowLayoutPanel.Children
    FLP.Children.Add(flp_subobject)
Next
FLP.Height = MASSIVEHEIGHT
FLP.Width = MASSIVEWIDTH
DrawToBitmapFunction(FLP)

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

person JosephGarrone    schedule 18.12.2012
comment
Я все еще экспериментирую, но кажется, что все настройки ширины и высоты элемента управления максимально соответствуют размеру экрана. Я могу переопределить логику FlowLayoutPanel таким образом, чтобы я брал растровое изображение от каждого дочернего элемента, а затем сам собирал их в виде потока на поверхность печати... но я ненавижу заново изобретать колесо только из-за одной максимальной переменной. - person Brian Kennedy; 18.12.2012