Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 3

Рисование и печать таблицы

22.09.2016, 10:08. Показов 3387. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Появилась необходимость вывода на печать таблицы. В принципе ничего сложного. Но есть один неприятный момент - распечатанная таблица получается мутная, границы линий размыты. Сначала реализовал печать так:
Открывается форма, на которой расположен PictureBox.
В PictureBox загружен графический файл - рисунок таблицы с подписями.
Название: 01.PNG
Просмотров: 147

Размер: 1.3 Кб
На PictureBox, рядом с подписями, располагаю Label'ы, в которые программно вписываю необходимые данные.
Далее распечатываю методом PrintForm - получается мутно.
Если пользоваться PrintDocument, то PictureBox с фоновой таблицей распечатывается, а Label'ы нет.
Тогда сделал так:
Отказался от Label'ов и дорисовываю текст в PictureBox (с помощью Graphics.DrawString). Дорисованный текст при распечатке получается чёткий, сама же таблица с подписями остаётся мутная.

В итоге остановился на таком извращении:
Полностью рисую таблицу, рисую текст и вывожу на печать PrintDocument'ом. Всё чётко и красиво. Но код получается больно навороченный и не гибкий для изменения таблицы (по мере надобности):
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        'Рисуем таблицу. Размеры в миллиметрах, т.к. при распечатке они должны соответствовать заявленным
        e.Graphics.PageUnit = GraphicsUnit.Millimeter
        Dim Pen1 As New Pen(Color.Black, 0.2)
        e.Graphics.DrawRectangle(Pen1, tX, tY, tW, tH)
        e.Graphics.DrawLine(Pen1, tX, tY + 8, tX + tW, tY + 8)
        e.Graphics.DrawLine(Pen1, tX, tY + 22, tX + tW, tY + 22)
        e.Graphics.DrawLine(Pen1, tX, tY + 32, tX + tW, tY + 32)
        e.Graphics.DrawLine(Pen1, tX, tY + 38, tX + tW, tY + 38)
        e.Graphics.DrawLine(Pen1, tX, tY + 46, tX + tW, tY + 46)
 
        e.Graphics.DrawLine(Pen1, tX + 43, tY + 38, tX + 43, tY + 54)
        e.Graphics.DrawLine(Pen1, tX + 21, tY + 38, tX + 21, tY + 54)
 
        ' Отрисовываем текст
        Dim printFontZag = New Font("Verdana", 11, FontStyle.Regular)
        Dim printFontInfR = New Font("Verdana", 10, FontStyle.Regular)
        Dim printFontInfB = New Font("Verdana", 10, FontStyle.Bold)
 
        e.Graphics.DrawString("Строка Тест1", printFontZag, Brushes.Black, tX + 22, tY + 1, New StringFormat())
        e.Graphics.DrawString("Строка Тест2 ", printFontInfR, Brushes.Black, tX + 10, tY + 9, New StringFormat())
        '...
        e.Graphics.DrawString("Строка Тест3", printFontInfR, Brushes.Black, tX + 3, tY + 17, New StringFormat())

Как быть? Последний метод единственный верный или можно как-то просто, чётко и красиво распечатать мою таблицу?
Спасибо.


-----
Работаю в VB.NET 2008
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.09.2016, 10:08
Ответы с готовыми решениями:

Рисование математических формул и вывод на печать
Все привет) Как можно рисовать математических формул на с# т.е на печате чтоб вышло не а / b а как дробь!!

TCanvas и TPrinter - рисование на холсте с выводом на печать
Если подобная тема обсуждалась, то прошу прощения, но я к сожалению ничего не нашел. Пытаюсь изучить работу класса TCanvas и TPrinter,...

Печать и рисование, как уйти от двойной работы?
Здравствуйте! рисую на форме некоторые объекты (фигуры), линиями и потом эти же самые объекты вывожу на печать, вопрос в том как мне уйти...

7
17 / 9 / 4
Регистрация: 09.02.2014
Сообщений: 197
22.09.2016, 12:38
А не проще все это вывести в MSWord и из него уже потом печатать?
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
22.09.2016, 13:16
Sampl, тоже склоняюсь к этому, но вот как быть если нет MSWord на компе?
RCLIO, может проже создать HTML код и вывести его в компонент webbrowser и оттуда уже печатать?
0
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 3
22.09.2016, 14:56  [ТС]
Спасибо за ответы.
С MSWord могут возникнуть проблемы. Программа "портативная" и переносится на флешке к нескольким компьютерам, на некоторых может не оказаться офиса.

HTML? Компонент webbrowser никак не зависит от IE? Т.е. html-табличка во фреймворке 3.5 на разных компьютерах будет одинакова? Просто очень важны размеры таблицы. Вплоть до 1-го миллиметра.

Вообще интересно, отчего PrintForm печатает не чётко? И почему изображение из PictureBox на бумаге выходит тоже мутноватое? Хотя в PictureBox я вставляю рисунок-таблицу в формате *.bmp, нарисованный мной же в Paint'e. Т.е. ни о каком сжатии речи не может быть. Если только VS2008 этим не занимается.
0
17 / 9 / 4
Регистрация: 09.02.2014
Сообщений: 197
22.09.2016, 15:05
может это
e.Graphics.InterpolationMode = Drawing2D.InterpolationMode.High
0
0 / 0 / 0
Регистрация: 22.09.2016
Сообщений: 3
22.09.2016, 15:48  [ТС]
Попробовал. Разницы нету (печатал изображение из PictureBox). Похоже остаётся только рисовать программно.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
22.09.2016, 16:29
а вы случаем не масштабируете изображение при печати под размер листа?

Добавлено через 3 минуты
перед рмсованием картинки, настройие объект графики таким образом:
VB.NET
1
2
3
4
   'Убрать Сглаживание
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None
        e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
        e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half
0
4708 / 3661 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
22.09.2016, 18:59
Учитывая, что табличка ваша простая и без особой нагрузки я бы посоветовал воспользоваться компонентом PrintForm (находится на вкладке Visual Basic PowerPacks окна Панель элементов). Как пользоваться: компануете форму под ваш документ, заполняете все поля и вызываете PrintForm1.Print().
VB.NET
1
2
3
4
5
Private Sub Label1_DoubleClick(sender As System.Object, e As System.EventArgs) Handles Label1.DoubleClick
    PrintForm1.Form = Me
    PrintForm1.PrintAction = Printing.PrintAction.PrintToPrinter
    PrintForm1.Print()
End Sub
Во вложении пример распечатанного документа.
Миниатюры
Рисование и печать таблицы  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2016, 18:59
Помогаю со студенческими работами здесь

Рисование таблицы
Не выходит ровно нарисовать таблицу ,приведенную на фото=( Вот ,что я наказякал . Там дальше строки тоже нужны будут ,но не обращайте на...

Рисование таблицы по текстовому коду
Добрый день. Как макросом - нарисовать таблицу по текстовому коду: B4(2*1+5*1)(1*2+1*2+2*2+3*1)(1*1+1*1+1*1) B4 - это с какой...

Рисование шапки для таблицы в компоненте QReport
В делфях есть встроенная компанента QReport. Как в этой компаненте можно нарисовать шапку для таблицы.... Т.е. нужно нарисовать таблицу с...

Работа с экспортом в Excel. Рисование границ таблицы
Добрый вечер, господа! Делаю программу по учёту выпускников для учебного заведения. Финальным результатом должна стать ведомость в...

Печать таблицы
Здравствуйте! Подскажите способ печати таблицы. Данные хранятся в QTableWidget и ещё в векторе из QStringList. Рисовать всё или есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru