Как сделать кнопку печати в visual studio

Добавил пользователь Владимир З.
Обновлено: 05.10.2024

Функции Windows API, предназначенные для вывода на печать, там разбиты на несколько API (по ссылке есть схема, в которой нарисовано, как все эти API сочетаются между собой):

1) Print Document Package API (пока не могу его использовать, так как по ссылке написано, что этот API доступен с Windows 8 и для более поздних версий операционной системы);

2) Print Spooler API (самый нижний (близкий к железу) уровень, на нем построены все остальные перечисленные по ссылке API);

3) XPS Document API и Print Ticket API — специализированные API для печати документов в формате XPS;

В Windows GDI для работы с любым устройством нужно сначала получить так называемый контекст устройства (device context) в переменную-указатель типа HDC. Далее все функции Windows GDI для своей работы требуют эту переменную в качестве аргумента. Если не имеется контекста устройства (в нашем случае — принтера), то можно сначала получить название принтера, а затем по названию получить контекст устройства принтера с помощью функции CreateDC.

Как получить название принтера? Есть несколько способов:

EnumPrinters

1) Получить список принтеров с помощью функции EnumPrinters и дать пользователю выбрать нужный. Пример работы программы:

Текст программы: EnumPrinters.cpp

PrintDlg

2) Показать пользователю диалоговое окно с помощью функции PrintDlg или PrintDlgEx, в котором он выберет нужный принтер. Пример работы программы:

Тексты программ:
PrintDlg_listprn.cpp
PrintDlgEx_listprn.cpp

В случае функции PrintDlgEx диалоговое окно будет выглядеть по-другому, но принцип работы программы — тот же.

3) Указанные в предыдущем способе функции PrintDlg и PrintDlgEx можно запустить так (флаг PD_RETURNDEFAULT соответствующих структур PRINTDLG и PRINTDLGEX), что они не покажут на экране диалоговое окно со списком принтеров, а просто возвратят контекст устройства и название принтера по умолчанию. Тексты программ:
PrintDlg_defprn.cpp
PrintDlgEx_defprn.cpp

4) Ну и самый простой способ: получить название принтера по умолчанию с помощью функции GetDefaultPrinter. Текст программы: GetDefaultPrinter.cpp.

Схема вывода на печать из консольной программы:
1) Получаем название принтера (или сразу контекст устройства принтера и переходим к пункту 3). Например, одним из четырех указанных выше способов.

2) Получаем контекст устройства принтера с помощью функции CreateDC .

3) Используем функции Windows GDI, задавая им контекст устройства принтера в качестве параметра по следующей схеме:
4) Удаляем контекст устройства принтера с помощью функции DeleteDC .

После запуска программы должно появиться окно приложения. Окно должно содержать две кнопки (Привет и Очистить) и пустое текстовое поле (рис.1.1).

Первое приложение

Рис.1.1. Внешний вид приложения

Если щелкнуть мышью на кнопке Привет, в текстовом поле появится надпись "Здравствуй, Мир!" (рис.1.2)

Запущенное приложение

Рис.1.2. Приложение в действии.

Если щелкнуть мышью на кнопке Очистить, программа очищает текстовое поле.

Создание нового проекта

Как видите, Visual Studio позволяет создавать проекты разных типов. Для нашего первого урока мы будем использовать проект типа Windows Forms Application. Выделите мышкой шаблон Windows Forms Application. Далее измените имя проекта. В поле Name удалите текст по умолчанию WindowsFormsApplication1 и введите текст MyFirstProgram. Следующее поле Location показывает место, где будет храниться ваш проект. Вы можете изменить место хранения проекта. Для этого щелкните кнопку Browse. и выберите папку на вашем компьютере. Теперь можно щелкнуть кнопку OK.

Создание нового проекта

Рис.1.3. Создание нового проекта

У вас откроется среда разработки Visual Studio. В центре экрана вы увидите окно формы (пока пустое) с заголовком Form1. Ваша задача - сделать его похожим на форму готового приложения

Пустая форма

Рис.1.4. Пустая форма

Изменяем заголовок формы

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

Примечание: Форму часто называют окном. В принципе это одно и то же. Во время разработки мы будем использовать термин форма, а во время работы программы эту форму на экране будем называть окном.

Итак, изменим заголовок у формы на Привет

Убедитесь, что окно формы является текущим. Это легко распознать по заголовку - оно должно быть активным (подсвеченным). Если форма не является текущим, то просто щелкните мышью в любом месте формы или по заголовку.

