Форум » GUI » Печать текста с автопереносом » Ответить

Печать текста с автопереносом

КСС: Привет всем ! Пробую делать отчеты в HMG-Ext библиотеке WinReport. Нужно реализовать часто востребованную печать текста в определённом прямоугольном месте так, чтобы этот текст, если не вмещается переносился на следующую строку в пределах определённого пространства. Вроде бы подходит DRAW TEXT, но она у меня вообще не работает в WinReport. Кроме того, в описаниях секций WinReport-отчета нужно указывать количество строк через дробь. А если не известно. Да и для разных шрифтов кол-во строк будет разным. Кто занимался этой проблемой, будьте добры, подскажите мне, во-первых, почему у меня не работает DRAW TEXT и получу ли я с его помощью результат. А если нет - то как это можно решить. Спасибо

Ответов - 2

SADSTAR2: В этой очень хорошей (функциональной) библиотеке которой я сам пользуюсь есть несколько касяков=авторская фича. 1. Не дает менять вертикальное выравнивание кроме как BASE_LINE HB_FUNC (RR_SETTEXTALIGN) { hb_retni(SetTextAlign(hDC,TA_BASELINE|hb_parni(1))); } А это очень важно. Я долго шизел почему у меня DRAW TEXT рисует только хвостики букв. Потому что начало зоны для вывода текста из DRAW TEXT совпадает с BASE_LINE первой строки текста. Я об этом писал в свое время. Предлагал исправить авторскую версию библиотеки. Но народ отказал ссылаясь на проблемы совместимости. Для себя я внес следующие исправления METHOD DrawText(row,col,torow,tocol,txt,style,defname) CLASS HBPrinter local lhf:=::getobjbyname(defname,"F"), n:=0 if(torow==NIL,torow:=::maxrow,"") if(tocol==NIL,tocol:=::maxcol,"") n:=rr_drawtext(::Convert({row,col}),::Convert({torow,tocol}),txt,style,lhf) return n //self возвращает вертикальный размер текста (со всеми переносами) можно узнать где реально закончился текст. Мало того - можно узнать этот размер не рисуя текст реально чтобы оценить - поместится ли текст на остатке листа или полосы или ... HB_FUNC (RR_STARTPAGE) { StartPage( hDC ); //SetTextAlign(::hDC,TA_BASELINE) SetTextAlign(::hDC,TA_TOP); } тут все и так понятно - мне удобно отсчитывать положение строки от ее верхнего края ..... //hb_retl(TextOut( hDC , hb_parni(2,2),hb_parni(2,1)+devcaps[16], hb_parc(1),hb_parclen(1))); hb_retl(TextOut( hDC , hb_parni(2,2),hb_parni(2,1), hb_parc(1),hb_parclen(1))); .... уже не помню что такое devcaps[16] HB_FUNC (RR_CREATEMFILE) { RECT emfrect; SetRect(&emfrect,0,0,GetDeviceCaps(hDCRef, HORZSIZE)*100,GetDeviceCaps(hDCRef, VERTSIZE)*100); hDC=CreateEnhMetaFile(hDCRef,NULL,&emfrect,"hbprinter\0emf file\0\0"); //SetTextAlign(hDC,TA_BASELINE); SetTextAlign(::hDC,TA_TOP); preview=1; hb_retnl((LONG) hDC); } HB_FUNC (RR_SETTEXTALIGN) { //hb_retni(SetTextAlign(hDC,TA_BASELINE|hb_parni(1))); hb_retni(SetTextAlign(hDC,hb_parni(1))); }

КСС: Спасибо SADSTAR2. Попробую твои доработки



полная версия страницы