Print by Script classes and a PrintFormEditor

Download script print classes 124K

Download PrintFormEditor beta executable 167K

Download PrintFormEditor beta source code (need Stingray Objective Toolkit to compile) 227K

printeditor.gif (13K)

This article shows the usage for a couple of classes, CFormJob and CFormPrinterJob, which can be used to parse a ascii script file containing pages layout for printing.
I provide here a beta version for a visual script editor - the PrintFormEditor - along with its source code (in the hope that someone else will write a better one). The PrintFormEditor uses Stingray Objective Toolkit, and without you will not be able to compile its code, so I provide here a compiled executable.
In future (but it may take month) I will write a version of PrintFormEditor which works without Stingray's and which will fix the tons of bugs that currently lives happily in its code.
I put it here because I think it may be useful and in the hope that someone will write a similar app - since I will give no support for it, but be warned that it has lots of bugs, sometimes crashes and sometimes corrupt your script files, the selections system has many troubles as has the property msdev-like dialog (but it's implementation is worth a look, I think). And remember that it has be written because I quickly need it working, so it's not an example of clear and good programming. Don't look too much at it's code for learning.

Read down at point 8. to learn more about the editor.
Now, let's talk about the script classes.

Index


1. The concept
2. A sample script for single page form
3. The virtual overrideables for single page forms
4. Putting it all in a view
5. A sample script for multi items form
6. Putting it all in a view (2)
7. Printing from a dialog
8. The PrintFormEditor
9. What do I need to use it ?
10. Note about static MFC linking


1. The concept

This 2 classes provide a way of handling printing using an ascii script file for defining pages layout. It can be useful for printing forms with a fixed number of pages or forms with a variable numbers of subitems in it (like a form containing a list control).
In defining a page we can use different items:
  • Static - for label items
  • Edit - for fields items (we'll see how to derive a class from CFormPrinterJob and override a virtual function to obtain the fields values at runtime)
  • Line - for line items
  • Rect - for rect items
  • Image - for custom draw items (like bitmaps, we'll use virtuals as above)
  • HLine - for horizontal lines
  • VLine - for vertical lines
  • SubForm - for subforms items (that means, for example, the items of a list control)

2. A sample script for single page form

Now, let's start with a sample script:
[Form Page Header]
NumPages=1
Page 0=testpage

[testpage]
Rect=100,100,2000,2800
Static=0,0,1900,150,Test Form Demo,,,bold,italic,,Times New Roman,48,-1,ffffff,000000,000000,0,0,1,37
Static=0,300,300,400,Field 1:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=350,300,900,400,m_Field1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=0,400,300,500,Field 2:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=350,400,900,500,m_Field2,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=900,300,1200,400,Field 3:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=1250,300,1900,400,m_Field3,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=900,400,1200,500,Field 4:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=1250,400,1900,500,m_Field4,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
HLine=0,150,1900,200,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Image=1600,0,1900,150,m_Image1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
(this is the "testform1.prx" provided in the demo)

This kind of scripts can be generated by the PrintFormEditor or can written by hand, as you like.
Now I'll explain the script format:
/*this is the header of the file; it is the section which hold the number of pages in the script and their names - that means that you can define more that a page layout in a single script*/
[Form Page Header]
/*number of pages present in this script*/
NumPages=1
/*The pages names, like Page 0=the name of first page, Page 1=the name of second page, etc ..*/
Page 0=testpage
/*after the pages names, there must be an empty line*/


The header of the file is not needed by the parse classes, but is needed for the PrintFormEditor - so put it.

After that header, we find the pages layout:
/*here goes the page name closed in square brackets*/
[testpage]
/*Then we need to define the rect of the page, using 10th of mm as unit*/
Rect=100,100,2000,2800

Now we start finding the items which compose the page; the format of the items is the following (divided by commas). Some of them are not needed, depending by the type:
"itemtype","left of item rect","top","right","bottom","field1","condition","field2","bold","italic", "underline","font facename","font size","background type","background color","text color","border color", "exinfo value","border type","border size","text alignment"
The meaning of that fields is the following:
  • itemtype - means the kind of item; it is a text label and you can use any of the keywords stated abose (Static, Edit, ..)

  • left of item rect - means the left position of the rect surronding the item; it is in 10th of mm units and is relative to the page left margin (that means that if the page rect start at 100 10th/mm and the item left position is 500, it will be draw at 600 10th/mm)

  • top - same as above, top position

  • right - same as above, right position

  • bottom - same as above, bottom position

  • field1 - this is a text value; its meaning depends from the item type:
    • Static - the field1 is the text that the label will display

    • Edit - the field1 will be passed to a virtual function; you will provide a value for this field at runtime

    • Image - the field1 will be passed to a virtual function along with item rect and a CDC pointer; you will draw what you want in that rect at runtime

    • Subform - the field1 is the name of another page in the script; the page defined in field1 will be used to draw the items of a subform; for example, you can define another small page (for example, size 20 cm width and 0,5 cm height) which describe a list item and provide here the name of that page. It will be used to draw the list item inside the subform.

    • for other items, field1 is ignored

  • condition - when a condition is not null (is not ""), it will be passed to a virtual function; if you return true, the field2 will be handled instead of field1 (except for subform items). In my personal case, I use this because I need to print forms in 2 languages, and using condition I can write a single page layout and having the static items change their text defining a condition instead of writing 2 page scripts.

  • field2 - read above (field1 and condition)

  • bold - is this value is "bold", a bold font will be used

  • italic - is this value is "italic", a bold font will be used

  • underline - is this value is "underline", a bold font will be used

  • font facename - this will contain the font name (ignored if the item type doesn't output text, like the lines)

  • font size - the font size, ignored if no font is needed

  • background type - this can be -1 (means transparent background) or 0 (solid background filled with background color)

  • background color - the background color (ignored if background type is -1); the format of that color is RGB in hex values (FF0000 means red 255, green 0, blue 0)

  • text color - the color used for text or lines, defined as above

  • border color - the color of item border, if a border is defined (see border type)

  • exinfo value - currently unused

  • border type - if 0, no border is draw; if != 0 and item is a Static or an Edit, a border will be draw around it, using a pen of color "border color" and size "border size"

  • border size - the border size (in CPen units), if a border is defined

  • text alignment - a numeric value for text alignment (if text will be draw); this value will be used directly in calls to DrawText; from the WinUser.h:

    • #define DT_TOP 0x00000000 (0)
    • #define DT_LEFT 0x00000000 (0)
    • #define DT_CENTER 0x00000001 (1)
    • #define DT_RIGHT 0x00000002 (2)
    • #define DT_VCENTER 0x00000004 (4) - needs DT_SINGLELINE also to be defined
    • #define DT_BOTTOM 0x00000008 (8)
    • #define DT_SINGLELINE 0x00000020 (32)
    using the info above, if you need, for example, right-bottom aligned text, you'll do 2+8 = 10 and put 10 as text alignment value

So, let's go on parsing the script lines:
/*That means a label draw in rect(0,0,1900,150) + offset(100,100) as page offset; the text "Test Form Demo" will be draw with a Times New Roman bold italic font of size 48 in black color with transparent background and in the middle (both vert and horz) of the rect*/
Static=0,0,1900,150,Test Form Demo,,,bold,italic,,Times New Roman,48,-1,ffffff,000000,000000,0,0,1,37

/*That means a label draw in rect(0,300,300,400) + offset(100,100) as page offset; the text "Field 1:" will be draw with a Arial bold font of size 8 in black color with transparent background and right aligned in the rect*/
Static=0,300,300,400,Field 1:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2

/*That means that the value "m_Field1" will be passed to a virtual function; the returned text will be draw in rect(350,300,900,400) + offset(100,100) with a Arial bold font of size 8 in black color with transparent background and top-left aligned in the rect*/
Edit=350,300,900,400,m_Field1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0

...
/*That means an horizontal line which will be draw from 0,150 to 1900,150 (in horiz lines only the top of the rect is used in drawing and in vert lines only the left of the rect is used) + (100,100) with a black pen*/
HLine=0,150,1900,200,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
/*That means that the rect 1600,0,1900,150 + (100,100) will be passed to a virtual function with the tag name "m_Image1" and a pDC pointer; in the demo we'll draw a bitmap in this rect*/
Image=1600,0,1900,150,m_Image1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0

This is how the script above appear in print preview:
preview1.gif (4K)

And this is how it appear in the PrintFormEditor:
printeditor1.gif (21K)

3. The virtual overrideables for single page forms

To provide the values for the edit fields and for the images, you'll need to derive a class from CFormPrinterJob (let's say, CSinglePagePrintJob), and override those functions:
	virtual void SelectPage(const long lPageId);
	virtual bool ParseCondition(const char * pTag);
	virtual void ParseScript(const char * cTag, CString &csValue);
	virtual void DrawBitmap(const char * cTag, CRect rcBitmap, CDC * pDC);
You have to define the pages you want to print before starting the print process, for example in the view OnPreparePrinting. To define the pages you need call this function:
	cSingleJob.AddPage("testform1.prx", "testpage", 1);
AddPage takes the script filename (and eventually path), the page name as defined in the script and a page Id. The virtual function SelectPage will be called when the class in about to print a page giving the Id you defined in AddPage. Supposing for example you are printing 3 pages based on 3 database records, you can derive the SelectPage function to move the database cursor on the proper record based on the given lPageId. The default implementation do nothing.

The ParseCondition function is called when a condition is finded in parsing the script. The condition value of the item will be passed to this function and you can return false if you want the field1 to be processed, and true if you want the field2 to be processed.

The ParseScript function is called when the field1 or field2 value of an edit item need to be defined. The field value will be passed in cTag, and you'll have to return the text value to be displayed in the CString &cs. For example, if the cTag is "m_Field1" you can return the first field of the selected database record.

The DrawBitmap is called when an image item is find in the script. The field1 value of the item will be passed in cTag, rcBitmap will hold the rectangle in which you have to draw and pDC is the printer dc.

In the sample, I didn't use database; I simply put a pointer to my form view in the derived CSinglePagePrintJob and get the values for the edit items from the edit controls of the view. My overridden functions looks like that:
/*In this function, I'll draw the bitmap from resource 
  IDB_BITMAP stretching it in the given rect*/
/*Remember that the mapping mode of the dc is actually MM_LOMETRIC*/
void CSinglePagePrintJob::DrawBitmap(const char * cTag, CRect rcBitmap, CDC * pDC) { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); CDC memDc; memDc.CreateCompatibleDC(pDC); CBitmap * obmp = memDc.SelectObject(&bmp); BITMAP bm; bmp.GetBitmap(&bm); pDC->StretchBlt(rcBitmap.left, rcBitmap.top, rcBitmap.Width(), rcBitmap.Height(), &memDc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); memDc.SelectObject(obmp); } void CSinglePagePrintJob::ParseScript(const char * cTag, CString &csValue) { ASSERT(pView); if (!(lstrcmpi(cTag, "m_Field1"))) csValue = pView->csVal1; else if (!(lstrcmpi(cTag, "m_Field2"))) csValue = pView->csVal2; else if (!(lstrcmpi(cTag, "m_Field3"))) csValue = pView->csVal3; else if (!(lstrcmpi(cTag, "m_Field4"))) csValue = pView->csVal4; }
Now, we'll explore how to implement all this stuff inside a view.

4. Putting it all in a view

After we derived the CSinglePagePrintJob, we'll put an instance of it in the view header:
#include "SinglePagePrintJob.h"

class CTestPrintFormDoc;

class CTestPrintFormView : public CFormView
{
public:
	CSinglePagePrintJob	cSingleJob;
...
}
Then, we can modify our view print functions like that:

BOOL CTestPrintFormView::OnPreparePrinting(CPrintInfo* pInfo)
{
	UpdateData();

	cSingleJob.Clear();
	cSingleJob.AddPage("testform1.prx", "testpage", 1);

	if (pInfo->m_bPreview) return DoPreparePrinting(pInfo);

	return cSingleJob.OnPreparePrinting(pInfo);
}

void CTestPrintFormView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	cSingleJob.OnBeginPrinting(pDC, pInfo);
}

void CTestPrintFormView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	cSingleJob.OnEndPrinting(pDC, pInfo);
}

