A Win32 class support OpenGL printing






4.14/5 (8 votes)
Nov 23, 1999

97395

3109
- Download source files - 3 Kb
- Download demo project - 36 Kb <!-- Article Starts -->
The sample
The sample of 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.