CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 3 of 3

Threaded View

  1. #1
    Join Date
    Jun 2007

    CRichEditCtrl Version 2.0


    I am trying to print the content of the CRichEditCtrl v 2.0. The problem is that when I want to use pagination (with A4 pages), the printed text (which is just 4 sample line with 40 chars at most) at the code lTextPrinted =FormatRange(&fr,TRUE);
    is always lesser than the actual text pointed by the lTextLength variable making the loop run for ever. Please notice that using the RichEditControl Version 1 it works fine.

    Check the code. I am attaching also the full source code at

    	CPrintDialog printDialog(false);
    	if (bShowPrintDialog)
    		int r = printDialog.DoModal();
    		if (r == IDCANCEL)
    			return; // User pressed cancel, don't print.
    	HDC hPrinterDC = printDialog.GetPrinterDC();
    	CDC pMyPrinterDC; 
    	// This code basically taken from MS KB article Q129860 
    	  int	  nHorizRes = GetDeviceCaps(hPrinterDC, HORZRES);
    	  int	  nVertRes = GetDeviceCaps(hPrinterDC, VERTRES);
          int     nLogPixelsX = GetDeviceCaps(hPrinterDC, LOGPIXELSX);
    	  int     nLogPixelsY = GetDeviceCaps(hPrinterDC, LOGPIXELSY);
    	  LONG	  lTextLength;   // Length of document.
    	  LONG	  lTextPrinted;  // Amount of document printed.
    	 // Ensure the printer DC is in MM_TEXT mode.
    	  SetMapMode ( hPrinterDC, MM_TEXT );
    	 // Rendering to the same DC we are measuring.
    	  //ZeroMemory(&fr, sizeof(fr));
    	  fr.hdc = pMyPrinterDC.m_hDC;
    	  fr.hdcTarget = pMyPrinterDC.m_hDC;
    	  // Get the page width and height from the printer.
    	  long lPageWidth =  ::MulDiv(pMyPrinterDC.GetDeviceCaps(PHYSICALWIDTH), 1440, pMyPrinterDC.GetDeviceCaps(LOGPIXELSX));
    	  long lPageHeight = ::MulDiv(pMyPrinterDC.GetDeviceCaps(PHYSICALHEIGHT), 1440, pMyPrinterDC.GetDeviceCaps(LOGPIXELSY));
    	  CRect rcPage(0, 0, lPageWidth, lPageHeight);
    	  fr.rc = rcPage;
    	  fr.rcPage = rcPage;
    	 // Default the range of text to print as the entire document.
    	  fr.chrg.cpMin = 0;
    	  fr.chrg.cpMax = -1;
    	 // Set up the print job (standard printing stuff here).
    	  DOCINFO di;
    	  ZeroMemory(&di, sizeof(di));
    	  di.cbSize = sizeof(DOCINFO);
    	  di.lpszDocName = "GnosisExplorerNotes";
    	  // Do not print to file.
    	  di.lpszOutput = NULL;
    	// Update the display with the new formatting.
    	  RECT rcClient;
    	 // Start the document.
    	  StartDoc(hPrinterDC, &di);
    	 // Find out real size of document in characters.
    	 lTextLength = GetTextLength();//SendMessage ( /*hRTFWnd,*/ WM_GETTEXTLENGTH, 0, 0 );
    	 //lTextLength = ::SendMessage (this->m_hWnd, WM_GETTEXTLENGTH, 0, 0); 
    	 do {
    	     // Start the page.
    	    // Print as much text as can fit on a page. The return value is
    	     // the index of the first character on the next page. Using TRUE
    	     // for the wParam parameter causes the text to be printed.
    		//lTextPrinted = ::SendMessage (this->m_hWnd, EM_FORMATRANGE, FALSE, (LPARAM)&fr); 	    
    		lTextPrinted =FormatRange(&fr,TRUE);
    		DisplayBand(&fr.rc );
    	    // Print last page.
    	    // If there is more text to print, adjust the range of characters
    	     // to start printing at the first character of the next page.
    		if (lTextPrinted < lTextLength)	{
    			fr.chrg.cpMin = lTextPrinted;
    			fr.chrg.cpMax = -1;
    	  } while (lTextPrinted < lTextLength);
    	 // Tell the control to release cached information.
    	 //SendMessage( EM_FORMATRANGE, 0, (LPARAM)NULL);
    	 EndDoc (hPrinterDC);
    Last edited by Marc G; October 9th, 2012 at 01:58 AM. Reason: Added code tags

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts

Windows Mobile Development Center

Click Here to Expand Forum to Full Width

On-Demand Webinars (sponsored)

By using this site, you agree to the Privacy Policy