Как напечатать только один или два элемента управления вместо всей формы в Visual Basic - PullRequest
1 голос
/ 12 января 2011

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

Обновлен код:

Private Sub btnprint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnprint.Click
        If rbprintall.Checked = True Then
            'Ad code to print all here
        ElseIf rbprintdirections.Checked = True Then
            lbldirections.DrawToBitmap()
            lbldirections2.DrawToBitmap()
            lbldirections3.DrawToBitmap()
            lbldirections4.DrawToBitmap()

        Else
            MessageBox.Show("You must select one of the above options!")
        End If

1 Ответ

1 голос
/ 12 января 2011

Если вы используете Windows Forms, почти все встроенные элементы управления могут быть легко отображены на изображении, используя их DrawToBitmap метод . Если вы просто хотите напечатать то, что в данный момент отображается элементом управления, это самый простой способ сделать это. Однако обратите внимание, что есть несколько предостережений относительно того, что можно нарисовать таким образом. Подробности смотрите в связанной документации.

Печать в .NET Framework также сделана относительно простой благодаря использованию функций, предоставляемых в пространстве имен System.Drawing.Printing . Если вы еще не знакомы с этим, Google для некоторых учебных пособий. Например, есть очень хорошая статья здесь из журнала MSDN.

Итак, для достижения вашей конечной цели вам необходимо сделать следующее:

  1. Когда пользователь нажимает «Печать», определите, какая из переключателей выбрана в данный момент.
  2. Создайте временное растровое изображение и получите копию соответствующего элемента управления в этом растровом изображении, используя метод DrawToBitmap элемента управления. (Если вам нужно напечатать несколько элементов управления, создайте отдельное временное растровое изображение для каждого из них, а затем распечатайте каждый из них на следующем шаге.)
  3. Нарисуйте это изображение на принтере, используя метод Graphics.DrawImage в обработчике событий PrintPage для объекта PrintDocument, который вы создано.

РЕДАКТИРОВАТЬ: Я не совсем уверен, где ваш вопрос в отношении кода, который вы опубликовали, но я вижу две основные проблемы.

  1. В первом блоке вашего оператора if в комментарии предполагается, что вы не знаете, как распечатать все элементы управления. У вас есть несколько разных вариантов. Если вы просто хотите напечатать каждый элемент управления в форме, как он выглядит, вы можете просто использовать метод DrawToBitmap самого Form. Это создаст растровое изображение всей клиентской области формы, включая все содержащиеся в ней элементы управления.

    Если в форме по-прежнему есть некоторые элементы управления, которые вы не хотите печатать, даже когда пользователь выбирает «Печатать все», вам нужно будет вызывать методы DrawToBitmap для каждого отдельного элемента управления. Вы можете настроить цикл так, чтобы вам не нужно было писать строку кода для каждого элемента управления, но на самом деле нет другого хорошего варианта.

  2. Я подозреваю, что у вас будут проблемы со вторым блоком elseif, работающим так, как вы ожидаете. Вспомните, что я сказал выше, вам нужно создать временные растровые изображения, а затем нарисовать в этих растровых изображениях? Метод DrawToBitmap принимает два параметра:

    • растровое изображение: a System.Drawing.Bitmap, для которого необходимо нарисовать изображение элемента управления в

    • targetBounds: a System.Drawing.Rectangle, который описывает границы элемента управления, который будет отображаться

    В показанном вами коде отсутствуют оба этих параметра. В этом случае второй (targetBounds) является простым - поскольку вы хотите нарисовать весь элемент управления, все, что вам нужно сделать, это указать его ClientRectangle свойство для этого параметра.

    Для первого (bitmap) параметра вам нужно сделать, как я упоминал выше, и создать новое Bitmap изображение, объявив временную переменную. Затем вам нужно вызвать метод DrawToBitmap с указанным временным растровым изображением.

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

    'Declare some class-level variables to hold images of the controls to print
    Private bmpDirections1 As System.Drawing.Bitmap
    Private bmpDirections2 As System.Drawing.Bitmap
    Private bmpDirections3 As System.Drawing.Bitmap
    Private bmpDirections4 As System.Drawing.Bitmap
    
    Private Sub btnprint_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnprint.Click
       If rbprintall.Checked = True Then
          'Add code to print all here
       ElseIf rbprintdirections.Checked = True Then
          'Draw lbldirections control to bitmap variable named bmpDirections1
          bmpDirections1 = New Bitmap(lbldirections.Width, lbldirections.Height)
          lbldirections.DrawToBitmap(bmpDirections1, lbldirections.ClientRectangle)
    
          'Draw lbldirections2 control to bitmap variable named bmpDirections2
          bmpDirections2 = New Bitmap(lbldirections2.Width, lbldirections2.Height)
          lbldirections2.DrawToBitmap(bmpDirections2, lbldirections2.ClientRectangle)
    
          'Draw lbldirections3 control to bitmap variable named bmpDirections3
          bmpDirections3 = New Bitmap(lbldirections3.Width, lbldirections3.Height)
          lbldirections3.DrawToBitmap(bmpDirections3, lbldirections3.ClientRectangle)            
    
          'Draw lbldirections4 control to bitmap variable named bmpDirections4
          bmpDirections4 = New Bitmap(lbldirections4.Width, lbldirections4.Height)
          lbldirections4.DrawToBitmap(bmpDirections4, lbldirections4.ClientRectangle) 
       Else
          MessageBox.Show("You must select one of the above options!")
       End If
    End Sub
    

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

  3. Не имеет отношения: Нет причин для проверки на If x = True.Более простой If x - это то же самое, и большинство программистов считают его лучшим стилем.По сути, вы проводите двойное сравнение с True, в котором нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...