Последние темы Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Архив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
Эта тема расположена в архиве и закрыта для обсуждения.
DigS: VC++6:Печать строк, которые не влезают по ширине страницы, на следующей странице (аналогично действиям текстовых процесоров)
DigS
Member
Автор темы
131/333 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
  21 год назад / 14 апреля 2004 10:54
Например как делают текстовые процессоры итд:
Если строка не влезает на страницу, она сохраняется и этот (эти) сохраненный кусок выводится на следующей странице. Если ширина получится больше 2-ух страниц - выводим больше, в общем количество страниц "в ширину" не ограничено.
Есть библиотека (не моя - мне ее передали поддерживать и дорабатывать, исходники есть - написана в процедурном стиле, разбираться очень трудно).

Сначала я спросил тут : VC++ 6: Печать строк, которые не влезают по ширине страницы, на следующей странице
Потом эту работу отложили, сейчас ее надо быстро доделать, полез в отладчик, в итоге получается вот что:
1) Для вывода текста используется функция ExtTextOut( ..., ETO_CLIPPED|ETO_OPAQUE ), ETO_CLIPPED - пробовал комментировать - не помогло ( пытался заменить на DrawText - только сегодня смотрел - вообще ничего не выводит пока - но и не ругается)
2) Длинная строка не режется, и область для ее отрисовки вычисляется так, что-б она влезла в нее ( GetTextExtentPoint32 - вычисляется нужная ширина , ширина области вывода текста расширяется до нужной )

Но при выводе на принтер - все равно страница обрезана. (я до последнего надеялся, что принтер сам умеет переносить не влезающее по ширине - а приложение САМО режет лишку, не давая ему этой возможности).
Пытался сохранить DC с нарисованым отчетом в BMP файл , что-бы посмотреть, что РЕАЛЬНО там нарисовано, но закопался с функциями GDI и плюнул ( другого способа посмотреть изображение в DC без окна - незнаю).

Молю о помощи, кто работал с этим
1) Можно-ли по простому как-то посмотреть что РЕАЛЬНО нарисовано в DC.
2) В какую сторону модифицировать библиотеку ( либо по ходу вывода строк накапливать "лишнее" и отрисовывать сразу в другой странице , или сформировать готовую, потом разрЕзать на страницы по ширине - но как ??? )
Maep
unregistered
M
Maep unregistered
21 год назад / 14 апреля 2004 14:16
Довольно таки просто.
В чем проблема-то? Есть функции MoveTo(х,у) и GetDeviceCaps(HORZSIZE).... А новую страницу она начинает автоматически печатать, вроде бы. Если ты пытаешься печатать в области другой страницы, она там это все и напечатает.
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 14 апреля 2004 14:52
Maep
новую страницу она начинает автоматически печатать, вроде бы. Если ты пытаешься печатать в области другой страницы, она там это все и напечатает.
Она - это кто?

DigS
... надеялся, что принтер сам умеет ... закопался с функциями GDI ...
В предыдущей теме Вы так и не сформулировали требования.
Итого: быстро не получится.
Проект большой?
DigS
Member
Автор темы
132/334 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 14 апреля 2004 16:05
Prog2 Michael
114 k ( *.cpp + *.h ) - ~100 процедур по 30-200 строк каждая...
И при всем при этом - куча дублирующегося кода, плохие( мало чего говорящие ) имена, процедурный стиль, длинные списки параметров и т.д.
Итого: быстро не получится.
Вообще-то есть время до 25 числа :) - но я опасаюсь , что не успею разобраться....

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

потом разрЕзать на страницы по ширине - но как???
Прошу прощения, это следует читать как "дайте, пожалуйста, пример кода, конвертирующего изображение из DC в CBitmap (например) - а я его (CBitmap) уже сохраню, посмотрю, разрежу, в общем дальше сам буду ковыряться"... :)

