пЕЧАТЬ
Я печатаю квикрепорт... Вопрос : как посылать escape последовательности на принтер ?
Используешь API
Пишешь простейший класс
class GPrinter
{
public:
GPrinter();
~GPrinter();
int PrintString(char* string, bool oem = true);
int Cr();
private:
HANDLE HPrinter;
COMMTIMEOUTS to;
DWORD nNumberOfBytesToWrite;
DWORD dwOldWriteTimeout;
};
Конструктор
GPrinter::GPrinter()
{
HPrinter = CreateFile("prn",
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (!HPrinter)
{
::MessageBox(0, "HPrinter failed!", "ERROR", 0);
}
GetCommTimeouts(HPrinter, &to);
dwOldWriteTimeout = to.WriteTotalTimeoutConstant;
to.WriteTotalTimeoutConstant = 3000; /*-- SHOULD BE >= 2 sec to avoid INVALID_PARAMETER error--*/
SetCommTimeouts(HPrinter, &to);
}
Деструктор
GPrinter::~GPrinter()
{
if (HPrinter != INVALID_HANDLE_VALUE)
{
to.WriteTotalTimeoutConstant = dwOldWriteTimeout;
SetCommTimeouts(HPrinter, &to);
CloseHandle(HPrinter);
}
}
Функция печати
int
GPrinter::PrintString(char* string, bool oem)
{
unsigned int ret;
char text[1024];
if (oem == true) ::CharToOem(string, text);
else strcpy(text, string);
ret = WriteFile(HPrinter, text, strlen(text), &nNumberOfBytesToWrite, NULL);
if (!ret) return 1;
else return 0;
}
int
GPrinter::Cr()
{
unsigned int ret;
unsigned char cr[2];
cr[1] = 13;
cr[0] = 10;
ret = WriteFile(HPrinter, cr, 2, &nNumberOfBytesToWrite, NULL);
if (!ret) return 1;
else return 0;
}
Создаешь обект и построчно печатаешь
GPrinter pr;
pr.PrintString("Первая строка");
pr.Cr();
pr.PrintString("Вторая строка ");
pr.Cr();
Все. Параметры функции CreateFile в конструкторе могут быть изменены как тебе требуется...
Для сетевого принтера все также ? ... а то что-то у меня не работает
Ескейпами ты по сети печатать не сможешь в принципе...