Click here to Skip to main content
Click here to Skip to main content

Smart Device Print Engine for Compact Framework

, 19 Apr 2004 CPOL
Rate this:
Please Sign up or sign in to vote.
Printing support for .NET Compact Framework.

Introduction

I was faced with a problem while developing an application on Microsoft .NET Framework. The problem was .NET Framework’s printout support. NET framework has lack of printing and print preview support for some resource reasons. Therefore, I started to develop a print engine for Compact Framework. Actually, Pocket PC 2003 has APIs for printing support to Pocket PC 2003 through serial port which is useful for developers who want to develop an application on Compact Framework with printing support.

I used “P/Invoking Serial APIs in the Compact Framework” sample code on MSDN while developing serial communication class. As we know, dot-matrix printers uses COM or LPT port in order to communicate with the system. If you want to send data through COM port, you should use byte streaming.

In my case, I used following values;

BaudRate = 9600
Size = 8
Parity = 0
StopBits = 0

My class has print preview support, too. It is based on dynamically created window as below;

Pic. 1

I used multiline, locked textbox in order to show print preview. Text box object is so necessary for this job because of its nature. Actually, by forming a page from byte array; I can set text property to print buffer in order to show preview, easily. As you see, preview has BACK and NEXT buttons and page number label, too. All of the controls has been created dynamically.

Background

Smart Device Print Engine is formed by two main layers; print class and serial communication class. I will describe in detail and step by step, how it works.

Pic.2

Using the code

As I mentioned before, serial port communication is based on byte streaming. Therefore, you need to send data in a byte array. I used CEWriteFile API function in order to send data through COM port. You can put your data in a (n) sized array and send it to the port. For example :

int iNumberOfBytesRead=0;
uint iNumberOfBytesToRead=1024;
byte[] Output = new byte[1024];

CEWriteFile(hPort, Output, iNumberOfBytesToRead, 
  ref iNumberOfBytesRead, IntPtr.Zero); 

The API function mentioned, sends 1024 bytes data at a time which is necessary for minimizing trips between smart device and the serial port. For example you want to print “hello world” string from a line printer. How this is going to happen? Firstly, you need to create a page as below;

// Create SDPE instance
SDPE = new SmartDevicePrintEngine();

// Set COM port for SDPE
SDPE.Port="COM1:";

// Create page with size parameters
SDPE.CreatePage(36,46);

Code block mentioned above, creates a SmartDevicePrintEngine object instance and sets serial port number to COM1 and creates a logical page on memory which is 2 dimensional 36x46 byte array. Then it creates, CommDevice instance in order to communicate with printer. In CommDevice constructor, I set package sizes to 1024 as default value. That means, 1024 bytes will be send at a time for each package. Then, I created Device Control Block instance to set serial port properties. As we know, Compact Framework doesn’t support Abort() method for threads. Therefore, I used event mechanism in order to stop the thread execution. I used an ArrayList to store pages for print preview in SmartDevicePrintEngine constructor. These happen at Form_Load event. Now, we are ready to fill up the logical page with our strings.

How will I write my string and locate on paper? I developed WriteToLogicalPage() method since it puts a string on the print area. Method has two overloads which are aligned string and unaligned string. I will describe, how it works in the following sections.

Writing and locating a string on a page is quite easy. Look at the following code block for an example;

SDPE.WriteToLogicalPage(17, 2, "Hello World");

X and Y coordinates are starting from value 1. We want to put up “Hello World” string to 17, 2 location. First step in WriteToLogicalPage() method is checking page bounds and converting the string (“Hello World”) into PageBuffer which is a byte array. We created a logical page, set and located the string on page. Now, we need to call the most important method which is Print().

I initialized serial port by OpenPort, SetupCommSetDCB, SetConnectionTimeout and CreateCommThread. These methods initializes and opens serial port device communication. After initialization, we need to send byte array to serial port. Therefore, we should call Send() method. In Send() method, we need to send 1024 bytes package for each trip. At the end of this process, all of the data is sent to the serial port as 1024 bytes packages. We need to send form feed character (“0x0c”) for page break. If we have more than one page, we need to call NewPage() method which flushes old page and creates a new one. Now that, print process has completed successfully, we should close port by Close() method. That’s all.

Now, we will look at the preview support in Smart Device Print Engine. All steps are the same as Print() method until AddToPreview(). In AddToPreview() method; we need to create a StringBuilder object instance in order to concatenate rows for building a new preview page. We should insert new page into page array. NewPage() method, flushes old page and creates new one. Preview page is formed dynamically. It has a textbox in order to represent printout of pages.

I want to describe class methods and properties at below;

Class : SmartDevicePrintEngine

Signature : SmartDevicePrintEngine()
Description : Constructor.
Signature : public bool CreatePage(int Width, int Height)Description : Creates a logical page which is 2 dimensional byte array.
Signature : public void WriteToLogicalPage(int x, int y, string Value)Description : Writes a string to given location on page. String shouldn’t overflow from page.
Signature : public void WriteToLogicalPage(int x, int y, int Length, int Alignment, string Value)Description : Writes a string to given location by alignment and fixed length on page. String shouldn’t overflow from page. For example, you may want to write numeric value which should be right aligned.
Signature : public void FormFeed()Description : It is simple to understand. Sends 0x0c to serial port.
Signature : private string ReadLogicalPageByRow(int RowNumber)Description : Reads byte array row by row and returns it in a string variable.
Signature : public void Dispose()Description : Flushes objects from memory.
Signature : public void NewPage()Description : Creates new page.
Signature : public void Print()Description : Prints the document page or pages.
Signature : public void AddToPreview()Description : Adds your preview pages into array in order to represent at print preview screen.
Signature : public void Preview()Description : Calls preview window and represents preview of a page.
Signature : public int PageWidthDescription : Page width.
Signature : public int PageHeightDescription : Page height.
Signature : public string PortDescription : COM port number.

Class : CommDev

Signature : public CommDevice()Description : Constructor
Signature : private IntPtr OpenPort()Description : Opens a port in order to perform serial communication.
Signature : private void SetupComm()Description : Sets buffer sizes.
Signature : private void SetConnectionTimeOut()Description : Set connection time-out for serial communication.
Signature : private void SetDCB()Description : Device control block
Signature : private void CreateCommThread()Description : Creates a thread in order to processing events.
Signature : public void Init()Description : Serial port initialization routines.
Signature : public void Send(char[,] Data)Description : Sends byte array in 1024 bytes segments.
Signature : public void Send(byte Data)Description : Sends a char to the serial port.
Signature : public void ClosePort()Description : Closes COM port.
Signature : public void Dispose()Description : Flushes objects.
Signature : public string PortDescription : COM port number.
Signature : public uint BaudRateDescription : Communication baud rate.

You can use Smart Device Print Engine in your continuous forms such as sales, order, invoice, etc... Class supports ASCII prints. But, I’m planning to add, Bluetooth support into class, in the near future. I hope it will be necessary for developers who want to add print-out support to their own projects. Also, this article gives information about serial communication through Pocket Devices.

I used Smart Device Print Engine class at mobile sales project which needs to printout invoices on the field. We are still using the class, successfully.

History

  • Version 1.0 - First release

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Orkun GEDiK
Software Developer (Senior) ASTRON
Turkey Turkey
I'm working at Yasar Holding IT department as senior SAP R/3 BASIS and Development Consultant and system integrator. I have experience on C/C++ for 6 years. Implementing and inviting new technologies is most biggest part of my life. Object oriented paradigm is a philosophy of my vision.