void CTestPrintFormView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
	cSingleJob.OnPrint(pDC, pInfo);
}
Remember, when giving the file name, that if you don't give the full path of the script file, it will be searched in the curent directory and in the path enviroment. That means that if you don't give the full path, it may appen that the printing will work only until you load a file from a directory which differs from the app one.
Now we'll see how to implement a script able to handling the items of a list control.

5. A sample script for multi items form

[Form Page Header]
NumPages=2
Page 0=testpage
Page 1=testsubform

[testpage]
Rect=100,100,2000,2800
Static=0,0,1900,150,Test Form Demo with subform,,,bold,italic,,Times New 
Roman,26,-1,ffffff,000000,000000,0,0,1,37
Static=0,300,300,400,Field 1:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=350,300,900,400,m_Field1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=0,400,300,500,Field 2:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=350,400,900,500,m_Field2,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=900,300,1200,400,Field 3:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=1250,300,1900,400,m_Field3,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=900,400,1200,500,Field 4:,,,bold,,,Arial,8,-1,ffffff,000000,000000,0,0,1,2
Edit=1250,400,1900,500,m_Field4,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
HLine=0,150,1900,200,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Image=1600,0,1900,150,m_Image1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Subform=94,694,1790,2500,testsubform,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Static=88,644,398,688,Column 1,,,,,,Arial,8,0,c0c0c0,000000,000000,0,0,1,0
Static=396,644,1792,688,Column 2,,,,,,Arial,8,0,c0c0c0,000000,000000,0,0,1,0
HLine=10,2602,1882,2630,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Rect=88,644,1792,688,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Rect=88,692,1792,2498,testsubform,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0

[testsubform]
Rect=0,0,1800,53
Edit=0,0,298,46,m_subfield1,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
Edit=303,0,1888,46,m_subfield2,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
HLine=0,52,1700,53,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
VLine=299,0,301,53,,,,,,,Arial,8,-1,ffffff,000000,000000,0,0,1,0
(this is the "testform2.prx" provided in the demo)

The main differences between this and the other script is that here we have 2 pages defined, "testpage" and "testsubform". In the testpage form we have a Subform item with "testsubform" as field value.
The size of the testsubform page is little, having an height of 0.5 cm. The Subform item in the "testpage" page has an height of ~18 cm. That means that we have about 36 items in a page (a bit less since testsubform height is 53 and not 50).
When using multiitem pages, you have to use the AddPage function in another way:
	cMultiJob.AddPage("testform2.prx", "testpage", 1, wndList.GetItemCount());
Here we pass another parameter after the page Id - it's the number of subitems we have for the Subform item.
The class will call another virtual function just before getting info for a subitem:
	virtual void SelectSubItem(const long lPageId, const long lSubItemIndex);
If for example we have 200 items in the list control, the class will call:
Selectpage(1);
SelectSubItem(1,0);
SelectSubItem(1,1);
SelectSubItem(1,2);
SelectSubItem(1,3);
...
SelectSubItem(1,35);
// Here we'll have a page change
SelectSubItem(1,36);
..and so on
In the demo, since we are not using database or the like, I simply store the lSubItemIndex every time the SelectSubItem function is called, and my derived functions looks like that:
void CMultiPagePrintJob::ParseScript(const char * cTag, CString &csValue)
{
	ASSERT(pView);

	if (!(lstrcmpi(cTag, "m_Field1"))) csValue = pView->csVal1;
	else if (!(lstrcmpi(cTag, "m_Field2"))) csValue = pView->csVal2;
	else if (!(lstrcmpi(cTag, "m_Field3"))) csValue = pView->csVal3;
	else if (!(lstrcmpi(cTag, "m_Field4"))) csValue = pView->csVal4;
	else if (!(lstrcmpi(cTag, "m_subfield1"))) csValue = pView->wndList.GetItemText(lSubItem, 0);
	else if (!(lstrcmpi(cTag, "m_subfield2"))) csValue = pView->wndList.GetItemText(lSubItem, 1);
}

void CMultiPagePrintJob::SelectSubItem(const long lPageId, const long lSubItemIndex)
{
	lSubItem = lSubItemIndex;
}


This is how the script above appear in print preview:
preview2.gif (7K)

This is how "testpage" appear in the PrintFormEditor:
printeditor2.gif (14K)

And this is how "testsubform" appear in the PrintFormEditor:
printeditor2b.gif (2K)

6. Putting it all in a view (2)

After we derived the CMultiPagePrintJob, we'll put an instance of it in the view header:
#include "MultiPagePrintJob.h"

class CTestPrintFormDoc;

class CTestPrintFormView : public CFormView
{
public:
	CMultiPagePrintJob	cMultiJob;
...
}
Then, we can modify our view print functions like that:

BOOL CTestPrintFormView::OnPreparePrinting(CPrintInfo* pInfo)
{
	UpdateData();

	cMultiJob.Clear();
	cMultiJob.AddPage("testform2.prx", "testpage", 1, wndList.GetItemCount());

	if (pInfo->m_bPreview) return DoPreparePrinting(pInfo);

	return cMultiJob.OnPreparePrinting(pInfo);
}

void CTestPrintFormView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	cMultiJob.OnBeginPrinting(pDC, pInfo);
}

void CTestPrintFormView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	cMultiJob.OnEndPrinting(pDC, pInfo);
}

void CTestPrintFormView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
	cMultiJob.OnPrint(pDC, pInfo);
}


7. Printing from a dialog

These classes have been written based on my generic print classes here at codeguru. That means that printing from dialogs or from any other place is supported, except for print preview.
In the demo there is a menu command to launch a dialog which prints from it, printing exactly the same as from the view; in that way you can see the difference.
Basically, all you need to launch the print from somewhere else (you can do it from the view too, but you will have no preview) is this:
	UpdateData();

	cMultiJob.Clear();
	// This is the print job name as it will appear in the system print status
	cMultiJob.strTitle = "Test dialog multiitem pages";
	cMultiJob.AddPage("testform2.prx", "testpage", 1, wndList.GetItemCount());
	cMultiJob.OnFilePrint();

8. The PrintFormEditor

As I stated above, I give no support for this app. Use it at your own risk. You are encouraged, if you find that app has something good in it, to improve or rewrite it. If you do, send me your code and I will post it here.
Here there are the basic for working with it (and remember that the app can crash in every moment, but - I hope - shouldn't format your HD, at least not at the first time it crashes ..).
It has 2 windows, the view and a dockable bar. In the dockable bar are shown the pages of the document.
You can add a page using the menu Pages->Add a page; you can remove a page selecting it in the paper bar and using the menu Pages->Remove page.
With the menu pages->Page size and and margins you can define the page size, margin and name. The name can also be defined editing the icons in the paper bar and asking for the property dialog, pushing the "pin" button and then clicking on an icon in the paperbar.
Using the "Strumenti" toolbar you can add the items to the page; the "Align" toolbar permits standard alignment function; you are warned that the Align toolbar commands doesn't work very well - they use as "base" item the upper/left of the selected items, not the first or the last selected one.
You can handle an item properties selecting it and using the context menu->Property. Be carefully in having more than one item selected when doing this, since the change may be not as you can imagine.
When you made changes to the properties, if they are not immediatly reflected on the selected item, hit the enter key.
Some of the features in the property dialog are not currently implemented in the parse classes, as the "double border style"; and it doesn't gray out the unused fields (eg. you can select "bold" and font's facename even for lines - but it will be ignored).
The help button in property dialog in here only show how it can be implemented, actually it shows an unuseful little help page (in italian!).
Remember, if you try the print preview command, to close the property dialog before. Exiting the print preview is something which sometimes crash the app on my pc - save before!

A last thing; I finded useful to use this app to make drafts of pages, and then manually modify the scripts.
Don't damn me too much using this thing; remember that is free (an applause for the word "free" ..), that I do other thing to live beside this (or I will be starving at this time ..) and I promise that if I will won at the lottery I will write a better one.

9. What do I need to use it ?

You'll need to import (with the standard add component way) the classes:
  • CFormJob
  • CFormPrinterJob
  • CPrintStatus
Importing the CPrintStatus, which is a dialog, will import the dialog template resource too (IDD_PRINT_STATUS).
It needs an avi file to be displayed during printing process (I took a sample from Microsoft) named IDR_PRINT "AVI" resource (look at demo resource).

10. Note about static MFC linking

Someone has reported me of troubles in compiling the previous printer classes with static MFC library; the troubles where in loading the string resource named AFX_.. present in the CFormPrinterJob class.
I've succesfully compiled and run the classes with static MFC (under VC5 + SP3, NT40 + SP3) .. so I'm sorry, guys, but it's a problem of your Os/compiler/dll/lib .. don't damn me!

That's all. Hope this little thing will make less basic printing questions appear in the discussion board! Enjoy ..

And if you permits .. I would like to dedicate this work, especially the buggy PrintFormEditor (little vengeange, there's a bug for every tears), to my *sigh* ex-girlfriend Enrica.. I'm soo lonely and sad now .. *sigh*

Last updated: 1 July 1998



Comments

  • Purchasing a gucci? See these guidelines

    Posted by BobHotgloff on 05/04/2013 09:27am

    Efficient write-up aids you with some of the workings on nike and consequently all that you want to undertake today. [url=http://www.mizunogoruhujp.com/]ミズノ グローブ[/url] The Trick For mizuno [url=http://www.mizunogoruhujp.com/ミズノ-ゴルフクラブ-c-1.html]ミズノ グラブ[/url] Concise summary instructs you some of the ins and outs for nike and the actions you ought to do right away. [url=http://www.mizunogoruhujp.com/ゴルフグローブ-c-33.html]ミズノプロ グローブ[/url] Precisely what everyone else has been doing with nike and consequently the thing youought to do completely different. [url=http://www.mizunogoruhujp.com/ゴルフバッグ-c-7.html]ミズノ[/url] Impartial write-up divulges A few fresh stuff around nike that no-one is mentioning. [url=http://www.mizunogoruhu.com/]ミズノ[/url] A double take on nike [url=http://www.mizunogoruhu.com/ミズノmizuno-クラブ-c-4.html]ミズノ mp[/url] Accessories and assembly in Washington : mizuno simply leaves without bon voyage [url=http://www.mizunogoruhu.com/ミズノmizuno-アイアン-c-3.html]ミズノ[/url] Highly effective tricks for nike that you can use beginning right now. [url=http://www.mizunogoruhu.com/ミズノmizuno-バッグ-c-5.html]ミズノゴルフ[/url] Short blog post clearly shows the proven details of mizuno and how it can certainly have a bearing on anybody.

    Reply
  • Nike Draught Max+instagram, at one's desire you hold the color to wear on your feet!

    Posted by madytreathy on 04/22/2013 07:43pm

    Recollect in 2008, if not earlier, when Nike launched winning of the separated shoe color projects, the watchword "Shoot Your Colours", "Nike PhotoiD" layout, [url=http://fossilsdirect.co.uk/glossarey.cfm]nike huarache free[/url] effect has not been as enthusiastic as expected. Deem, 2008 Canon IXUS 80 IS Digital prankster arcade but purely 8 million pixels, Nokia, the mobile phone retail is the exclusively governorship, NikeiD was boost to color in the photos as a infrastructure for sneakers excise color, although provocative, but does provoke some. Instagram which sort this article hold up to ridicule and modest, Nike PHOTOiD homeopathic upgrade customization services, recently [url=http://markwarren.org.uk/goodbuy.cfm]nike free[/url] released a fresh plan. That such iD can you utensil pictures as instagram account shoe color, little while volunteer Nike Mood Max shoes and Nike Refresh Max 1, Nike Feeling Max 90 953 options. Interested in children's shoes, you [url=http://markwarren.org.uk/goodbuy.cfm]nike free run uk[/url] can ever conform with each other's official website photoid.Nike.com, in beyond to flip other people's originative industry, or you can hear to upload your own instagram photo, base your own Nike Hauteur Max.

    Reply
  • Does anyone know how to print an image in 2000 or XP?

    Posted by Legacy on 09/10/2003 12:00am

    Originally posted by: Dennis

    Does anyone know how to print an image in 2000 or XP?

    Reply
  • http://www.ucancode.net

    Posted by Legacy on 03/23/2003 12:00am

    Originally posted by: Cindy wang

    Very cool article

    Reply
  • Not in English?!?

    Posted by Legacy on 01/08/2003 12:00am

    Originally posted by: TimoL


    First: It's seem's to be a great simple project!

    But why is the FormEditor not in english?!?
    This is a little verhicle...

    Timo

    Reply
  • Printer Queue

    Posted by Legacy on 03/25/2001 12:00am

    Originally posted by: musharif ahmed

    How Can A printer Queue Be accessed directly?
    
    I need some helping code.

    Reply
  • i can not compile the Demo project !!!

    Posted by Legacy on 10/26/1999 12:00am

    Originally posted by: Mike Huang

    I can not build it in VC6.0!
    Who can help me?

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • With 81% of employees using their phones at work, companies have stopped asking: "Is corporate data leaking from personal devices?" and started asking: "How do we effectively prevent corporate data from leaking from personal devices?" The answer has not been simple. ZixOne raises the bar on BYOD security by not allowing email data to reside on the device. In addition, Zix allows employees to maintain complete control of their personal device, therefore satisfying privacy demands of valued employees and the …

  • Flash technology is becoming more prominent in the storage industry. Offering superior speed and reliability when compared to traditional hard disk drives – flash storage is a flexible and increasingly cost-effective technology that can be used to optimize enterprise storage environments. This ebook explores the many uses and benefits of flash storage technology in the enterprise. Check it out to discover and learn all you need to: Optimize storage performance Leverage server flash as storage cache …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds