Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Позиционирование текста при печати, Printer()->Canvas->TextOut 
:(
    Опции темы
Nia
  Дата 10.4.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.2.2011

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



Есть какая ни будь функция для перевода миллиметров в пиксели?

Код

 Printer()->Canvas->TextOut(1400, 2500 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);



Кто знает -  разъясните вот этот фрагмент:
Код


(i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i]))



так как не совсем понимаю что он делает, для печати достаточно всего:
Код


  Printer()->Canvas->TextOut(100, 200, Memo1->Lines->Strings[i]);


(Пытаюсь вывести на печать текст чтобы был в строго определённых местах листа)
(C++Builder 2007) 

Это сообщение отредактировал(а) Nia - 10.4.2011, 18:11
PM MAIL   Вверх
Usper
Дата 11.4.2011, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

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



Код

Printer()->Canvas->TextHeight()

Возвращает высоту текста, передаваемого в качестве параметра, в пикселях (с учётом типа и размера шрифта). Обычно используется как раз для позиционирования надписи на канве. Например так можно центрировать надпись на листе: координата Y текста = высота листа/2 - высота надписи/2.

Количество пикселей в миллиметре я получаю так:
Код

TPrinter *prnt = new TPrinter();
double PixPerMMX;
PixPerMMX = (1.0 / 25.4) * GetDeviceCaps(Prnt->Handle, LOGPIXELSX);

При этом разрешение по оси Y может отличаться от разрешения по оси X поэтому надо вычислять и PixPerMMY.

Это сообщение отредактировал(а) Usper - 11.4.2011, 08:13


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
ZVano
Дата 15.4.2011, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

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



Ширину текста я вычислял так:
Код

int textWidth = Canvas->TextWidth(myText);



--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
Nia
Дата 18.4.2011, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.2.2011

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



Перевожу ММ в пиксели для позиционирования печати по оси oy
Код

PixPerMMY = (1.0 / 25.4) * GetDeviceCaps(Prnt->Handle, LOGPIXELSY);


То что получается на выходе не соответствует полученным значениям, хотя по оси ox всё получается нормально - как можно решить эту проблему?
-------------------------------------------------

Написал часть кода  - всё работает - печатается там где нужно, на следующий день включил компьютер -> запустил программу -> распечатал - везде сдвиг по оси oy (где то вверх где то вниз ) - почему это происходит? как это исправить?
PM MAIL   Вверх
Usper
Дата 18.4.2011, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 13.4.2007

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



Сильный сдвиг? Может принтер бумагу так хватает?  smile 
Ну и код покажите.

Это сообщение отредактировал(а) Usper - 18.4.2011, 07:40


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
Nia
Дата 18.4.2011, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.2.2011

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



Цитата

Сильный сдвиг? Может принтер бумагу так хватает? 


Слвиг в диапазоне от 2 см до 5 милиметров - 5 раз лист прогонял, результат один

Цитата

Ну и код покажите.


Хотелось бы так же услышать коментарии (Ваше мнение) по коду, только не заумно 

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <sysvari.h>

#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RpDefine"
#pragma link "RpRender"
#pragma link "RpRenderCanvas"
#pragma link "RpRenderPrinter"
#pragma link "RpRenderPreview"
#pragma resource "*.dfm"


AnsiString TempText;
int isl = 0;


TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{

 Printer()->BeginDoc();    // начало документа

 Printer()->Canvas->Font->Pitch=fpFixed;

 Printer()->Canvas->Font->Size=10; //Размер шрифта в точках, для вывода на принтер

 Printer()->Canvas->Font->Name="Courier New";   //Имя шрифта


 //Как установить свойство "точек на дюйм" в TPrinter
//При смене принтера, размер шрифтов может отмасштабироваться не правильно. Чтобы сделать правильное масштабирование, необходимо установить свойство PixelsPerInch шрифта.
//Не делайте изменений после того, как принтер начал печатать.
//----Printer()->Canvas->Font->PixelsPerInch = GetDeviceCaps(Printer()->Canvas->Handle, LOGPIXELSY);  // -   чтука для какой то работы там принтера//

//Canvas.Font.Size := 10
//Вывод текста
//Canvas->TextOutA(10,10,vasS);

 // Печать и координаты // -------------- ТУТ НАДО БУДЕТ МНОГО МНОГО ВОЗИТЬСЯ  ------------------------------------- //
// for(int i = 0; i < Memo1->Lines->Count; i++)
int i=0;
 // Разрешение экрана 1280 х 1024, 32 бита, разрешение принтера 600 dpi  //
 {
   // +++ Срок доставки истекает
  Printer()->Canvas->TextOut(500*2, 306.850 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);

  i++;

   // +++ Оригинал транспортной железнодорожной накладной №
  Printer()->Canvas->TextOut(1630*2, 210*2 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);

  i++;

    // +++ Скорость
  Printer()->Canvas->TextOut(1600*2, 462 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);

  i++;

  // +++ Перевозчик
  Printer()->Canvas->TextOut(350*2, 578 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);

  i++;


 // +++ Станция отправления
  Printer()->Canvas->TextOut(350*2, 610.61 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
  Memo1->Lines->Strings[i]);

  i++;    

//+++ Станция отправления Код

Printer()->Canvas->TextOut(1889, 530.61 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
Memo1->Lines->Strings[i]);

i++;

// +++ Станция назначения
Printer()->Canvas->TextOut(2976, 440 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
Memo1->Lines->Strings[i]);

i++;

// +++ Станция назначения  Код
Printer()->Canvas->TextOut(3944, 350 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
Memo1->Lines->Strings[i]);

i++;
}



 Printer()->EndDoc();    // конец документа


}
//---------------------------------------------------------------------------
void __fastcall TForm1::tClick(TObject *Sender)
{

 Memo1->Lines->Strings[isl] = MaskEdit1->Text;
  isl++;
 Label1->Caption = Memo2->Lines->Strings[isl];     // Вывод названия пункта документа в Label1
//Label1->Caption =

MaskEdit1->Clear();                              // очистка поля ввода
MaskEdit1->SetFocus();                          // Фокус На МаскЕдит

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormActivate(TObject *Sender)
{
MaskEdit1->Clear();     // при активации формы очистка
MaskEdit1->SetFocus();    // при активации формы Фокус

Memo2->Lines->LoadFromFile("NamesAdditional.txt");

Memo1->Lines->LoadFromFile("NamesAdditional.txt");

Label1->Caption = Memo2->Lines->Strings[isl];     // Вывод названия пункта документа в Label1

}
//---------------------------------------------------------------------------

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
//Preview();
}
//---------------------------------------------------------------------------


и вот ещё странность значение по оси oy в левой стороне листа по середине листа и справа - разные, то есть при значении

Код

Printer()->Canvas->TextOut(1889, 530.61 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
Memo1->Lines->Strings[i]);


(если меняю координаты оси ox а координаты oy оставляю прежними - вывести текст одной ровной линией не получается, - получается что то на подобии лесенки - что меня не устраивает)
PM MAIL   Вверх
Nia
Дата 18.4.2011, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.2.2011

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



Если кто знает подскажите Литературу которую можно почитать по данной теме (про вывод на печать таким способом, в Архангельском ничего не нашёл)
PM MAIL   Вверх
xvr
Дата 18.4.2011, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Вот это:
Код

  Printer()->Canvas->TextOut(350*2, 610.61 + (i*Printer()->Canvas->TextHeight(Memo1->Lines->Strings[i])),
неправильно. Размер строки по Y зависит от содержания строки. Так что просто брать какую то строку и умножать на i будет правильно только если у вас все строки одинаковые

Вам нужно найти максимум от Printer()->Canvas->TextHeight среди всех строк и этот максимум взять в качестве межстрочного интервала

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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