В правой части среды разработки найдите окно Properties. Если оно у вас скрыто, то в меню View выберите команду Properties Windows.

Щелкните на поле, расположенном справа от надписи Text. В данный момент поле содержит текст Form1. Удалите этот текст и введите новый текст Привет. Окно свойств должно принять вид, как на рис 1.5.

Изменяем заголовок у формы

Рис.1.5. Изменяем заголовок у формы

Ура! Вы изменили заголовок формы. Взгляните на окно формы - надпись изменилась (рис.1.6).

Форма с новым заголовком

Рис.1.6. Форма с новым заголовком.

Добавляем кнопку

Мы знаем, что в окончательном варианте на форме должны быть кнопки Привет и Очистить. Давайте сделаем это.

Чтобы поместить кнопку на форму, сначала выберите ее в коллекции инструментов.

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

Найдите среди значков нужный элемент с надписью Button.

Дважды щелкните на значке кнопки - в результате Visual Studio поместит кнопку с надписью Button на форму (рис.1.7).

Помещаем кнопку на форму

Рис.1.7. Помещаем кнопку на форму

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

Перейдите на панель Properties (если она невидима, то выполните команду Properties Window из меню ё1)

Убедитесь, что поле списка в верхней части окна свойств содержит надпись button1 System.Windows.Forms.Button (рис.1.6)

Примечание: На данном этапе к вашей форме относятся два объекта: сама форма Form1 и кнопка button1. Окно свойств отображает свойства того объекта, чье имя выбрано в свернутом списке вверху окна. Чтобы переключиться на другой объект, щелкните на кнопке со стрелкой в поле списка и разверните список: он содержит имена всех элементов формы. Щелкните на имени нужного вам элемента, и окно Properties отобразит набор свойств этого элемента.

Измените значение свойства Name с button1 на butHello.

Новое имя для кнопки

Рис.1.8. Присваиваем новое имя кнопке

По умолчанию, Visual Studio присвоило кнопке надпись button1, которую вы видите сейчас на кнопке. Давайте изменим ее на более понятную надпись. Находим свойство Text и изменяем текст button1 на Привет.

Изменяем положение кнопки

Кнопка в нашем варианте должна находиться не в углу формы, а чуть ниже.

Перетащите ее в нижнюю часть формы: поместите указатель мыши на кнопку Привет, нажмите на кнопку мыши и, не отпуская кнопки мыши, переместите кнопку Привет в нужное место.

Изменяем свойство Font (Шрифт) у кнопки

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

Выберите нужный размер шрифта, например, 10. Щелкните на кнопке OK диалогового окна Font

Взгляните на кнопку: шрифт надписи Привет изменился.

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

Добавляем вторую кнопку

Теперь нам необходимо добавить на форму вторую кнопку с надписью Очистить. Повторяем уже знакомые операции. Дважды щелкаем на значке кнопки в коллекции инструментов. На форме появится вторая кнопка. Перетащите ее в правую часть формы рядом с первой кнопкой. Далее измените у кнопки свойства Name с button1 на butClear и свойство Text на текст Очистить. Также можете изменить размер шрифта.

Изменяем размеры кнопок

Первоначальные размеры, которые Visual Studio установил кнопкам, могут нам не подойти. Например, слово Очистить может оказаться слишком большим и не помещается целиком на кнопке. Давайте научимся изменять размеры кнопок.

Выберите нужный объект одиночным щелчком (не двойным!). Выбранный элемент будет заключен в прямоугольник из небольших белых квадратиков, которые называются маркерами. Аккуратно подведите указатель мыши к любому маркеру и, удерживая нажатой кнопку мыши, перетаскивайте маркер в нужном направлении, пока объект не примет требуемый размер. Например, маркеры на вертикальных гранях объекта меняют его горизонтальные размеры и наоборот. Маркеры на углах меняют размеры объекта в обоих направлениях одновременно.

Добавляем на форму текстовое поле TextBox

Остался еще один элемент, которого не хватает для нашей программы - это текстовое поле TextBox. Данный элемент предназначен для ввода любого текста. Иногда этот элемент называют полем редактирования.

Помещаем элемент TextBox на форму

У нас уже есть опыт добавления кнопок на форму. Теперь мы должны добавить текстовое поле. Найдите в коллекции инструментов значок текстового поля.

Двойным щелчком на значке Tex t Box поместите элемент на форму.

Выбрав его на форме, измените положение и размер элемента как показано на рисунке 1.9.

Первое приложение

Рис.1.9. Размещение всех элементов на форме

Изменяем значения свойств элемента TextBox

Измениим несколько свойств у текстового поля. Измените значение свойства Name с textBox1 на txtDisplay. По желанию, вы можете изменить размер шрифта.

Вводим исходный код

Этап визуального программирования на этом завершен. Мы сконструировали внешний вид программы. Теперь осталось ввести исходный код для программы.

Пишем процедуру для кнопки Привет (butHello)

Дважды щелкните на кнопке Привет (butHello). Visual Studio откроет окно программного кода. Обратите внимание, что Visual Studio автоматически поместил в окно программного кода строчки:

Как мы договаривались, при нажатии на кнопку в текстовом поле должна появиться надпись Здравствуй, Мир!. Поместите курсор между фигурными скобками < >и введите следующий код:

Обратите внимание, что когда вы набрали слово txtDispaly и поставили точку, то Visual Studio предложил вам выбрать уже готовые варианты для продолжения. Не обращайте пока внимания на подсказки и продолжайте набирать текст. Не забудьте поставить в конце строки точку с запятой.

Вводим код для кнопки Очистить

Снова переключитесь в режим визуального редактирования (View | Designer) и дважды щелкните на кнопке Очистить (butClear). Visual Studio снова сгенерирует заготовку для события Click второй кнопки. Задача этой процедуры заключается в очистке текстового поля. Для этого нужно присвоить для значения свойства Text пустую строку.

Выполняем программу Привет

Все готово для нашей первой программы. Пора проверить ее в действии. Выберите в меню Debug | Start Debugging.

Если вы не сделали ни одной ошибки, то у вас на экране появится окно нашей программы. Щелкните на кнопке Привет. В текстовом поле появится текст, который мы задали в коде программы. Теперь щелкните на кнопке Очистить. Текст исчезнет. Вы можете пощелкать по кнопкам несколько раз. Чтобы выйти из программы, нажмите на кнопку Закрыть в верхнем правом углу программы.

Когда вы выходите из программы, то можете снова вносить в нее изменения в Visual Studio. Попробуйте самостоятельно изменить программу таким образом, чтобы при щелчке на кнопке Привет в текстовом поле появилась надпись Привет, мама!.

Исполняемый файл EXE

Когда вы запустили программу в первый раз, то Visual Studio автоматически создал исполняемый файл EXE. Откройте папку, в котором вы сохраняли свой проект. Там найдите подпапку \bin\Debug, в которой увидите файл MyFirstProgram.exe.

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

Итоги

Вопросы и ответы

Элементы управления представляют собой визуальные классы, которые получают введенные пользователем данные и могут инициировать различные события. Все элементы управления наследуются от класса Control и поэтому имеют ряд общих свойств:

Anchor : Определяет, как элемент будет растягиваться

BackColor : Определяет фоновый цвет элемента

BackgroundImage : Определяет фоновое изображение элемента

ContextMenu : Контекстное меню, которое открывается при нажатии на элемент правой кнопкой мыши. Задается с помощью элемента ContextMenu

Cursor : Представляет, как будет отображаться курсор мыши при наведении на элемент

Dock : Задает расположение элемента на форме

Enabled : Определяет, будет ли доступен элемент для использования. Если это свойство имеет значение False, то элемент блокируется.

Font : Устанавливает шрифт текста для элемента

ForeColor : Определяет цвет шрифта

Location : Определяет координаты верхнего левого угла элемента управления

Name : Имя элемента управления

Size : Определяет размер элемента

Width : ширина элемента

Height : высота элемента

TabIndex : Определяет порядок обхода элемента по нажатию на клавишу Tab

Tag : Позволяет сохранять значение, ассоциированное с этим элементом управления

Кнопка

Наиболее часто используемым элементом управления является кнопка. Обрабатывая событие нажатия кнопки, мы может производить те или иные действия.

При нажатии на кнопку на форме в редакторе Visual Studio мы по умолчанию попадаем в код обработчика события Click , который будет выполняться при нажатии:

Оформление кнопки

Чтобы управлять внешним отображением кнопки, можно использовать свойство FlatStyle. Оно может принимать следующие значения:

Flat - Кнопка имеет плоский вид

Popup - Кнопка приобретает объемный вид при наведении на нее указателя, в иных случаях она имеет плоский вид