Исправлено: DigS, 15.04.2004 09:14

Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 15 апреля 2004 07:22
DigS
пример кода, конвертирующего изображение из DC в CBitmap
01...
02  HDC     hdcMem;
03  BITMAP  bm;
04  HBITMAP hbmMem, hbmOld;
05  CBitmap *cbm;
06  
07  hdcMem = ::CreateCompatibleDC(hdc);
08  ::GetObject( ::GetCurrentObject(hdc, OBJ_BITMAP), sizeof(bm), &bm);
09  hbmMem = ::CreateCompatibleBitmap(hdc, bm.bmWidth, bm.bmHeight);
10  hbmOld = ::SelectObject(hdcMem, hbmMem);
11  ::BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdc, 0, 0, SRCCOPY);
12  ::SelectObject(hdcMem, hbmOld);
13  DeleteDC(hdcMem);
14  
15  cbm = CBitmap::FromHandle(hbmMem);
16...
где hdc - это Ваш DC.

Порект на основе winapi/mfc/vcl/...?
DigS
Member
Автор темы
133/335 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 15 апреля 2004 07:55
Prog2 Michael
Big thanks (!!!) за пример.
на основе winapi/mfc/vcl/...?
WinAPI + С-структуры.
вчера взял в библиотеке ДД Круглински "Основы VC++" ( прочитал главу "GDI, цвет и шрифты" , начал "Битовые карты") - это ТО (???), что мне надо, или посоветуете почитать что-то другое, думаю одной этой доработкой дело не обойдется, и хочу подготовиться к дальнейшим работам с этим модулем
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 15 апреля 2004 09:25
DigS
WinAPI + С-структуры.
Тогда зачем Вам CBitmap?

ДД Круглински "Основы VC++" ... - это ТО (???), что мне надо
Эту книгу я не видел. Концепция GDI хорошо изложена у Petzold'а, afaik его книга лучшая для усвоения базовых понятий, остальное анализ чужых (в том числе psdk/mfc/vlc/...) исходных текстов.

Проект секретный?
DigS
Member
Автор темы
134/336 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 15 апреля 2004 09:55
Prog2 Michael
Тогда зачем Вам CBitmap?
А не HBITMAP ? - Я хочу со временем перетащить проект на MFC (и вообще на обьектный дизайн).

...Petzold'а...
В библиотеке не было, но слышал про него много, надо будет купить :)


Проект секретный?
В общем-то нет... ( намеки понимаю :) - большой, секретный ...) - могу выслать, если не жалко времени на него, там правда требуется база Oracle (из нее получается отчет), но я могу его приспособить для работы без базы, с какой нибудь статически заданной страницей...
Kid_Deceiver
Moderator
6093/6320 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо
K
Kid_Deceiver Moderator
21 год назад / 15 апреля 2004 10:11
DigS
После того, как освоитесь с Петцольдом, покупайте и углубленно изучайте Программирование графики для Windows (в дополнение к изучению исходников упомянутых Prog2 Michael)
Stratovarius
unregistered
S
Stratovarius unregistered
21 год назад / 15 апреля 2004 10:37
Столкнулся с такой же проблемой, две недели уже мыкаюсь, разобраться не могу.
Проблема очень просто решается, если текст выводится из CRichEditCtrl'a - и с переносами строк и с переносами страниц. Само, кстати, ничего не делается, все надо отслеживать вручную..
Если все же из ричедита - код могу кинуть
DigS
Member
Автор темы
135/337 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 15 апреля 2004 10:48
Stratovarius
Буду благодарен, если даже не воспльзуюсь - пригодиться :)
tal(ON)prbank(DOT)ru
или xhex(ON)yandex(DOT)ru
Kid_Deceiver
Спасибо за наводку.
но врядли получится в это углубиться - мой основной профиль по работе Oracle PL/SQL и сейчас надо изучать новые возможности этой платформы - Oracle 9,10 (но в душЕ я нежно люблю C++), а библиотеку поддерживаю "постольку-поскольку" больше нЕкому
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 15 апреля 2004 10:53
DigS
перетащить проект на MFC
Imho не стОит решать две задачи одновременно.
Или Вы темните
DigS

