DrawBarCode.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. #include "stdafx.h"
  2. #include "DrawBarCode.h"
  3. namespace DrawBarCodes
  4. {
  5. const int g_aryCode128[2][207] =
  6. {
  7. {
  8. 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  9. 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
  10. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  11. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  12. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  13. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  14. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  15. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  16. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  17. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  18. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  19. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  20. -1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
  21. },
  22. {
  23. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  24. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  25. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  26. 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  27. 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  28. 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  29. 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  30. 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, -1,
  31. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  32. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  33. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  34. -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
  35. -1, -1, -1, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
  36. },
  37. };
  38. //////////////////////////////////////////////////////////////////////////
  39. // CBarCodeBase;
  40. CBarCodeBase::CBarCodeBase()
  41. {
  42. Clear();
  43. m_nRatio = 3;
  44. }
  45. CBarCodeBase::~CBarCodeBase()
  46. {
  47. }
  48. void CBarCodeBase::operator =(const CBarCodeBase& bc)
  49. {
  50. m_nRatio = bc.m_nRatio;
  51. m_nBufferLen = bc.m_nBufferLen;
  52. memcpy(m_byBuffer, bc.m_byBuffer, bc.m_nBufferLen);
  53. }
  54. void CBarCodeBase::Clear()
  55. {
  56. memset(m_byBuffer, 0, m_nBufferLen);
  57. m_nBufferLen = 0;
  58. }
  59. int CBarCodeBase::GetEncodeLength() const
  60. {
  61. int nLen = 0;
  62. BYTE *pBuffer = (BYTE*)m_byBuffer;
  63. for ( int i = 0; i < m_nBufferLen; i++ )
  64. {
  65. if ( *pBuffer & 2 )
  66. nLen += (m_nRatio - 1);
  67. pBuffer++;
  68. }
  69. return nLen + m_nBufferLen;
  70. }
  71. int CBarCodeBase::GetBufferLength() const
  72. {
  73. return m_nBufferLen;
  74. }
  75. const BYTE& CBarCodeBase::GetAt(const int& nIndex) const
  76. {
  77. return m_byBuffer[nIndex];
  78. }
  79. int CBarCodeBase::GetRatio() const
  80. {
  81. return m_nRatio;
  82. }
  83. int CBarCodeBase::SetRatio(const int& nRatio)
  84. {
  85. m_nRatio = nRatio;
  86. if ( nRatio <= 0 )
  87. m_nRatio = 1;
  88. return m_nRatio;
  89. }
  90. void CBarCodeBase::DrawBarCode(IN HDC hDC, IN int nStartX, IN int nStartY, IN int nBarHeight, IN int nBarHeight2, IN const COLORREF clrBar, IN const COLORREF clrSpace, IN const int nPenWidth)
  91. {
  92. HPEN hPenBar =::CreatePen(PS_SOLID, nPenWidth, clrBar);
  93. HPEN hPenSpace =::CreatePen(PS_SOLID, nPenWidth, clrSpace);
  94. HPEN hPenOld = (HPEN)::SelectObject(hDC,hPenBar);
  95. BYTE *pb = m_byBuffer;
  96. int i0,iNum0 = m_nBufferLen;
  97. BYTE bBar;
  98. int i1,iNum1;
  99. int iY;
  100. for( i0 = 0; i0 < iNum0; i0++)
  101. {
  102. bBar = *pb&0x01;
  103. iNum1 = (*pb&0x02) ? m_nRatio:1;
  104. iY = (*pb&0x04) ? nBarHeight2 : nBarHeight;
  105. for( i1=0; i1 < iNum1; i1++)
  106. {
  107. if(bBar) ::SelectObject(hDC,hPenBar);
  108. else ::SelectObject(hDC,hPenSpace);
  109. ::MoveToEx(hDC, nStartX, nStartY, 0);
  110. ::LineTo(hDC,nStartX,iY);
  111. nStartX += nPenWidth;
  112. }
  113. pb++;
  114. }
  115. ::SelectObject(hDC,hPenOld);
  116. ::DeleteObject(hPenBar);
  117. ::DeleteObject(hPenSpace);
  118. }
  119. //////////////////////////////////////////////////////////////////////////
  120. CBarCode39::CBarCode39()
  121. {
  122. }
  123. CBarCode39::~CBarCode39()
  124. {
  125. }
  126. BOOL CBarCode39::EnCode39(IN LPCTSTR lpszCodeIn)
  127. {
  128. int iLen = strlen(lpszCodeIn);
  129. char*pszCode = new char[iLen+3];
  130. sprintf(pszCode,"*%s*",lpszCodeIn);
  131. strupr(pszCode);
  132. BYTE*pFst = m_byBuffer;
  133. BYTE*p0 = pFst,*p1;
  134. iLen+=2;
  135. int i;
  136. for(i=0;i<iLen;i++)
  137. {
  138. p1 = GetNarrowWideBarSpace39(pszCode[i],p0);
  139. if(p1==0) return 0;
  140. p0=p1;
  141. }
  142. m_nBufferLen = p1-pFst;
  143. delete []pszCode;
  144. return 1;
  145. }
  146. void CBarCode39::Draw39(IN HDC hDC, IN int nStartX, IN int nStartY, IN int nBarHeight, IN int nBarHeight2, IN const COLORREF clrBar, IN const COLORREF clrSpace, IN const int nPenWidth)
  147. {
  148. DrawBarCode(hDC, nStartX, nStartY, nBarHeight, nBarHeight2, clrBar, clrSpace, nPenWidth);
  149. }
  150. BYTE* CBarCode39::GetNarrowWideBarSpace39(CHAR ch, BYTE* pb)
  151. {
  152. IntString infs[]=
  153. {
  154. {'1', "wnnwnnnnwn"},
  155. {'2', "nnwwnnnnwn"},
  156. {'3', "wnwwnnnnnn"},
  157. {'4', "nnnwwnnnwn"},
  158. {'5', "wnnwwnnnnn"},
  159. {'6', "nnwwwnnnnn"},
  160. {'7', "nnnwnnwnwn"},
  161. {'8', "wnnwnnwnnn"},
  162. {'9', "nnwwnnwnnn"},
  163. {'0', "nnnwwnwnnn"},
  164. {'A', "wnnnnwnnwn"},
  165. {'B', "nnwnnwnnwn"},
  166. {'C', "wnwnnwnnnn"},
  167. {'D', "nnnnwwnnwn"},
  168. {'E', "wnnnwwnnnn"},
  169. {'F', "nnwnwwnnnn"},
  170. {'G', "nnnnnwwnwn"},
  171. {'H', "wnnnnwwnnn"},
  172. {'I', "nnwnnwwnnn"},
  173. {'J', "nnnnwwwnnn"},
  174. {'K', "wnnnnnnwwn"},
  175. {'L', "nnwnnnnwwn"},
  176. {'M', "wnwnnnnwnn"},
  177. {'N', "nnnnwnnwwn"},
  178. {'O', "wnnnwnnwnn"},
  179. {'P', "nnwnwnnwnn"},
  180. {'Q', "nnnnnnwwwn"},
  181. {'R', "wnnnnnwwnn"},
  182. {'S', "nnwnnnwwnn"},
  183. {'T', "nnnnwnwwnn"},
  184. {'U', "wwnnnnnnwn"},
  185. {'V', "nwwnnnnnwn"},
  186. {'W', "wwwnnnnnnn"},
  187. {'X', "nwnnwnnnwn"},
  188. {'Y', "wwnnwnnnnn"},
  189. {'Z', "nwwnwnnnnn"},
  190. {'-', "nwnnnnwnwn"},
  191. {'.', "wwnnnnwnnn"},
  192. {' ', "nwwnnnwnnn"},
  193. {'*', "nwnnwnwnnn"},
  194. {'$', "nwnwnwnnnn"},
  195. {'/', "nwnwnnnwnn"},
  196. {'+', "nwnnnwnwnn"},
  197. {'%', "nnnwnwnwnn"},
  198. };
  199. int i0,iNum0=sizeof(infs)/sizeof(infs[0]);
  200. int i1;
  201. for(i0=0;i0<iNum0;i0++)
  202. {
  203. IntString&inf=infs[i0];
  204. if(inf.ch==ch)
  205. {
  206. for(i1=0;i1<10;i1++)
  207. {
  208. if(inf.psz[i1]=='w')
  209. *pb+=2;
  210. if(i1%2==0)
  211. *pb+=1;
  212. pb++;
  213. }
  214. return pb;
  215. }
  216. }
  217. return 0;
  218. }
  219. };