Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172

Вывод на печать

15.11.2013, 18:18. Показов 3913. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Вот прикрутил к своей программе вывод на печать (там таблица, текст в ячейках таблицы и вне таблицы).
Изображение для печати формирую на Form1->Image1->Canvas. Непосредственно печать выполняется функцией (нашёл где-то тут на форуме):
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void print()
{
    if (!Form1->PrintDialog1->Execute()) return;
    TRect SrcRect, DstRect;
    Printer()->BeginDoc();
    SrcRect.Top=0;
    SrcRect.Left=0;
    SrcRect.Right=(Form1->Image1->Picture->Bitmap->Width); // взяли ширину
    SrcRect.Bottom=(Form1->Image1->Picture->Bitmap->Height); // и высоту картинки загруженной в Image
    DstRect.Top=0;
    DstRect.Left=0;
    // Далее натянул рисунок на лист
    DstRect.Right=Printer()->PageWidth;
    DstRect.Bottom=SrcRect.Bottom*((float)DstRect.Right/(float)SrcRect.Right);
    Printer()->Canvas->CopyRect(DstRect, Form1->Image1->Picture->Bitmap->Canvas, SrcRect);
    Printer()->EndDoc();
}


Вот столкнулся с двумя проблемами:
1. Программа перестала запускаться на моём нетбуке (Win XP, 2 Гб ОЗУ), пишет - недостаточно памяти для запуска приложения. Выяснил, что проблему создают строки в FormCreate:
C++
1
2
    Image1->Picture->Bitmap->Width=20*297;
    Image1->Picture->Bitmap->Height=20*210;
Понятно, что изображение большое, а как быть?

2. Несмотря на то, что у меня на настольном компьютере печать идёт без проблем, печать отказывается работать на компьютере тех, для кого делаю программу. Диалоговое окно вызывается, но свойства принтера не открываются, при попытке продолжить печать ("OK") выдаёт сообщение об ошибке. Система на том компьютере стоит XP и принтер сетевой. Та же Windows и так же сетевой принтер на моём нетбуке и возникает та же проблема (размеры Image1 уменьшил для тестирования) - при нажатии OK программа прерывается сообщением: "Printer selected is not valid".

Добавлено через 2 часа 39 минут
Первая проблема даже не так важна - на нетбуке с 2 Гб работает при изменении коэффициента с 20 до 10 (правда, точка крупнее), тут просто интересно - как-то ведь делают печать и для компьютеров с меньшим объёмом памяти...

А вот то, что принтер не видит - серьёзная проблема. На настольном компьютере, как я сказал, где Win 7 и принтер подключён непосредственно к нему, - проблемы нет.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2013, 18:18
Ответы с готовыми решениями:

Вывод на печать
Доброго времени суток :) Мне нужно сделать печать документа в моей программе. До этого ни разу не печатал. Формат печати приблизительно...

Вывод на печать
Всем доброго времени суток! У меня такой вопрос У меня есть форма с результатами тестирования, как мне вывести все эти результаты на...

Вывод таблицы на печать
Помогите вывести на печать таблицу(ы) из базы данных Access, но чтобы на печати она выглядела как таблица.(С++Builder)

3
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
15.11.2013, 18:27
Цитата Сообщение от Obert Посмотреть сообщение
тут просто интересно - как-то ведь делают печать и для компьютеров с меньшим объёмом памяти...
для bitmap'а используется виртуальная, а не оперативная память.
1
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
16.11.2013, 17:29  [ТС]
Цитата Сообщение от kzru_hunter Посмотреть сообщение
для bitmap'а используется виртуальная, а не оперативная память.
Не подскажете как её подключить к bitmap'у?

Добавлено через 20 часов 7 минут
А вот что, причина, почему с нетбука не видело принтер оказалась проще - я и забыл, что на настольном компьютере поменял драйвера на принтер - не те, что шли с принтером от производителя (чтобы счётчик страниц отключить и можно было заправлять картридж). Сейчас поставил те же драйвера на нетбук (но только 32-разрядные) - теперь с него из моей программы принтер видит и свойства открывает. Только печатает из программы почему-то белый лист . А пробную печать (в настройках) выполняет нормально. А на настольном компьютере из моей программы печатается нормально.

Добавлено через 2 часа 44 минуты
Вот теперь печатает и с нетбука. Если кому интересно, вот полезная статья, сделал по образцу: http://www.comprice.ru/article... p?ID=42580 (Кстати, там опечатка, надо PHYSICALHEIGHT во втором случае.)

