| imho.ws |
![]() |
|
|
|
# 1 |
|
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
DrawText
Господа! Помогите (с помощью реального кода
) погонять текст на принтере на листе А4 с помощью функции DrawText. Т.е. чтобы текст печатался, например, в любом из углов листа, в центре, в верху, внизу и т.д..Заранее признателен! |
|
|
|
|
# 2 |
|
Junior Member
Регистрация: 11.10.2005
Сообщения: 63
![]() |
void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{ int adx, ady; adx=200; ady=500; CString str; POINT curPos; double mask; CPoemDoc* curDoc = GetDocument(); str.Format("Документ: %s",(LPCSTR)curDoc->GetTitle()); CSize size; size = pDC->GetTextExtent(str); ... pDC->TextOut((pInfo->m_rectDraw.Width()-size.cx)/2, 200, str); curPos.x = 400; curPos.y = ady + curRect.Height()*mask + 200; str = "Информация ..."; pDC->TextOut(curPos.x, curPos.y, str); pDC->SelectStockObject(BLACK_BRUSH); for(i=0;i<curDoc->m_objSel.CountElems();i++){ Temp = curDoc->m_objSel[i]; curPos.y += 100; pDC->Rectangle(curPos.x,curPos.y,1700,curPos.y+3); curPos.y += 30; str.Format("%10.10s %5.50s","...:",Temp->code); str.TrimRight(); if(str.GetLength()>10){ pDC->TextOut(curPos.x, curPos.y, str); curPos.y += 100; } str.Format("%7.10s%15.2d.%.2d.%.4d %5.2d:%.2d","Время:",Temp->dt.wDay,Temp->dt.wMonth,Temp->dt.wYear/*Temp->date*/,Temp->dt.wHour, Temp->dt.wMinute/*Temp->time*/); str.TrimRight(); if(str.GetLength()>7){ pDC->TextOut(curPos.x, curPos.y, str); curPos.y += 100; } ... } |
|
|
|
|
# 5 |
|
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
_Lynx_
В rect что определяется? Размер области печати? Вот что родил: Код:
TPrinter *Prntr = Printer();
TRect r = Rect(0,0, Prntr->PageWidth, Prntr->PageHeight);
AnsiString MyText="Проверка";
Prntr->BeginDoc();
DrawText(Prntr->Canvas->Handle, MyText.c_str(), MyText.Length(), &r, DT_SINGLELINE |DT_VCENTER | DT_CENTER);
Prntr->EndDoc();
И всё же на счёт rect'а не совсем ясно. Последний раз редактировалось doro; 17.10.2005 в 17:58. |
|
|
|
|
# 6 | |
|
Junior Member
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67
![]() |
Цитата:
PosGor - горизонтальная координата,PosVer - вертикальная координата, BottomWidth&&RightWidth - отступы соответственно снизу и справа от края страницы. Код:
...
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
String = "Получатель: "+Form1->stFirmAddress->Caption+"\r\n";
j = 1;
PosGor = LeftWidth;
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String)*2;
...
__________________
|
|
|
|
|
|
# 7 |
|
Full Member
Регистрация: 30.04.2002
Сообщения: 1 419
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
kot_, твоё сообщение добило почти окончательно мою тупость.
Но остатки остались. ![]() Вот код: Код:
AnsiString VD = "", VM = "", VY = "", StartD="", StartM="", StartY="", EndD="", EndM="", EndY="", ChisloD="", ChisloM="", ChisloY="";
DateTimeToString(VD, "dd" ,DateTimePicker1->Date);
DateTimeToString(VM, "mm" ,DateTimePicker1->Date);
DateTimeToString(VY, "yyyy" ,DateTimePicker1->Date);
DateTimeToString(StartD, "dd" ,DateTimePicker2->Date);
DateTimeToString(StartM, "mm" ,DateTimePicker2->Date);
DateTimeToString(StartY, "yyyy" ,DateTimePicker2->Date);
DateTimeToString(EndD, "dd" ,DateTimePicker3->Date);
DateTimeToString(EndM, "mm" ,DateTimePicker3->Date);
DateTimeToString(EndY, "yyyy" ,DateTimePicker3->Date);
r=Rect(XCoordinate, YCoorfinate+350, CurPrinter->PageWidth,CurPrinter->PageHeight);
AnsiString TextRaporta=AnsiString("\tАаааа бббббббббббб вввввввв")+VD+" "+Months[VM.ToInt()-1]+" "+VY+AnsiString(" гггг зз жжжжж")+ComboBox1->Text+AnsiString(" и ")+StartD+" "+Months[StartM.ToInt()-1]+StartY+" "+AnsiString(" кккк лл ")+EndD+" "+Months[EndM.ToInt()-1]+" "+EndY+AnsiString(" оооо.");
DrawText(CurPrinter->Canvas->Handle,
TR.c_str(),
TR.Length(),
&r,
DT_EXPANDTABS|DT_WORDBREAK | DT_LEFT);
|
|
|
|
|
# 8 |
|
Junior Member
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67
![]() |
Не совсем понял - так а проблема в чем? Проверяй длинну строки перед тем как ее выводить. В приведенном примере - так как объем выводимых данных невелик, и данные жестко вшиты в код, функция автопереноса не выделялись отдельно - то есть я проверяю длину строки прямо в коде, и в принципе это нормально работало:
Код:
String = "Поставщик: " + Form1->stPostav->Caption+"\r\n";
int j = 1;
do{
AnsiString g = String[j];
if(PosGor >= (Prn->PageWidth-RightWidth)||g=="\r"){
PosGor = LeftWidth+pCanvas->TextWidth("Поставщик: ");
if(PosVert >= (Prn->PageHeight-BottomWidth)){
Prn->NewPage();
PosVert = TopWidth;
}
PosVert += pCanvas->TextHeight(String);
}
if(g!="\r"&&g!="\n"){
pCanvas->TextOutA(PosGor,PosVert,g);
//Выводится каждый отдельный символ - не строка!!!
PosGor += pCanvas->TextWidth(g);
}
j++;
}while(String.Length()>= j);
То же и у тебя - тебе нужно или проверять всю строку - и выводить ту дельту которая разница между шириной страницы и шириной строки в отдельную строку - используя субстринг - или выводить посимвольно - проверяя не попадает ли символ за пределы страницы. Тут кстати, че-то я накрутил с фигурными скобками и объявлениями, звиняй, ессественно не нужно в конструкции do{}while объявлять переменную, просто реальный код менее читаем, там используется ряд полей класса и т.д. и объем его гораздо более. Я надеюсь общая идея понятна.
__________________
Последний раз редактировалось kot_; 30.10.2005 в 00:45. |
|
|
|
|
# 10 | |
|
Junior Member
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67
![]() |
Цитата:
Код:
TRect r = Rect(30,50, this->Width,this->Height);
AnsiString TR=AnsiString("\tАаааа бббббббббббб ввввввввnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnn nnnnnnnnnnnnnn nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn 1111111111111111111 1111111111111111111 1111111111111111");
DrawText(this->Canvas->Handle,
TR.c_str(),
TR.Length(),
&r,
DT_EXPANDTABS|DT_WORDBREAK | DT_LEFT);
Угу. удалил пробелы до единиц - результат - строка полезла за границы формы и перенос только на единицах.
__________________
|
|
|
|