Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Printing Problem

Printing Problem

Scheduled Pinned Locked Moved C / C++ / MFC
helptutorial
5 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    pri_skit
    wrote on last edited by
    #1

    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

    N B 2 Replies Last reply
    0
    • P pri_skit

      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

      N Offline
      N Offline
      Nelek
      wrote on last edited by
      #2

      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?

      P 1 Reply Last reply
      0
      • N Nelek

        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?

        P Offline
        P Offline
        pri_skit
        wrote on last edited by
        #3

        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

        N 1 Reply Last reply
        0
        • P pri_skit

          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

          N Offline
          N Offline
          Nelek
          wrote on last edited by
          #4

          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?

          1 Reply Last reply
          0
          • P pri_skit

            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

            B Offline
            B Offline
            bob16972
            wrote on last edited by
            #5

            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

            1 Reply Last reply
            0
            Reply
            • Reply as topic
            Log in to reply
            • Oldest to Newest
            • Newest to Oldest
            • Most Votes


            • Login

            • Don't have an account? Register

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • World
            • Users
            • Groups