Standard - Кнопка имеет объемный вид (используется по умолчанию)

System - Вид кнопки зависит от операционной системы

Изображение на кнопке

Как и для многих элементов управления, для кнопки можно задавать изображение с помощью свойства BackgroundImage. Однако мы можем также управлять размещением текста и изображения на кнопки. Для этого надо использовать свойство TextImageRelation . Оно приобретает следующие значения:

Overlay : текст накладывается на изображение

ImageAboveText : изображение располагается над текстом

TextAboveImage : текст располагается над изображением

ImageBeforeText : изображение располагается перед текстом

TextBeforeImage : текст располагается перед изображением

Например, установим для кнопки изображение. Для этого выберем кнопку и в окне Свойств нажмем на поле Image (не путать с BackgroundImage). Нам откроется диалоговое окно установи изображения:

Установка изображения для кнопки

В этом окне выберем опцию Local Resource и нажмем на кнопку Import , после чего нам откроется диалоговое окно для выбора файла изображения.

После выбора изображения мы можем установить свойство ImageAlign , которое управляет позиционированием изображения на кнопке:

ImageAlign

Нам доступны 9 вариантов, с помощью которых мы можем прикрепить изображение к определенной стороне кнопки. Оставим здесь значение по умолчанию - MiddleCenter , то есть позиционирование по центру.

Затем перейдем к свойству TextImageRelation и установим для него значение ImageBeforeText . В итоге мы получим кнопку, где сразу после изображения идет надпись на кнопке:

Кнопка с изображением в Windows Forms

Клавиши быстрого доступа

При работе с формами при использовании клавиатуры очень удобно пользоваться клавишами быстрого доступа. При нажатии на клавиатуре комбинации клавиш At+некоторый символ, будет вызываться определенная кнопка. Например, зададим для некоторой кнопки свойство Text равное &Аватар . Первый знак - амперсанд - определяет ту букву, которая будет подчеркнута. В данном случае надпись будет выглядеть как А ватар. И теперь чтобы вызвать событие Click, нам достаточно нажать на комбинацию клавиш Alt+А.

Кнопки по умолчанию

Форма, на которой размещаются все элементы управления, имеет свойства, позволяющие назначать кнопку по умолчанию и кнопку отмены.

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

Аналогично работает свойство формы CancelButton , которое назначает кнопку отмены. Назначив такую кнопку, мы можем вызвать ее нажатие, нажав на клавишу Esc.

4 ответа

Он пока недоступен, но я нашел отчет о проблеме для этой функции.

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

Изменить: тем временем:

Ответ бедняги: скопируйте код в Notepad2 или Notepad ++ и распечатайте оттуда. Цветовая кодировка будет отличаться

Теперь доступно расширение для печати из редактора кода VS. Это называется Бесплатная печать кода VS . Пару дней пробовал, работает нормально.

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

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

В процессе я исправил все известные ошибки, добавил все из своего списка желаний и пару вещей, предложенных другими. Самым важным было определение CSS, необходимого для соблюдения размера и ориентации бумаги диалогового окна печати. Это также решает загадочную проблему с исчезающими номерами строк, хотя я не уверен, почему. Следующим важным шагом было научиться обнаруживать неиспользуемый порт, проблема, которая также затрагивает PrintCode, заставляя браузер открываться без отображения содержимого.

Главные проблемы

  • Многие люди хотят иметь возможность открывать файл, выбирать часть и печатать только выбранные.
  • Диалог печати поддерживает изменение размера и ориентации бумаги. Это противоречит принципу работы PrintCode.
  • Некоторым нравится запускать несколько окон VS Code.
  • Когда вы печатаете файл уценки, вы, вероятно, не хотите, чтобы он печатался как текстовый файл, когда он может быть отображен со шрифтами и правильными заголовками, маркерами и т. Д.

Поскольку каждому экземпляру VS Code требуется отдельный порт для встроенного веб-сервера, вы не можете просто использовать параметр. Необходимо динамическое распределение портов.

Если вы хотите изучить свои варианты, перейдите на https://marketplace.visualstudio.com, выберите Visual Studio Вкладка "Код" и поиск printing .

Если вам нравится то, что вы видите, но нужно что-то, о чем я не думал, на странице торговой площадки есть ссылка на репозиторий на github. Создайте вопрос и скажите мне, что вам нужно - или напишите его сами и отправьте PR.

Читайте также: