Psst.. new poll here.
Psst.. new forums here.
Microsoft is blocking us again (TY IP Reputation!) so just use oauth login instead. :)
Paste
Pasted as C++ by meil ( 16 years ago )
#include "stdafx.h"
#include "print_dm.h"
namespace prn
{
print_dm::print_dm()
{
_pPrintInfoTwo = NULL;
_PrintersCount = 0;
_PrinterNum = 0;
_hPrinter = INVALID_HANDLE_VALUE;
_hdc = NULL;
_pPrintInfo = NULL;
}
print_dm::~print_dm()
{
if(_pPrintInfo)
{
delete [] _pPrintInfo;
_pPrintInfo = NULL;
}
}
bool print_dm::init()
{
CString strDefaultPrinter = "Datamax ST-3210";
char b[MAX_PATH];
memset(b, 0x00, MAX_PATH);
::GetPrivateProfileString("printer", "name",
strDefaultPrinter.GetString(),
b, MAX_PATH, ".\\client.ini");
CString strVal = b;
if(strVal == strDefaultPrinter)
::WritePrivateProfileString("printer", "name", strVal, ".\\client.ini");
DWORD cbBuf =0, cbNeeded =0, cReturned =0;
if(!::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS, 0, 2,
_pPrintInfo, 0, &cbNeeded;, &cReturned; ) )
{
if(::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return false; // big error :)
if(cbNeeded)
{
cbBuf = cbNeeded;
_pPrintInfo = new BYTE[cbBuf];
_pPrintInfoTwo = LPPRINTER_INFO_2A(_pPrintInfo);
if(::EnumPrinters(PRINTER_ENUM_LOCAL|PRINTER_ENUM_CONNECTIONS,
0, 2, _pPrintInfo, cbBuf, &cbNeeded;,
&cReturned; ) )
{
if(cReturned)
{
_PrintersCount = cReturned;
_PrinterNum = -1;
CString strPrinterName;
for(DWORD i =0; i< cReturned; ++i)
{
LPPRINTER_INFO_2 pPrinter = _pPrintInfoTwo+i;
strPrinterName = pPrinter->pPrinterName;
if(strVal == strPrinterName)
_PrinterNum = i;
}
}
}
else
{
delete [] _pPrintInfo;
_pPrintInfo = NULL;
}
}
}
if(_PrinterNum < 0)
{
::AfxMessageBox("������� \""+strVal+"\" �� ������!");
return false;
}
LOGFONT f;
memset(&f, 0, sizeof(f));
f.lfHeight = 25;
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_captfont_hor.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 22;
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_datafont_hor.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 20;
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_datefont_hor.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 28; //35
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_posfont_hor.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 25;
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfEscapement = 900;
f.lfOrientation = 900;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_captfont_vert.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 25; //
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfEscapement = 900;
f.lfOrientation = 900;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_datafont_vert.CreateFontIndirect(&f))
return false;
memset(&f, 0, sizeof(f));
f.lfHeight = 30; //
f.lfWidth = 0;
f.lfWeight = FW_BOLD;
f.lfQuality = NONANTIALIASED_QUALITY;
f.lfOutPrecision = OUT_TT_PRECIS;
f.lfOutPrecision = OUT_TT_ONLY_PRECIS;
f.lfEscapement = 900;
f.lfOrientation = 900;
f.lfCharSet = RUSSIAN_CHARSET;
if(!_bigfont_vert.CreateFontIndirect(&f))
return false;
return open();
}
bool print_dm::kill()
{
if(_hdc)
::DeleteDC(_hdc);
print_dm::close();
return true;
}
bool print_dm::open()
{
if(_hPrinter != INVALID_HANDLE_VALUE)
{
::AfxMessageBox("������� ��� ������������!");
return false;
}
LPPRINTER_INFO_2 pPrinter = _pPrintInfoTwo + _PrinterNum;
if(!::OpenPrinter(pPrinter->pPrinterName, &_hPrinter, NULL))
{
::AfxMessageBox("�� ������� ������������ � ��������!");
return false;
}
if(_hdc)
{
print_dm::close();
return false;
}
_hdc = ::CreateDC(pPrinter->pDriverName, pPrinter->pPrinterName,
NULL, pPrinter->pDevMode);
if(!_hdc)
{
print_dm::close();
::AfxMessageBox("�� ������� ���������������� �������");
}
return true;
}
bool print_dm::close()
{
if(_hPrinter)
{
::ClosePrinter(_hPrinter);
_hPrinter = NULL;
}
return true;
}
bool print_dm::ticket(const LPST_PRINT_DATA pData, unsigned int cnt)
{
if(!_hdc)
return false;
CString strErr;
DOCINFO di;
memset(&di;, 0x00, sizeof(di));
di.cbSize = sizeof di;
di.lpszDocName = _T("ticket");//_T(print_dm::name_gen(pData, cnt));
if(::StartDoc(_hdc, &di;) < 0)
{
strErr.Format("���������� ���������������� ������!");
::AfxMessageBox(strErr);
return false;
}
for(size_t i=0; i<cnt; ++i)
{
if(::StartPage(_hdc)<0)
{
strErr.Format("������ ������ ������ �%d",i+1);
::AfxMessageBox(strErr);
::AbortDoc(_hdc);
return false;
}
print_dm::draw_ticket(_hdc, pData+i);
if(::EndPage(_hdc)<0)
{
strErr.Format("������ �������� ��������� �� ������!",i+1);
::AfxMessageBox(strErr);
return false;
}
}
if(::EndDoc(_hdc)<0)
return false;
return true;
}
void print_dm::draw_ticket(HDC hdc, const LPST_PRINT_DATA pd)
{
CDC dc;
dc.Attach(hdc);
// rectangles
bool rectangles = false;
size_t hor_mm = dc.GetDeviceCaps(HORZRES);
size_t ver_mm = dc.GetDeviceCaps(VERTRES);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(RGB(0,0,0));
CFont *pOldFont = NULL;
pOldFont = dc.SelectObject(&_captfont_hor);
// labels
// �������
CRect r(115,265,252,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("�������", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// ���
r.SetRect(252,265,305,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("���", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// ����
r.SetRect(305,265,379,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("����", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// �����
r.SetRect(379,265,460,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("�����", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// �������
r.SetRect(460,265,563,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("�������", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// ���
r.SetRect(563,265,621,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("���", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// ������
r.SetRect(621,265,707,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("������", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// �����
r.SetRect(707,265,787,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("�����", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// ����
r.SetRect(787,265,862,295);
if(rectangles) dc.Rectangle(r);
dc.DrawText("����", &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// data
dc.SelectObject(&_datafont_hor);
// strTeam
r.SetRect(115,295,262,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strTeam, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strRound
r.SetRect(262,295,295,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strRound, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strDate
r.SetRect(295,295,389,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strDate, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strTime
r.SetRect(389,295,465,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strTime, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strTribune
r.SetRect(465,295,563,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strTribune, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
dc.SelectObject(&_posfont_hor);
// strRow
r.SetRect(563,295,621,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strRow, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strSector
r.SetRect(621,295,707,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strSector, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strPlace
r.SetRect(707,295,787,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strPlace, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// strPrice
r.SetRect(787,295,862,370);
if(rectangles) dc.Rectangle(r);
dc.DrawText(pd->strPrice, &r, DT_CENTER|DT_TOP|DT_EXPANDTABS|DT_WORDBREAK|DT_END_ELLIPSIS);
// leftprice
dc.SelectObject(&_captfont_vert);
dc.TextOut(40, 320, "����");
// price vert
dc.SelectObject(&_datafont_vert);
dc.TextOut(75, 320, pd->strPrice);
// type
dc.SelectObject(&_bigfont_vert);
dc.TextOut(1000, 420, pd->strType);
if (pOldFont)
dc.SelectObject( pOldFont);
dc.Detach();
}
int print_dm::status()
{
int res = -1;
if(!_hPrinter)
return res;
DWORD cbBuf = 0, cbNeeded = 0;
BYTE* pPrinter = NULL;
if(!::GetPrinter(_hPrinter, 2, NULL, cbBuf, &cbNeeded;))
{
if(::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return res; // big error :)
if(cbNeeded)
{
cbBuf = cbNeeded;
pPrinter = new BYTE[cbBuf];
if(::GetPrinter(_hPrinter, 2, pPrinter, cbBuf, &cbNeeded;))
res = LPPRINTER_INFO_2(pPrinter)->Status;
delete [] pPrinter;
}
}
return res;
}
CString print_dm::name_gen(const LPST_PRINT_DATA pd, const unsigned int& cnt)
{
CString res = CTime::GetCurrentTime().Format("%H:%M:%S");
if(!pd)
{
res.Format("err_gen_name_%s", res);
return res;
}
if(cnt == 1)
res.Format("tic_T:%s,S:%s,R:%s,P:%s_%s", pd->strTribune, pd->strSector,
pd->strRow, pd->strPlace, res);
else
res.Format("tic's_%s", res);
return res;
}
} // namespace prn
Revise this Paste