// Code93.cpp: implementation of the CCode93 class. // // Copyright 2002 Neil Van Eps // ///////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "Code93.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CCode93::CCode93() { // code 93 m_nSymbology = CODE93; } CCode93::~CCode93() { } //////////////////////////////////////////////////////////////////////////////////// // // Name: // BitmapToClipboard() // // Description: // puts the specified bitmap on the clipboard // // Arguments: // none // // Return: // void // // Called by: // public class interface // //////////////////////////////////////////////////////////////////////////////////// void CCode93::BitmapToClipboard() { CDC memDC; CBitmap oBitmap; memDC.CreateCompatibleDC(NULL); m_hDC = memDC.GetSafeHdc(); // create compatible, correctly sized bitmap oBitmap.CreateCompatibleBitmap(&memDC,m_nFinalBarcodePixelWidth,m_nPixelHeight); // select our bitmap into the device context CBitmap * oldbm = memDC.SelectObject(&oBitmap); // turn area white - stock black bitmap is selected memDC.BitBlt(0,0,m_nFinalBarcodePixelWidth,m_nPixelHeight,NULL,0,0,WHITENESS); // draw bitmap into memory device context DrawBitmap(); // put bitmap on clipboard ::OpenClipboard(NULL); ::EmptyClipboard(); ::SetClipboardData(CF_BITMAP, oBitmap.m_hObject); ::CloseClipboard(); // deselect object out of device context memDC.SelectObject(oldbm); // make sure bitmap not deleted with CBitmap object oBitmap.Detach(); return; } //////////////////////////////////////////////////////////////////////////////////// // // Name: // DrawBitmap() // // Description: // draws a barcode using the previously loaded data // // Arguments: // none // // Return: // void // // Called by: // public class interface // //////////////////////////////////////////////////////////////////////////////////// void CCode93::DrawBitmap() { long i,nFirstNumber,nSecondNumber; CString csCurrentPattern; // draw start character DrawPattern(RetrievePattern(47)); // draw each character in the message for (i=0;i-1;i--) { ASCIItoCode93Sequence((long)m_csMessage.GetAt(i),&nFirstNumber,&nSecondNumber); // add to the sum nSum += (nWeight * nFirstNumber); nWeight++; if (nWeight>20) nWeight=1; // if its a two sequence character if (nSecondNumber!=-1) { nSum += (nWeight * nSecondNumber); nWeight++; if (nWeight>20) nWeight=1; } } // draw the "C" check digit character DrawPattern(RetrievePattern(nSum%47)); // "K" check digit character - include the "C" check digit character in calculations nWeight = 2; nSum = nSum%47; for (i=m_csMessage.GetLength()-1;i>-1;i--) { ASCIItoCode93Sequence((long)m_csMessage.GetAt(i),&nFirstNumber,&nSecondNumber); // add to the sum nSum += (nWeight * nFirstNumber); nWeight++; if (nWeight>15) nWeight=1; // if its a two sequence character if (nSecondNumber!=-1) { nSum += (nWeight * nSecondNumber); nWeight++; if (nWeight>15) nWeight=1; } } // draw the "K" check digit character DrawPattern(RetrievePattern(nSum%47)); return; } //////////////////////////////////////////////////////////////////////////////////// // // Name: // ASCIItoCode93Sequence() // // Description: // translates an ASCII character into the appropriate CODE93 sequence // // Arguments: // long nFirstNumber - first number of the code93 sequence // long nSecondNumber - second number of the code93 sequence, -1 if not applicable // // Return: // void // // Called by: // CCode93::DrawBitmap(), CCode93::DrawCheckDigits() // //////////////////////////////////////////////////////////////////////////////////// void CCode93::ASCIItoCode93Sequence(long nASCIINumber,long *nFirstNumber, long *nSecondNumber) { switch (nASCIINumber) { case 0: *nFirstNumber = 44; *nSecondNumber = 30; break; case 1: *nFirstNumber = 43; *nSecondNumber = 10; break; case 2: *nFirstNumber = 43; *nSecondNumber = 11; break; case 3: *nFirstNumber = 43; *nSecondNumber = 12; break; case 4: *nFirstNumber = 43; *nSecondNumber = 13; break; case 5: *nFirstNumber = 43; *nSecondNumber = 14; break; case 6: *nFirstNumber = 43; *nSecondNumber = 15; break; case 7: *nFirstNumber = 43; *nSecondNumber = 16; break; case 8: *nFirstNumber = 43; *nSecondNumber = 17; break; case 9: *nFirstNumber = 43; *nSecondNumber = 18; break; case 10: *nFirstNumber = 43; *nSecondNumber = 19; break; case 11: *nFirstNumber = 43; *nSecondNumber = 20; break; case 12: *nFirstNumber = 43; *nSecondNumber = 21; break; case 13: *nFirstNumber = 43; *nSecondNumber = 22; break; case 14: *nFirstNumber = 43; *nSecondNumber = 23; break; case 15: *nFirstNumber = 43; *nSecondNumber = 24; break; case 16: *nFirstNumber = 43; *nSecondNumber = 25; break; case 17: *nFirstNumber = 43; *nSecondNumber = 26; break; case 18: *nFirstNumber = 43; *nSecondNumber = 27; break; case 19: *nFirstNumber = 43; *nSecondNumber = 28; break; case 20: *nFirstNumber = 43; *nSecondNumber = 29; break; case 21: *nFirstNumber = 43; *nSecondNumber = 30; break; case 22: *nFirstNumber = 43; *nSecondNumber = 31; break; case 23: *nFirstNumber = 43; *nSecondNumber = 32; break; case 24: *nFirstNumber = 43; *nSecondNumber = 33; break; case 25: *nFirstNumber = 43; *nSecondNumber = 34; break; case 26: *nFirstNumber = 43; *nSecondNumber = 35; break; case 27: *nFirstNumber = 44; *nSecondNumber = 10; break; case 28: *nFirstNumber = 44; *nSecondNumber = 11; break; case 29: *nFirstNumber = 44; *nSecondNumber = 12; break; case 30: *nFirstNumber = 44; *nSecondNumber = 13; break; case 31: *nFirstNumber = 44; *nSecondNumber = 14; break; case 32: *nFirstNumber = 38; *nSecondNumber = -1; break; case 33: *nFirstNumber = 45; *nSecondNumber = 10; break; case 34: *nFirstNumber = 45; *nSecondNumber = 11; break; case 35: *nFirstNumber = 45; *nSecondNumber = 12; break; case 36: *nFirstNumber = 39; *nSecondNumber = -1; break; case 37: *nFirstNumber = 42; *nSecondNumber = -1; break; case 38: *nFirstNumber = 45; *nSecondNumber = 15; break; case 39: *nFirstNumber = 45; *nSecondNumber = 16; break; case 40: *nFirstNumber = 45; *nSecondNumber = 17; break; case 41: *nFirstNumber = 45; *nSecondNumber = 18; break; case 42: *nFirstNumber = 45; *nSecondNumber = 19; break; case 43: *nFirstNumber = 41; *nSecondNumber = -1; break; case 44: *nFirstNumber = 45; *nSecondNumber = 21; break; case 45: *nFirstNumber = 36; *nSecondNumber = -1; break; case 46: *nFirstNumber = 37; *nSecondNumber = -1; break; case 47: *nFirstNumber = 40; *nSecondNumber = -1; break; case 48: *nFirstNumber = 0; *nSecondNumber = -1; break; case 49: *nFirstNumber = 1; *nSecondNumber = -1; break; case 50: *nFirstNumber = 2; *nSecondNumber = -1; break; case 51: *nFirstNumber = 3; *nSecondNumber = -1; break; case 52: *nFirstNumber = 4; *nSecondNumber = -1; break; case 53: *nFirstNumber = 5; *nSecondNumber = -1; break; case 54: *nFirstNumber = 6; *nSecondNumber = -1; break; case 55: *nFirstNumber = 7; *nSecondNumber = -1; break; case 56: *nFirstNumber = 8; *nSecondNumber = -1; break; case 57: *nFirstNumber = 9; *nSecondNumber = -1; break; case 58: *nFirstNumber = 45; *nSecondNumber = 35; break; case 59: *nFirstNumber = 44; *nSecondNumber = 15; break; case 60: *nFirstNumber = 44; *nSecondNumber = 16; break; case 61: *nFirstNumber = 44; *nSecondNumber = 17; break; case 62: *nFirstNumber = 44; *nSecondNumber = 18; break; case 63: *nFirstNumber = 44; *nSecondNumber = 19; break; case 64: *nFirstNumber = 44; *nSecondNumber = 31; break; case 65: *nFirstNumber = 10; *nSecondNumber = -1; break; case 66: *nFirstNumber = 11; *nSecondNumber = -1; break; case 67: *nFirstNumber = 12; *nSecondNumber = -1; break; case 68: *nFirstNumber = 13; *nSecondNumber = -1; break; case 69: *nFirstNumber = 14; *nSecondNumber = -1; break; case 70: *nFirstNumber = 15; *nSecondNumber = -1; break; case 71: *nFirstNumber = 16; *nSecondNumber = -1; break; case 72: *nFirstNumber = 17; *nSecondNumber = -1; break; case 73: *nFirstNumber = 18; *nSecondNumber = -1; break; case 74: *nFirstNumber = 19; *nSecondNumber = -1; break; case 75: *nFirstNumber = 20; *nSecondNumber = -1; break; case 76: *nFirstNumber = 21; *nSecondNumber = -1; break; case 77: *nFirstNumber = 22; *nSecondNumber = -1; break; case 78: *nFirstNumber = 23; *nSecondNumber = -1; break; case 79: *nFirstNumber = 24; *nSecondNumber = -1; break; case 80: *nFirstNumber = 25; *nSecondNumber = -1; break; case 81: *nFirstNumber = 26; *nSecondNumber = -1; break; case 82: *nFirstNumber = 27; *nSecondNumber = -1; break; case 83: *nFirstNumber = 28; *nSecondNumber = -1; break; case 84: *nFirstNumber = 29; *nSecondNumber = -1; break; case 85: *nFirstNumber = 30; *nSecondNumber = -1; break; case 86: *nFirstNumber = 31; *nSecondNumber = -1; break; case 87: *nFirstNumber = 32; *nSecondNumber = -1; break; case 88: *nFirstNumber = 33; *nSecondNumber = -1; break; case 89: *nFirstNumber = 34; *nSecondNumber = -1; break; case 90: *nFirstNumber = 35; *nSecondNumber = -1; break; case 91: *nFirstNumber = 44; *nSecondNumber = 20; break; case 92: *nFirstNumber = 44; *nSecondNumber = 21; break; case 93: *nFirstNumber = 44; *nSecondNumber = 22; break; case 94: *nFirstNumber = 44; *nSecondNumber = 23; break; case 95: *nFirstNumber = 44; *nSecondNumber = 24; break; case 96: *nFirstNumber = 44; *nSecondNumber = 32; break; case 97: *nFirstNumber = 46; *nSecondNumber = 10; break; case 98: *nFirstNumber = 46; *nSecondNumber = 11; break; case 99: *nFirstNumber = 46; *nSecondNumber = 12; break; case 100: *nFirstNumber = 46; *nSecondNumber = 13; break; case 101: *nFirstNumber = 46; *nSecondNumber = 14; break; case 102: *nFirstNumber = 46; *nSecondNumber = 15; break; case 103: *nFirstNumber = 46; *nSecondNumber = 16; break; case 104: *nFirstNumber = 46; *nSecondNumber = 17; break; case 105: *nFirstNumber = 46; *nSecondNumber = 18; break; case 106: *nFirstNumber = 46; *nSecondNumber = 19; break; case 107: *nFirstNumber = 46; *nSecondNumber = 20; break; case 108: *nFirstNumber = 46; *nSecondNumber = 21; break; case 109: *nFirstNumber = 46; *nSecondNumber = 22; break; case 110: *nFirstNumber = 46; *nSecondNumber = 23; break; case 111: *nFirstNumber = 46; *nSecondNumber = 24; break; case 112: *nFirstNumber = 46; *nSecondNumber = 25; break; case 113: *nFirstNumber = 46; *nSecondNumber = 26; break; case 114: *nFirstNumber = 46; *nSecondNumber = 27; break; case 115: *nFirstNumber = 46; *nSecondNumber = 28; break; case 116: *nFirstNumber = 46; *nSecondNumber = 29; break; case 117: *nFirstNumber = 46; *nSecondNumber = 30; break; case 118: *nFirstNumber = 46; *nSecondNumber = 31; break; case 119: *nFirstNumber = 46; *nSecondNumber = 32; break; case 120: *nFirstNumber = 46; *nSecondNumber = 33; break; case 121: *nFirstNumber = 46; *nSecondNumber = 34; break; case 122: *nFirstNumber = 46; *nSecondNumber = 35; break; case 123: *nFirstNumber = 44; *nSecondNumber = 25; break; case 124: *nFirstNumber = 44; *nSecondNumber = 26; break; case 125: *nFirstNumber = 44; *nSecondNumber = 27; break; case 126: *nFirstNumber = 44; *nSecondNumber = 28; break; case 127: *nFirstNumber = 44; *nSecondNumber = 29; break; } }