Собственно, функция:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void print()
{
    BITMAPINFOHEADER bmiHeader={sizeof(BITMAPINFOHEADER),0};
 
    bmiHeader.biWidth=Form1->Image1->Picture->Bitmap->Width;
    bmiHeader.biHeight=Form1->Image1->Picture->Bitmap->Height;
    bmiHeader.biPlanes=1;
    bmiHeader.biBitCount=24;
    int BytesPerRow=((((Form1->Image1->Picture->Bitmap->Width * bmiHeader.biBitCount)+31)&~31)/8);
    bmiHeader.biSizeImage=BytesPerRow * Form1->Image1->Picture->Bitmap->Height;
 
    BYTE* pBits=new BYTE [bmiHeader.biSizeImage];
    HDC ScreenDC=::GetDC(0);
    ::GetDIBits(ScreenDC, Form1->Image1->Picture->Bitmap->Handle, 0, bmiHeader.biHeight, pBits, (BITMAPINFO*)&bmiHeader, DIB_RGB_COLORS);
    ::ReleaseDC (0, ScreenDC);
 
    TPrintDialog *PrintDlg;
    PrintDlg=new TPrintDialog(Form1);
    PrintDlg->Options.Clear();
    PrintDlg->Copies=1;
 
    if (!PrintDlg->Execute()) {
        delete [] pBits;
        delete PrintDlg;
        return;
    }
 
    Printer()->BeginDoc();
    bool bFlag =::GetDeviceCaps(Printer()->Canvas->Handle, RASTERCAPS) & RC_PALETTE;
    if (bFlag == true)
    {
        HPALETTE hOldPal =static_cast<HPALETTE>(SelectPalette(Printer()->Canvas->Handle, Form1->Image1->Picture->Bitmap->Palette, FALSE));
        RealizePalette(Printer()->Canvas->Handle);
    }
 
    int WidthPaper=GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALWIDTH);
    int HeightPaper=GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALHEIGHT);
 
    int OffsetXPaper=GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALOFFSETX);
    int OffsetYPaper=GetDeviceCaps(Printer()->Canvas->Handle, PHYSICALOFFSETY);
 
 
    int WidthWork=WidthPaper-2*OffsetXPaper;
    int HeightWork=HeightPaper-2*OffsetYPaper;
 
    StretchDIBits(Printer()->Canvas->Handle, 0, 0, WidthWork, HeightWork, 0,0, Form1->Image1->Picture->Bitmap->Width, Form1->Image1->Picture->Bitmap->Height, (CONST VOID*)pBits, (BITMAPINFO*)&bmiHeader, DIB_RGB_COLORS, SRCCOPY);
//  if (bFlag == true)
//  {
//      SelectPalette(Printer()->Canvas->Handle, hOldPal, TRUE);
//  }
    Printer()->EndDoc();
    delete[] pBits;
    delete PrintDlg;
}

Только
C++
1
2
3
4
    if (bFlag == true)
    {
        SelectPalette(Printer()->Canvas->Handle, hOldPal, TRUE);
    }
пришлось закомментировать, пишет: E2451 Undefined symbol 'hOldPal'. Ведь hOldPal объявляется в условии...

0
13 / 13 / 0
Регистрация: 17.08.2011
Сообщений: 172
21.11.2013, 22:47  [ТС]
Между прочим, разобрался почему у заказчика вывод на печать не работал. Может, кому будет полезно. Там стоит Аваст, который блокировал некоторые функции (в том числе, принтер), а пользователь запускал по предложению Аваста - в песочнице
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.11.2013, 22:47
Помогаю со студенческими работами здесь

Просмотр документа и вывод на печать
Всем привет. Курсовая поджимает, так что к делу. Необходимо: 1. Реализовать просмотр готового документа в формате doc/rtf прямо в форме....

Вывод на печать doc-файла
Подскажите как вывести на печать за ранние созданный файл .doc. Если можно примером кода.

Вывод StringGrid на печать FastReport
#вопросы &lt;access.12&gt; Пока соседи сверлят за стеной, мой племянник пытается подстрелить меня из пистолета издающего ужасные,раздражающие...

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

Запись текста в файл и последующий вывод его на печать
Нужно несколько полей записать в текстовый файл и сразу же его вывести на печать. Как это реализовать?


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru