HANDLE hLpt;
char buf[64];
BOOL res;
DWORD ret;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
hLpt = CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL );
buf[0] =27; //ESC-последовательность
buf[1] ='@';//Initialize printer
buf[2] =17; //Select printer -этого может и не надо
buf[3] =0x0D;//перевод строки
buf[4] =0x0A;//возврат каретки
WriteFile(hLpt, buf, 5, &ret, NULL);
for(int i =0; i<ListBox1->Items->Count; i++)
{
AnsiString Str = ListBox1->Items->Strings+"\n";
Str =AnsiString(AToB(Str.c_str()));//Перекодировка в русские буквы
WriteFile(hLpt, Str.c_str(), Str.Length(), &ret, NULL);
}
for(int i =0; i<14;i++)//прогнать бумагу до линии отрыва
{
buf[0] =0x0D;
buf[1] =0x0A;
WriteFile(hLpt, buf, 2, &ret, NULL);
}
CloseHandle(hLpt);//закрыть, чтобы сразу напечатал, а не хранил в
//в буфере
}
Как печатать на рулонную бумагу?
помощью принтера Epson LX-300. Счета маленькие - на формат А4
помещается 4 штуки. По тех. требованиям я должен печатать на
рулонную бумагу, так вот когда я вывожу на печать принтер печатает
маленький счет и стемится выкинуть лист и весь рулон крутит и крутит.
Может есть простое решение?
Где-то в dip-переключателях принтера настраивается, что у него рулон, а не листы (см. букварик принтера), плюс отдельный dip на пропуск перфораций. IMHO, эту проблему только так можно решить.
На форме Button и ListBox с нужным текстом:
Код:
Пришлось перекодировать из ANSI:
Код:
//---Перекодировка-----------------------------------------------------------
char* AToB(char*Str)
{
unsigned char*str =Str;
while(*str)
{
if(*str>=0xC0)
if(*str<=0xEF)
*str-=0x40;
else *str-=0x10;
str++;
}
return Str;
}
char* AToB(char*Str)
{
unsigned char*str =Str;
while(*str)
{
if(*str>=0xC0)
if(*str<=0xEF)
*str-=0x40;
else *str-=0x10;
str++;
}
return Str;
}
Понимаю, что еще нужны всякие проверки состояния принтера,
но пока работает, а проблемы решим после их появления.:)