Printing Problem
-
I am doing printing on two types of printer e.g EPSON StYLUS C82 & HP Deskjet 5700.When printing using HP,i have displayed two Text one after other with some coordinates passed to it.Text are displayed one after other with some GAP.But when i print using EPSON ,Text are displayed one after other with Larger GAP.How this problem could be soved.Example code of this is: pDC->ExtTextOut(XCoOrdinate,YCoOrdinate+LINEGAP_Y,ETO_OPAQUE ,NULL, "Date",NULL); XCoOrdinate+=ParamHeadingRectWidthPrint; pDC->ExtTextOut(XCoOrdinate,YCoOrdinate,ETO_OPAQUE ,NULL, "Time",NULL); Thanks & regards,
priyank
-
I am doing printing on two types of printer e.g EPSON StYLUS C82 & HP Deskjet 5700.When printing using HP,i have displayed two Text one after other with some coordinates passed to it.Text are displayed one after other with some GAP.But when i print using EPSON ,Text are displayed one after other with Larger GAP.How this problem could be soved.Example code of this is: pDC->ExtTextOut(XCoOrdinate,YCoOrdinate+LINEGAP_Y,ETO_OPAQUE ,NULL, "Date",NULL); XCoOrdinate+=ParamHeadingRectWidthPrint; pDC->ExtTextOut(XCoOrdinate,YCoOrdinate,ETO_OPAQUE ,NULL, "Time",NULL); Thanks & regards,
priyank
You will need to use NON DEVICE DEPENDANT UNITS. I had some problems like that printing with the same mark but different models. I coded it in that way:
void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CMyDoc* pDoc = GetDocument ();
ASSERT_VALID (pDoc);
// Setting printing parameters
pDC->SetMapMode (MM_LOMETRIC);double dLeftOffset=200-(pDC->GetDeviceCaps(PHYSICALOFFSETX)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSX); double dTopOffset=200-(pDC->GetDeviceCaps (PHYSICALOFFSETY)\*254.0)/pDC->GetDeviceCaps (LOGPIXELSY); double dRightMargin=1950-(pDC->GetDeviceCaps (PHYSICALOFFSETX)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSX); double dBottomMargin=2770-(pDC->GetDeviceCaps (PHYSICALOFFSETY)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSY); pInfo->m\_rectDraw.left += (int) dLeftOffset; pInfo->m\_rectDraw.top += (int) dTopOffset; pInfo->m\_rectDraw.right = (int) dRightMargin; pInfo->m\_rectDraw.bottom = (int) dBottomMargin;
//...
then to print images... I used the ::StretchDIBits (...) function, and to print text the pDC->TextOut (...) function. But using coordinates like pInfo->m_rectDraw.left + XXX; pInfo->m_rectDraw.top - XXX; and so on. Hope it helps
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
-
You will need to use NON DEVICE DEPENDANT UNITS. I had some problems like that printing with the same mark but different models. I coded it in that way:
void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CMyDoc* pDoc = GetDocument ();
ASSERT_VALID (pDoc);
// Setting printing parameters
pDC->SetMapMode (MM_LOMETRIC);double dLeftOffset=200-(pDC->GetDeviceCaps(PHYSICALOFFSETX)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSX); double dTopOffset=200-(pDC->GetDeviceCaps (PHYSICALOFFSETY)\*254.0)/pDC->GetDeviceCaps (LOGPIXELSY); double dRightMargin=1950-(pDC->GetDeviceCaps (PHYSICALOFFSETX)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSX); double dBottomMargin=2770-(pDC->GetDeviceCaps (PHYSICALOFFSETY)\*254.0)/pDC->GetDeviceCaps(LOGPIXELSY); pInfo->m\_rectDraw.left += (int) dLeftOffset; pInfo->m\_rectDraw.top += (int) dTopOffset; pInfo->m\_rectDraw.right = (int) dRightMargin; pInfo->m\_rectDraw.bottom = (int) dBottomMargin;
//...
then to print images... I used the ::StretchDIBits (...) function, and to print text the pDC->TextOut (...) function. But using coordinates like pInfo->m_rectDraw.left + XXX; pInfo->m_rectDraw.top - XXX; and so on. Hope it helps
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
Thank u for u help.I am facing with another problem in same thing.While printing font changes for different printer.I have created font using: int nHorz = pDC->GetDeviceCaps(LOGPIXELSX); CFont fnTimes; int FontPrinterWeldData = (EUROPEANWELDDATAFONT*nHorz)/PIXPERINCH;//..where //PIXPERINCH=150, //EUROPEANWELDDATAFONT=18 fnTimes.CreateFont(FontPrinterWeldData , 0, 0, 0, FW_NORMAL ,FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_DONTCARE, _T("Courier New")); I can't understand why font change for printer. Thanks & regards,
priyank
-
Thank u for u help.I am facing with another problem in same thing.While printing font changes for different printer.I have created font using: int nHorz = pDC->GetDeviceCaps(LOGPIXELSX); CFont fnTimes; int FontPrinterWeldData = (EUROPEANWELDDATAFONT*nHorz)/PIXPERINCH;//..where //PIXPERINCH=150, //EUROPEANWELDDATAFONT=18 fnTimes.CreateFont(FontPrinterWeldData , 0, 0, 0, FW_NORMAL ,FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, FF_DONTCARE, _T("Courier New")); I can't understand why font change for printer. Thanks & regards,
priyank
I guess it is because not all printers have the same PixelsPerInch, it depends on printers, properties of actuall printing job (optimal, low quality...) and other factors I use the font as follows: CFont fontLabels; fontLabels.CreatePointFont (80, "MS Sans Serif", pDC); CFont fontInfo; fontInfo.CreatePointFont (140, "MS Sans Serif", pDC); From MSDN help: BOOL CreatePointFont( int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL ); This function provides a simple way to create a font of a specified typeface and point size. It automatically converts the height in nPointSize to logical units using the CDC object pointed to by pDC. When you finish with the CFont object created by the CreatePointFont function, first select the font out of the device context, then delete the CFont object. ......... It works good for me. I have tested it with 5 different printers (in high and low quality) and a plotter without problems. I don't want to say it will never have problems, but i think is one of the best options. The fact is to use a standard font that ALWAYS goes with windows like arial, ms sans sherif, times new roman and so on... using CreatePointFont
Greetings. -------- M.D.V. If something has a solution... Why do we have to worry about?. If it has no solution... For what reason do we have to worry about?
-
I am doing printing on two types of printer e.g EPSON StYLUS C82 & HP Deskjet 5700.When printing using HP,i have displayed two Text one after other with some coordinates passed to it.Text are displayed one after other with some GAP.But when i print using EPSON ,Text are displayed one after other with Larger GAP.How this problem could be soved.Example code of this is: pDC->ExtTextOut(XCoOrdinate,YCoOrdinate+LINEGAP_Y,ETO_OPAQUE ,NULL, "Date",NULL); XCoOrdinate+=ParamHeadingRectWidthPrint; pDC->ExtTextOut(XCoOrdinate,YCoOrdinate,ETO_OPAQUE ,NULL, "Time",NULL); Thanks & regards,
priyank
Have you tried a more WYSIWYG approach? Try using the MM_ANISOTROPIC mapping mode as it makes it easier to match your view and print output using the same OnDraw code. Here's a quick sample to plop into a new CScrollView doc/view app to see if the results are consistent on your printers. Keep in mind that it's more important to preserve aspect ratio, keeping everything proportional, and ensuring no drawing code falls outside the printable area. You will find small variances in the metric accuracy on all printers so focus more on the relative placement and you'll suffer less print anxiety. //CDocument members... // Header file .h protected: CSize m_DocSize; // Implementation file .cpp CSize CYourDoc::GetDocSize() const { return m_DocSize; } CYourDoc::CYourDoc() { // TODO: add one-time construction code here m_DocSize=CSize(2000,2800); } //CScrollView members... // Header file .h private: int m_nPage; // Implementation file .cpp CYourView::CYourView() { // TODO: add construction code here SetScrollSizes(MM_TEXT,CSize(0,0)); // Set arbitrary values m_nPage=1; } /*************************************** NOTE: The pInfo parameter is uncommented ****************************************/ void CYourView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* pInfo) { // TODO: add extra initialization before printing pInfo->SetMaxPage(3); } void CYourView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // TODO: Add your specialized code here and/or call the base class m_nPage=pInfo->m_nCurPage; CScrollView::OnPrint(pDC, pInfo); } void CYourView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) { CScrollView::OnPrepareDC(pDC); // TODO: Add your specialized code here and/or call the base class // Set up the DC for the current scale factor int nExtentX; int nExtentY; CSize sizeDoc; CRect rectClient; pDC->SetMapMode(MM_ISOTROPIC); // Get pertinent rectangle data GetClientRect(&rectClient); sizeDoc=GetDocument()->GetDocSize(); sizeDoc.cy=(-sizeDoc.cy); // Y goes down as it increments pDC->SetWindowExt(sizeDoc); // Window extent is size of document // Calculate viewport extent nExtentX=rectClient.Width(); nExtentY=(int)((nExtentX*sizeDoc.cy)/(sizeDoc.cx)); // What kind of device context do we have? if (pDC->IsPrinting()==TRUE) { pDC->SetViewportExt(pDC->GetDeviceCaps(HORZRES),-pDC->GetDeviceCaps(VERTRES)); } else { // Context is for