Welcome, guest! Login / Register - Why register?
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

Your Name: Code Language: