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

A Win32 class support OpenGL printing

By , 22 Nov 1999
 
  • Download source files - 3 Kb
  • Download demo project - 36 Kb
  • The sample

    The demo

    The sample of the print preview

    The print preview

    The article gives a class, CGLMemoryDC, which can support OpenGL printing under Win95/NT

    CGLMemoryDC stores the DIB data for the printer context device.

    //data of DIB
    private:
    	HBITMAP      m_hBitmap;       //handle of bitmap
    	BITMAPINFO   m_DIBInfo;       //infomation about the DIB
    	BYTE*        m_hImage;        //DIB color data
    	DWORD        m_dwDataSize;    //DIB data size 
    

    CGLMemoryDC also gives the functions to get DIB data from selected context device or set DIB data to target context device

    /********************************************************************/
    /* Scan the image from the device context   					    */
    /********************************************************************/
    void CGLMemoryDC::CopyDataFromDC(CDC* pDC, CRect& rect)
    {
    	CDC      dcBuffer;       //the compatible DC 
    	CBitmap  bmBitmap;		 //bitmap in memory for retreive data from DC
    	CBitmap* pbmBitmapOld;
    
    	//if the orignal bitmap did not set up
    	if(!m_hBitmap)
            return;
    
    	//create compatible DC to copy image
    	dcBuffer.CreateCompatibleDC(pDC);
    
    	//create memory bitmap 
    	bmBitmap.CreateCompatibleBitmap(pDC,
                      m_DIBInfo.bmiHeader.biWidth,
                      m_DIBInfo.bmiHeader.biHeight);
        
    	//set memory bitmap to memory DC
    	pbmBitmapOld = dcBuffer.SelectObject(&bmBitmap);
        
    	//copy source DC image to memory bitmap
    	dcBuffer.StretchBlt(0, 0,  
    			m_DIBInfo.bmiHeader.biWidth,
    			m_DIBInfo.bmiHeader.biHeight,
    			pDC, 
    			rect.left,
    			rect.top,
    			rect.Width(),
    			rect.Height(),
    			SRCCOPY);
    
    	//restore the orginal object in memory DC
        dcBuffer.SelectObject(pbmBitmapOld);
    
    	//copy image data from memory bitmap
    	GetDIBits(pDC->m_hDC,
    		HBITMAP)bmBitmap, 
    		0, 
    		m_DIBInfo.bmiHeader.biHeight,
    		m_hImage,
    		&m_DIBInfo,
    		DIB_RGB_COLORS);
    }
    
    
    /********************************************************************/
    /* Copy image data to target DC             					    */
    /*                                                                  */ 
    /* This function just support the color printer setting in Text     */
    /* mode																*/
    /********************************************************************/
    void CGLMemoryDC::CopyDataToDC(CDC* pDC, CRect& rect)
    {
        ::StretchDIBits(pDC->m_hDC, 
    			rect.left, 
    			rect.top, 
    			rect.Width(), 
    			rect.Height(),
    			0, 0, 
    			m_DIBInfo.bmiHeader.biWidth, 
    			m_DIBInfo.bmiHeader.biHeight,
    			m_hImage,  
    			&m_DIBInfo, 
    			DIB_RGB_COLORS, 
    			SRCCOPY);
    }
    
    
    /********************************************************************/
    /* Write image data directly to target DC                           */
    /*                                                                  */ 
    /* This function just support the color printer setting in Photo    */
    /* quality mode                                                     */
    /********************************************************************/
    void CGLMemoryDC::WriteDataToDC(CDC* pDC, int startx, int starty)
    {
        ::SetDIBitsToDevice(pDC->m_hDC, 
    				startx, 
    				starty,
    				m_DIBInfo.bmiHeader.biWidth,
    				m_DIBInfo.bmiHeader.biHeight,
    				0, 0, 0,
    				m_DIBInfo.bmiHeader.biHeight,
    				m_hImage, 
    				&m_DIBInfo, 
    				DIB_RGB_COLORS);
               			 
    }
    

    The function "WriteDataToDIBfile" in CGLMemoryDC allow to store DIB data to disk file

    The use of CGLMemoryDC in application program to support printing is like

    void CGlprintView::OnDraw(CDC* pDC)
    {
    	CGlprintDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    
    	// TODO: add draw code for native data here
    	//if print
    	if(pDC->IsPrinting())
    	{
    		 //draw the image in memory DC to print DC 
    		 CRect      drawRect;
    		 int        cx, cy;
    		 COLORREF	clrOld = pDC->SetTextColor(RGB(250, 10, 10));
    		 pDC->TextOut(450,10, "This is a demo of OpenGL print provided by Zhaohui Xing");
    		 pDC->SetTextColor(RGB(128, 128, 255));
    		 pDC->TextOut(40,80, "Large Size");
    		 drawRect.SetRect(40, 160, 2440, 1960);
    		 pDC->DPtoLP(&drawRect);
    		 m_MemImageDC.CopyDataToDC(pDC, drawRect);
    		 pDC->TextOut(40,1960, "Medium Size");
    		 drawRect.SetRect(500, 2040, 2100, 3240);
    		 pDC->DPtoLP(&drawRect);
    		 m_MemImageDC.CopyDataToDC(pDC, drawRect);
    		 pDC->TextOut(40,3260, "Orignal Size");
    		 m_MemImageDC.GetMemorySize(&cx, &cy);
    		 drawRect.SetRect(1000, 3400, 1000 + cx , 3400 + cy);
    		 pDC->DPtoLP(&drawRect);
    		 m_MemImageDC.CopyDataToDC(pDC, drawRect);
    		 pDC->SetTextColor(clrOld);
    	}
    	else //draw opnGL in current DC
    	{
    		 CPalette* oldPalette;
    
    		 //Set logic palette
    		 oldPalette = m_pDC->SelectPalette(&m_Palette, FALSE);
    		 m_pDC->RealizePalette();
    	
    		 //draw openGL object
    		 wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
    		 DrawObject();
    		 SwapBuffers(m_pDC->GetSafeHdc());
    		 wglMakeCurrent(m_pDC->GetSafeHdc(), NULL);
    		 
    		 //Prepare the memory DC 
    		 CRect rect;
    		 GetClientRect(&rect);
    		 m_MemImageDC.SetMemorySize(rect.Width(), rect.Height());
    		 //copy the image data in current DC to memory
    		 m_MemImageDC.CopyDataFromDC(m_pDC, rect);
    
    		 m_pDC->SelectPalette(oldPalette, FALSE);
    	}	     
    }
    

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here

    About the Author

    Zhaohui Xing
    United States United States
    Member
    No Biography provided

    Sign Up to vote   Poor Excellent
    Add a reason or comment to your vote: x
    Votes of 3 or less require a comment

    Comments and Discussions

     
    Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
    You must Sign In to use this message board.
    Search this forum  
        Spacing  Noise  Layout  Per page   
    GeneralThank you, but...sussMarcello1 Apr '00 - 23:41 

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

    Permalink | Advertise | Privacy | Mobile
    Web02 | 2.6.130516.1 | Last Updated 23 Nov 1999
    Article Copyright 1999 by Zhaohui Xing
    Everything else Copyright © CodeProject, 1999-2013
    Terms of Use
    Layout: fixed | fluid