********************************************************************************
* ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ БИБЛИОТЕКИ ПЕЧАТИ QR КОДОВ СОВМЕСТНО С ТЕКСТОМ
/*
Пример печати простого статичного слипа формата
< произвольный текст >
<текст> картинка QR <текст>
< произвольный текст >
Самое главное, что управление печатью текста:
oPrinter:NewLine() // перевод на следующую строку
oPrinter:TextOut( Padc(cTxt,80) ) // выводим текстовую строку
и печатью картинки могут быть независмыми процессами
oBmp:Draw(oPrinter,{1500,1000,1700,1200})
или
oBmp:Rect:= { 200,2000, 2000, 1500 }
oPrn:DrawBitMap( oBmp )
*/
//*** На время включаю директивы препроцессора - затем отключаю
#define FORM_A4 9
#define PS_SOLID 0
#define RGB( nR,nG,nB ) ( nR + ( nG * 256 ) + ( nB * 256 * 256 ) )
#define BLACK RGB( 0x0 ,0x0 ,0x0 )
PROC pPintQR()
LOCA cBmp:="qr.bmp", cTxt:="произвольный текст", cT:="текст"
LOCA nLeftStr:=0, nLeftCol:=0, nRightStr:=0, nRightCol:=0 // Координаты в пикселях
LOCA aPos:={}, nI:=0
LOCA oPrint, oBmp, cPrinter:=""
cPrinter := GetDefaultPrinter() // Определяю принтер, используемый по умолчанию в системе
oPrinter := Win32Prn():New( cPrinter ) // Определяем имя объекта класса для принтера, установленного по умолчанию в системе
// В случае успешного создания определяю свойства класса. Эти и свойства (BitNumber,PaperLanght,PaperWidht) должны быть определены до Create
oPrinter:Landscape := .F. // портретная ориентация
oPrinter:FormType := FORM_A4 // А4
oPrinter:Copies := 1 // число копий... но всё равно делаю по моим алгоритмам
// Создаем экземпляр класса и проверка успешности создания... после надо уничтожить его
IF !oPrinter:Create() // Не создан экземпляр класса
ErrMess("Не создан виртуальный принтер! М/б их нет?",cError)
RETU
ENDI
// Обязательно-проверка успешности постановки в очередь с именем
IF !oPrinter:startDoc("Printering USLand")
ErrMess("Класс startDoc не смог поставить в очередь печати. Смотрите свойства принтеров, например автономность - обращайтесь к системному администратору!",cError)
// Уничтожаем раннее созданный экземпляр объекта (класса).
oPrinter:Destroy()
RETU
ENDI
// Определяем перо для рисования линий (толщина шрифта) - форма линий (сплошная, тонкая, черная)
oPrinter:SetPen(PS_SOLID, 1, BLACK)
// Установка шрифта, в зависимости от сжатия текста. В массиве определяется толщина шрифта и высота... подбор эксперимент
oPrinter:SetFont("Courier New",10,{4,-43}) // Обычный и без сжатия
oPrinter:Charset(255) // ОБЯЗАТЕЛЬНО - кодировка OEM... иначе козебяки
//!*** ПРОЦЕССЫ ПЕЧАТИ ТЕКСТА, УПРАВЛЯЕМЫЕ ПЕРЕХОДОМ НА НОВУЮ СТРОКУ И ПЕЧАТЬ КАРТИНОК !!!НЕЗАВИСИМЫЕ!!!
// Печатаем текстовую информацию и лишь по причине пробелов помещаю печать картинки ниже
oPrinter:NewLine() // перевод на следующую строку
oPrinter:TextOut( Padc(cTxt,80) ) // выводим текстовую строку
FOR nI := 1 TO 5
oPrinter:NewLine()
oPrinter:TextOut( " " )
NEXT nI
oPrinter:NewLine()
oPrinter:TextOut( Padc(cT,10)+Spac(60)+Padc(cT,10) )
FOR nI := 1 TO 5
oPrinter:NewLine()
oPrinter:TextOut( " " )
NEXT nI
oPrinter:NewLine() // перевод на следующую строку
oPrinter:TextOut( Padc(cTxt,80) ) // выводим текстовую строку
// Печатую bmp файл используя соответствующий класс в конкретных координатах 2000*500 и размера 700*700
oBmp := Win32BMP():new() // создаю объект
IF oBmp:loadFile( cBmp ) // загружаю файл
oBmp:Draw(oPrinter,{2000,400,360,360}) // печатаю в координатах пикселях на листе. 15mm
ENDI
oBmp:Destroy() // уничтожаю объект
* После закрытия печати сам прогоняет? oPrinter:NewPage() // делаю прогон страницы
oPrinter:endDoc() // Закрываю печать документа
oPrinter:Destroy() // Уничтожаю объект принтера
RETU
// Отключаю директивы препроцессора
#undef FORM_A4
#undef PS_SOLID
#undef RGB
#undef BLACK
/*
Генерация QR кода по переданному тексту и маршруту вывода в файл *.bmp
До вызова на ПК должна быть установлена библиотека QRCodelib и доступен
для вызова DLL файл библиотеки
Параметры:
cText Преобразуемый в QR Code текст
cPath Маршрут вывода картиник кода
cBmp Имя файла картинки
Возвращает: Имя файла картинки с маршрутом
*/
FUNC cQRGen(cText,cPath,cBmp)
STAT qrDLL
LOCA cFile:="", nResp:=0
#Define DC_CALL_STD 0x0020
DEFAULT cPath TO "", cBmp TO "QR.BMP", cText TO "http://check.egais.ru?id=UUID&dt=0404161630&cn=Common_Name"
cFile := cPath+cBmp
IF !File("QRCodelib.Dll") THEN RETU ""
qrDLL := LoadLibrary("QRCodelib.Dll" ) // Подгружается библиотека из DLL файла
nResp := DllCall(qrDLL,DC_CALL_STD,"FastQRCode",cText,cFile) // Формирование и вывод в файл
FreeLibrary(qrDLL) // Освобождение из памяти ресурсов занятых библой
RETU (cFile)
Взять библиотеку можно тут:
https://olegon.ru/attachment.php?attachmentid=9008&d=1510037931