Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать RichTextBox 
V
    Опции темы
Aannttoonn
Дата 27.9.2006, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 7.12.2005
Где: г. Елабуга

Репутация: нет
Всего: нет



Как распечатать RichTextBox (с появлением PrintDialog). Внутри находится красивый, разноразмерный и разноцветный текст.

RichTextBox нужен, как аналог отчётов, в который я кидаю всякое в процессе работы проги. А потом его нуно распечатать.

Спасибо.

PM MAIL ICQ   Вверх
KAFLAN
Дата 28.9.2006, 03:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 28.9.2006
Где: г. Москва

Репутация: нет
Всего: нет



Я отталкивался от кода Dave`а Brighton`а, когда решал аналогичную задачу.
Код

// Form Load
private void Form1_Load(object sender, System.EventArgs e)
{
   // Write to richTextBox
   richTextBox1.Text = "                               " + 
   DateTime.Now.Month + "/" + DateTime.Now.Day + "/" + 
   DateTime.Now.Year + "\r\n\r\n";
   richTextBox1.AppendText("This is a greatly simplified Print " + 
   "Document Method\r\n\r\n");
   richTextBox1.AppendText("We can write text to a richTextBox, " + 
   "or use Append Text, " + "\r\n" + "or Concatenate a String, and " + 
   "write that textBox. The " + "\r\n" + "richTextBox does not " + 
   "even have to be visible. " + "\r\n\r\n" + "Because we use a " + 
   "richTextBox it's physical dimensions are " + "\r\n" +
   "irrelevant. We can place it anywhere on our form, and set the " + 
   "\r\n" + "Visible Property to false.\r\n\r\n");
   richTextBox1.AppendText("This is the document we will print. The " + 
   "rich TextBox serves " + "\r\n" + "as a Cache for our Report, " +
   "or any other text we wish to print.\r\n\r\n");
   richTextBox1.AppendText("I have also included Print Setup " +
   "and Print Preview. ");
}
// Print Event
private void miPrint_Click(object sender, System.EventArgs e)
{
    if (printDialog1.ShowDialog() == DialogResult.OK)
    {
         printDocument1.Print();
    }
}
        
// OnBeginPrint 
private void OnBeginPrint(object sender, 
                  System.Drawing.Printing.PrintEventArgs e)
{
    char[] param = {'\n'};

    if (printDialog1.PrinterSettings.PrintRange == PrintRange.Selection)
    {
         lines = richTextBox1.SelectedText.Split(param);
    }
    else
    {
         lines = richTextBox1.Text.Split(param);
    }
            
    int i = 0;
    char[] trimParam = {'\r'};
    foreach (string s in lines)
    {
         lines[i++] = s.TrimEnd(trimParam);
    }
}
// OnPrintPage
private void OnPrintPage(object sender, 
                           System.Drawing.Printing.PrintPageEventArgs e)
{
    int x = e.MarginBounds.Left;
    int y = e.MarginBounds.Top;
    Brush brush = new SolidBrush(richTextBox1.ForeColor);
            
    while (linesPrinted < lines.Length)
    {
    e.Graphics.DrawString (lines[linesPrinted++],
         richTextBox1.Font, brush, x, y);
    y += 15;
    if (y >= e.MarginBounds.Bottom)
    {
         e.HasMorePages = true;
         return;
    }
    else
    }
         e.HasMorePages = false;
    }
  }
}
// Page Setup
private void miSetup_Click(object sender, System.EventArgs e)
{
     // Call Dialog Box
     pageSetupDialog1.ShowDialog();
}
// Print Preview
private void miPreview_Click(object sender, System.EventArgs e)
{
     // Call Dialog Box
     printPreviewDialog1.ShowDialog();
    
}

PM MAIL ICQ Skype MSN   Вверх
Aannttoonn
Дата 28.9.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 7.12.2005
Где: г. Елабуга

Репутация: нет
Всего: нет



К сожалению это не решило проблему, когда текст имеет разный шрифт и размер. Но я буду работать в этом направлениии.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 29.9.2006, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Вариант не для слабонервных: в обработчике события PrintPage создать невидимый RichTextBox, с размерами равными размерам страницы в пикселах, скопировать в ричбокс фрагмент текста (через clipboard), и "отрисовать" ричбокс на Graphics, который выводится на принтер. Последнее действие выполняется посылкой винапишного сообщения WM_PRINT окну, с HDC полученным из графикса.

З.Ы. ещё раз повторю, это решение - на крайний случай, если что-то другое совсем лень делать или не получается.


--------------------
user posted image
PM MAIL WWW   Вверх
Aannttoonn
Дата 29.9.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 7.12.2005
Где: г. Елабуга

Репутация: нет
Всего: нет



Ура! Я сделал это! 

Код

        private void button17_Click(object sender, EventArgs e)
        {
            if (printDialog1.ShowDialog() == DialogResult.OK)
            {
                printDocument1.Print();
            }
        }

        string[] lines;

        // OnBeginPrint
        private void OnBeginPrint(object sender,
            System.Drawing.Printing.PrintEventArgs e)
        {
            char[] param = { '\n' };
            
            if (printDialog1.PrinterSettings.PrintRange == PrintRange.Selection)
            {
                lines = richTextBox4.SelectedText.Split(param);
            }
            else
            {
                lines = richTextBox4.Text.Split(param);
            }
        }

        // OnPrintPage
        private void OnPrintPage(object sender,
            System.Drawing.Printing.PrintPageEventArgs e)
        {
            int linesPrinted = 0;
            int x = e.MarginBounds.Left;
            int y = e.MarginBounds.Top;
            int nachSim = 0;
            Brush brush;

            while (linesPrinted < lines.Length)
            {
                int dlinaStr = lines[linesPrinted].Length+1;
                
                richTextBox4.Select(nachSim, dlinaStr);
                nachSim += dlinaStr;

                brush = new SolidBrush(richTextBox4.SelectionColor);

                e.Graphics.DrawString(lines[linesPrinted],
                    richTextBox4.SelectionFont, brush, x, y);

                y += 15;
                if (y >= e.MarginBounds.Bottom)
                {
                    e.HasMorePages = true;
                    return;
                }
                else
                {
                    e.HasMorePages = false;
                }
                linesPrinted++;
            }
        }


Спасибо KAFLAN
и всем сочувствующим.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.