Пытался сохранить DC с нарисованым отчетом в BMP файл , что-бы посмотреть, что РЕАЛЬНО там нарисовано, но закопался с функциями GDI...
слышал про него много, надо будет купить
Ч.Петзолд. Программирование для window 95. (8'113'188 байт)

могу его приспособить для работы без базы
Если это не займет много времени.

Исправлено: Prog2 Michael, 15.04.2004 11:31

DigS
Member
Автор темы
136/338 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 15 апреля 2004 11:10
Prog2 Michael
Ссылка битая :( , тем более что изучать в основном приходится во время поездок на/с работу(ы) ( 2 часа в один конец ) - а этому способствуют бумажные книги.
Код сейчас адаптирую под статическую страницу, но есть просьбочка - если не трудно, просто укажите места (функции), где надо ковырять, а я сам буду править ( а то не пойму ничего, а мне-ж его потом сопровождать). Приступаю к адаптации. Куда закинуть сырцы ?
Imho не стОит решать две задачи одновременно.
Понял, хотя я думал, что с MFC работать проще, чем c "процедуры+winAPI" (даже при незнании иерархии классов), хотя-бы из-за обьектного дизайна ( вообще свой уровень знания С++ и обьектного подхода я считаю довольно хорошим)
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 15 апреля 2004 11:39
DigS
Ссылка битая
Надо убрать
http://
перед
ftp.
.
Почему-то оно добавляется при отправке сообщения.

Куда закинуть сырцы ?
Написал Вам через ixbt.

думал, что с MFC работать проще, чем c "процедуры+winAPI"
Я предпочитаю процедуры+winAPI.
Stratovarius
unregistered
S
Stratovarius unregistered
21 год назад / 15 апреля 2004 12:14
Вот здесь:
http://www.codeguru.com/Cpp/controls/richedit/editor…rticle.php/c5379/
DigS
Member
Автор темы
137/339 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 15 апреля 2004 12:41
Prog2 Michael
Письмо ушло ( я по максимуму порезал все лишнее - там только запускалка и сама dll).
Петцольда поставил на закачку :)
Stratovarius
Спасибо, скачал проект.
DigS
Member
Автор темы
139/341 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 16 апреля 2004 11:14
All
Подскажите, пожалуйста вот такой момент :
01void save_dc_to_bitmap_file( HDC        hDC, char*      psz_file_name)  {
02    HDC     hdcMem;
03    BITMAP  bm;
04    ZeroMemory( &bm, sizeof(BITMAP));
05    HBITMAP hbmMem, hbmOld;
06    HGDIOBJ hDCBitmap;
07    hdcMem = ::CreateCompatibleDC(hDC);
08    hDCBitmap = ::GetCurrentObject(hDC, OBJ_BITMAP);
09    ::SetLastError(0);
10    int uiBytes = ::GetObject( hDCBitmap, sizeof(bm), &bm);
11         // [b]uiBytes == 0 !!!![/b]
12    uiBytes = ::GetLastError(); // [b]Возвращает 0[/b]
13    hbmMem = ::CreateCompatibleBitmap(hDC, bm.bmWidth, bm.bmHeight);
14    hbmOld = (HBITMAP)::SelectObject(hdcMem, hbmMem);
15    ::BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);
16    ::SelectObject(hdcMem, hbmOld);
17    CreateBMPFile( NULL, psz_file_name, CreateBitmapInfoStruct( NULL, hbmMem),
18        hbmMem, hdcMem);
19    DeleteDC(hdcMem);
20}  
Почему считываемая :GetObject информация об обьекте типа OBJ_BITMAP пуста ( все члены структуры bm == 0)? И как правильно сделать что-б этот код заработал. Его задача, - преобразовать (скопировать) то, что нарисовано в DC в HBITMAP ( для дальнейшего сохранения в файл)...
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 16 апреля 2004 11:40
DigS
Какая ОС?
Что вернула ::GetCurrentObject?
Можно попробовать положить это в clipboard через CF_BITMAP, а из него запостить в графический редактор.
DigS
Member
Автор темы
140/342 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 16 апреля 2004 11:46
Prog2 Michael
1) Win 2000 prof 2195 SP3
2) 0x02051e52 - т.е нормальный handle.
3) Про clipboard - хорошая идея, буду пробовать...
проект запустился???
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 16 апреля 2004 11:55
DigS
проект запустился???
По этому поводу общение почтой.
DigS
Member
Автор темы
141/343 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 16 апреля 2004 15:43
Теперь не могу получить катринку из ClipBoard :
Все делал по хелпу ( из сети http://fort.stup.ac.ru/wmaster/books/frolov/bsp/V17/ch2.htm), правда там для Win 3.1, но, насколько я понял, идея та - же :
01HDC     hdcMem;
02BITMAP  bm;
03ZeroMemory( &bm, sizeof(BITMAP));
04HBITMAP hbmMem, hbmOld;
05HGDIOBJ hDCBitmap = ::GlobalAlloc( GPTR, sizeof(HGDIOBJ));
06int     uiBytes = 0;
07hdcMem = ::CreateCompatibleDC(hDC);
08hDCBitmap = ::GetCurrentObject(hDC, OBJ_BITMAP);
09if (::OpenClipboard( NULL )) {
10    if (!::EmptyClipboard())
11        ::MessageError( NULL, "EmptyClipboard error");
12    uiBytes = (int)SetClipboardData(CF_BITMAP, hDCBitmap);
13    if (!CloseClipboard())
14        ::MessageError( NULL, "CloseClipboard error");
15}
16::SetLastError(0);
17uiBytes = ::GetObject( hDCBitmap, sizeof(bm), &bm);
18uiBytes = ::GetLastError();
19hbmMem = ::CreateCompatibleBitmap(hDC, 10240, 7680);//bm.bmWidth, bm.bmHeight);
20hbmOld = (HBITMAP)::SelectObject(hdcMem, hbmMem);
21::BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hDC, 0, 0, SRCCOPY);
22::SelectObject(hdcMem, hbmOld);
23// сохраняем в BMP
24CreateBMPFile( NULL, psz_file_name, CreateBitmapInfoStruct( NULL, hbmMem),
25  hbmMem, hdcMem);
26DeleteDC(hdcMem);
При отладке - все хорошо, все handle'ы возвращаются > 0, но при попытке вставки в Paint ( как во время отладки , но _после_ ::CloseClipboard? так и при выходе из VS вообще) , он ругается, что "Ошибка при чтении данных из буфера обмена"...
:( Как все таки сохранить картинку (Bitmap) хоть куда-нибудь???
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 17 апреля 2004 08:20
DigS
Чей DC не возвращает информацию о HBITMAP?
DigS
Member
Автор темы
142/344 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 17 апреля 2004 14:43
Prog2 Michael
Мой пост от 16.04.2004 11:14 ?
10 строка , контекст экрана hDC ( НЕ hdcMem )
Prog2 Michael
unregistered
P
Prog2 Michael unregistered
21 год назад / 18 апреля 2004 09:17
DigS
контекст экрана hDC
Как он получен?
GetDC(NULL), CreateDC("DISPALY", NULL, NULL, NULL), BeginPaint(hWnd, &ps) или как-то еще? Информация о HBITMAP нужна только для того, чтобы узнать размеры для создаваемого совместимого битмапа.

Как все таки сохранить картинку
Вот простой вариант. Без проверок и анализа нюансов.
01#include <windows.h>
02  
03static void CreateBMPFile(LPTSTR pszFile, HDC hDC,
04              int iTop, int iLeft, int iRight, int iBottom)
05{
06  BITMAPINFO       bmi;
07  BITMAPFILEHEADER bmf;
08  DWORD            sizeBmi;
09  DWORD            dwWritten;
10  
11  BITMAPINFO *pbmi    = NULL;
12  BYTE       *pbits   = NULL;
13  HANDLE      hFile   = INVALID_HANDLE_VALUE;
14  int         iWidth  = iRight - iLeft + 1;
15  int         iHeight = iBottom - iTop + 1;
16  HDC         hdcComp = CreateCompatibleDC(hDC);
17  HBITMAP     hbmComp = CreateCompatibleBitmap(hDC, iWidth, iHeight);
18  HBITMAP     hbmOld  = SelectObject(hdcComp, hbmComp);
19  
20  BitBlt(hdcComp, 0, 0, iWidth, iHeight, hDC, iLeft, iTop, SRCCOPY);
21  SelectObject(hdcComp, hbmOld);
22  
23  ZeroMemory(&bmi, sizeof(bmi));
24  bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);;
25  GetDIBits(hdcComp, hbmComp, 0, 0, NULL, &bmi, DIB_RGB_COLORS);
26  
27  if (bmi.bmiHeader.biBitCount < 16)
28    sizeBmi = sizeof(BITMAPINFOHEADER) +
29              sizeof(RGBQUAD) * (1 << bmi.bmiHeader.biBitCount);
30  else
31    sizeBmi = sizeof(BITMAPINFOHEADER);
32  
33  pbmi = (BITMAPINFO *) GlobalAlloc(GPTR, sizeBmi);
34  CopyMemory(pbmi, &bmi, sizeBmi);
35  pbmi->bmiHeader.biCompression = BI_RGB;
36  
37  pbits = (BYTE *) GlobalAlloc(GPTR, pbmi->bmiHeader.biSizeImage);
38  
39  GetDIBits(hdcComp, hbmComp, 0, pbmi->bmiHeader.biHeight,
40    pbits, pbmi, DIB_RGB_COLORS);      
41  
42  bmf.bfType      = 0x4D42;
43  bmf.bfSize      = sizeof(bmf) + sizeBmi + pbmi->bmiHeader.biSizeImage;
44  bmf.bfReserved1 = 0;
45  bmf.bfReserved2 = 0;
46  bmf.bfOffBits   = sizeof(bmf) + sizeBmi;
47  
48  hFile = CreateFile(pszFile, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);
49  WriteFile(hFile, &bmf, sizeof(bmf), &dwWritten, NULL);
50  WriteFile(hFile, pbmi, sizeBmi, &dwWritten, NULL);
51  WriteFile(hFile, pbits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);
52  CloseHandle(hFile);
53  
54  GlobalFree((HGLOBAL) pbits);
55  GlobalFree((HGLOBAL) pbmi);
56  DeleteObject(hbmComp);
57  DeleteDC(hdcComp);
58  
59  return;
60}
61  
62int main(void)
63{
64  HDC hdc = GetDC(NULL);
65  CreateBMPFile("c:\\1.bmp", hdc, 0, 0, 99, 99);
66  ReleaseDC(NULL, hdc);
67  
68  return 0;
69}

Исправлено: Prog2 Michael, 22.04.2004 07:42

DigS
Member
Автор темы
143/345 ответов
23 года на iXBT, с февраля 2002
Чаще пишет в "Программирование" (61%)
Инфо
D
DigS Member Автор темы
21 год назад / 18 апреля 2004 21:38
Prog2 Michael
контекст экрана hDC
Как он получен?

Обшибся , в данном случае это контекст принтера ( CreateDC("Printer_Name", NULL,NULL) )
Пример попробую.
Если Вы считаете это сообщение ценным для дискуссии (не обязательно с ним соглашаться), Вы можете поблагодарить его автора, а также перечислить ему на счет некоторую сумму со своего баланса (при отзыве благодарности перечисленная сумма не будет вам возвращена).
Также вы можете оценить сообщение как неудачное.
В течение суток можно 20 раз оценить сообщения разных участников (купите Premium-аккаунт, либо оплачивайте оценки сверх лимита).
Эта тема расположена в архиве и закрыта для обсуждения.