Comments and Discussions

 
QuestionQuestion on port. PinmemberMember 111281077-Oct-14 2:55 
Questionquestion PinmemberMember 1110422723-Sep-14 7:59 
SuggestionNice work and idea for starting a PrintEngine Pinmemberhjgode17-Sep-14 19:11 
QuestionBarkod Basmak Pinmembernihaterdil20-Dec-12 3:52 
QuestionNot Printing On Emulator Pinmemberwebber9913-Dec-12 5:47 
AnswerRe: Not Printing On Emulator PinmemberS.VDavis20-Dec-12 6:05 
GeneralRe: Not Printing On Emulator PinmemberMember 111281077-Oct-14 2:22 
QuestionHow to print Chinese character Pinmemberwillsoft_jin6-Mar-12 3:27 
QuestionTürkçe Karakterler Pinmemberyamanbas20-Oct-11 5:37 
GeneralNot Printing Pinmemberrakesh.hosagoudar25-May-11 21:23 
GeneralTurkish Charset / Charset Settings / Türkçe Karakter [modified] Pinmembertetrat1-Jul-10 21:32 
QuestionPRINTING ON ZEBRA QL420, FROM SYMBOL PPT8800 Pinmemberriccardo amico3-Feb-10 6:21 
GeneralUSB printer in windows CE PinmemberSajjad Izadi28-Nov-09 8:03 
GeneralPrinting using Bluetooth printer Pinmembermarcin.klus26-May-09 10:27 
Generalmobile printing PinmemberEBall3-Apr-09 10:33 
GeneralPrint logo or image PinmemberMember 194710423-Feb-09 2:07 
GeneralPrint logo PinmemberMember 194710423-Feb-09 2:07 
Questionprinter Pinmemberosanchez8426-Dec-08 9:37 
GeneralAumentar tamaño de la letra Pinmemberlycan07143-Dec-08 4:23 
GeneralChange font style, size ; Pinmemberfab.as18-Sep-08 1:15 
GeneralGreat work. Thanks!!!! PinmemberMember 46002623-Sep-08 2:09 
QuestionSPDE PRINTING BMP IMAGE Pinmemberramana venkata paidi28-Aug-08 21:47 
AnswerRe: SPDE PRINTING BMP IMAGE Pinmemberziaddtahaa8-Feb-11 0:02 
GeneralRe: SPDE PRINTING BMP IMAGE Pinmemberziaddtahaa8-Feb-11 0:04 
QuestionCan I connect to wireless printer by using thid application? PinmemberMember 39254805-Jun-08 21:49 
GeneralBARCODE PRINTING THROUGH ASP.NET FROM SAP Pinmembermodii62023-Jun-08 21:28 
Generalwat's the vb.net code to print a document through a device application Pinmemberarpit05225gcse29-May-08 18:28 
Questionhow to put logo in the printed page Pinmemberreham24-Mar-08 4:45 
GeneralGreat work! PinmemberWin32nipuh19-Feb-08 5:19 
Generalturkish characters problem PinmemberMember 435985018-Dec-07 2:27 
GeneralSending Escape Characters to Printer Pinmembertorpilla22727-Nov-07 5:17 
GeneralPrint good. But how? [modified] Pinmember0Umix25-Nov-07 19:36 
GeneralQuery in using SmartDevicePrintEngine class (CFPrinting.dll) Pinmembernikeyhere2-Nov-07 0:32 
GeneralRe: Query in using SmartDevicePrintEngine class (CFPrinting.dll) PinmemberOrkun GEDiK2-Nov-07 10:48 
QuestionHow to modify these code to print Traditional/Simplified word Pinmemberkueihungyeh12-Sep-07 7:41 
QuestionLand Scape Printing Pinmemberjon555512-Sep-07 6:49 
Generalthere is an error Pinmembermelodytr9-Aug-07 5:30 
Questionwindows ce 4.2? Pinmembermelodytr6-Aug-07 9:48 
QuestionPictures? Pinmembertorpilla2273-Aug-07 7:37 
AnswerRe: Pictures? PinmemberOrkun GEDiK4-Aug-07 1:10 
QuestionRe: Pictures? Pinmemberacoulter16-Aug-07 6:05 
AnswerRe: Pictures? PinmemberAnagnostes29-Oct-07 10:42 
GeneralRe: Pictures? Pinmemberacoulter29-Oct-07 23:40 
QuestionTesting the code on Pocket PC 2002 emulator PinmemberCoral281-Aug-07 8:21 
AnswerRe: Testing the code on Pocket PC 2002 emulator PinmemberOrkun GEDiK1-Aug-07 21:41 
GeneralRe: Testing the code on Pocket PC 2002 emulator Pinmemberjyoti1216-May-10 21:57 
Generalsource in vb.net [modified] Pinmembervehbi emiroglu4-Jul-07 4:15 
GeneralExcellent Work Pinmemberacoulter3-Jul-07 0:36 
GeneralRe: Excellent Work PinmemberOrkun GEDiK3-Jul-07 1:24 
GeneralPrinting each single row (not page) PinmemberGiulia2126-Jun-07 0:34 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.141030.1 | Last Updated 20 Apr 2004
Article Copyright 2004 by Orkun GEDiK
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid