glprintView.cpp
上传用户:donsun
上传日期:2022-08-10
资源大小:36k
文件大小:13k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // glprintView.cpp : implementation of the CGlprintView class
  2. //
  3. #include "stdafx.h"
  4. #include "glprint.h"
  5. #include "glprintDoc.h"
  6. #include "glprintView.h"
  7. #include <glglaux.h>
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CGlprintView
  15. IMPLEMENT_DYNCREATE(CGlprintView, CView)
  16. BEGIN_MESSAGE_MAP(CGlprintView, CView)
  17. //{{AFX_MSG_MAP(CGlprintView)
  18. ON_WM_CREATE()
  19. ON_WM_DESTROY()
  20. ON_WM_SIZE()
  21. ON_COMMAND(ID_FILE_SAVE, OnFileSave)
  22. ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
  23. //}}AFX_MSG_MAP
  24. // Standard printing commands
  25. ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
  26. ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
  27. ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CGlprintView construction/destruction
  31. CGlprintView::CGlprintView()
  32. {
  33. // TODO: add construction code here
  34. }
  35. CGlprintView::~CGlprintView()
  36. {
  37. }
  38. BOOL CGlprintView::PreCreateWindow(CREATESTRUCT& cs)
  39. {
  40. // TODO: Modify the Window class or styles here by modifying
  41. //  the CREATESTRUCT cs
  42. return CView::PreCreateWindow(cs);
  43. }
  44. /////////////////////////////////////////////////////////////////////////////
  45. // CGlprintView drawing
  46. void CGlprintView::OnDraw(CDC* pDC)
  47. {
  48. CGlprintDoc* pDoc = GetDocument();
  49. ASSERT_VALID(pDoc);
  50. // TODO: add draw code for native data here
  51. //if print
  52. if(pDC->IsPrinting())
  53. {
  54.  //draw the image in memory DC to print DC 
  55.  CRect      drawRect;
  56.  int        cx, cy;
  57.  COLORREF clrOld = pDC->SetTextColor(RGB(250, 10, 10));
  58.  pDC->TextOut(450,10, "This is a demo of OpenGL print provided by Zhaohui Xing");
  59.  pDC->SetTextColor(RGB(128, 128, 255));
  60.  pDC->TextOut(40,80, "Large Size");
  61.  drawRect.SetRect(40, 160, 2440, 1960);
  62.          pDC->DPtoLP(&drawRect);
  63.  m_MemImageDC.CopyDataToDC(pDC, drawRect);
  64.  pDC->TextOut(40,1960, "Medium Size");
  65.  drawRect.SetRect(500, 2040, 2100, 3240);
  66.          pDC->DPtoLP(&drawRect);
  67.  m_MemImageDC.CopyDataToDC(pDC, drawRect);
  68.  pDC->TextOut(40,3260, "Orignal Size");
  69.  m_MemImageDC.GetMemorySize(&cx, &cy);
  70.  drawRect.SetRect(1000, 3400, 1000 + cx , 3400 + cy);
  71.          pDC->DPtoLP(&drawRect);
  72.  m_MemImageDC.CopyDataToDC(pDC, drawRect);
  73.  pDC->SetTextColor(clrOld);
  74. }
  75. else //draw opnGL in current DC
  76. {
  77.      CPalette* oldPalette;
  78.          //Set logic palette
  79.      oldPalette = m_pDC->SelectPalette(&m_Palette, FALSE);
  80.      m_pDC->RealizePalette();
  81.  //draw openGL object
  82.      wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
  83.      DrawObject();
  84.      SwapBuffers(m_pDC->GetSafeHdc());
  85.          wglMakeCurrent(m_pDC->GetSafeHdc(), NULL);
  86.  
  87.     //Prepare the memory DC 
  88.  CRect rect;
  89.  GetClientRect(&rect);
  90.      m_MemImageDC.SetMemorySize(rect.Width(), rect.Height());
  91.  //copy the image data in current DC to memory
  92.  m_MemImageDC.CopyDataFromDC(m_pDC, rect);
  93.      m_pDC->SelectPalette(oldPalette, FALSE);
  94. }      
  95. }
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CGlprintView printing
  98. BOOL CGlprintView::OnPreparePrinting(CPrintInfo* pInfo)
  99. {
  100. // default preparation
  101. return DoPreparePrinting(pInfo);
  102. }
  103. void CGlprintView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  104. {
  105. // TODO: add extra initialization before printing
  106. }
  107. void CGlprintView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  108. {
  109. // TODO: add cleanup after printing
  110. }
  111. /////////////////////////////////////////////////////////////////////////////
  112. // CGlprintView diagnostics
  113. #ifdef _DEBUG
  114. void CGlprintView::AssertValid() const
  115. {
  116. CView::AssertValid();
  117. }
  118. void CGlprintView::Dump(CDumpContext& dc) const
  119. {
  120. CView::Dump(dc);
  121. }
  122. CGlprintDoc* CGlprintView::GetDocument() // non-debug version is inline
  123. {
  124. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGlprintDoc)));
  125. return (CGlprintDoc*)m_pDocument;
  126. }
  127. #endif //_DEBUG
  128. /////////////////////////////////////////////////////////////////////////////
  129. // CGlprintView message handlers
  130. /********************************************************************/
  131. /* Set up the OpenGL display environment                      */
  132. /********************************************************************/
  133. int CGlprintView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  134. {
  135. if (CView::OnCreate(lpCreateStruct) == -1)
  136. return -1;
  137. // TODO: Add your specialized creation code here
  138. PIXELFORMATDESCRIPTOR pfd =
  139. {
  140. sizeof(PIXELFORMATDESCRIPTOR),
  141. 1,
  142. PFD_DRAW_TO_WINDOW|
  143. PFD_SUPPORT_OPENGL|
  144. PFD_DOUBLEBUFFER,  
  145. PFD_TYPE_RGBA,
  146. 24,
  147. 0,0,0,0,0,0,
  148.         0,0,0,0,0,0,0,
  149. 32,
  150. 0,0,
  151. PFD_MAIN_PLANE,
  152. 0,
  153. 0,0,0
  154. };
  155.      
  156.     m_pDC = new CClientDC(this);
  157. int pixelFormat =
  158. ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
  159. BOOL success = 
  160. SetPixelFormat(m_pDC->GetSafeHdc(), pixelFormat, &pfd);
  161. DescribePixelFormat(m_pDC->GetSafeHdc(), pixelFormat,
  162.   sizeof(pfd), &pfd);
  163. if(pfd.dwFlags & PFD_NEED_PALETTE)
  164.          SetPalette();
  165. m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
  166. wglMakeCurrent(m_pDC->m_hDC,m_hRC);
  167. Initialize();
  168. wglMakeCurrent(NULL,NULL);
  169. return 0;
  170. }
  171. /********************************************************************/
  172. /* Celan all memory allocated to OpenGL resource                */
  173. /********************************************************************/
  174. void CGlprintView::OnDestroy() 
  175. {
  176. CView::OnDestroy();
  177. // TODO: Add your message handler code here
  178. wglDeleteContext(m_hRC);
  179.     m_Palette.DeleteObject();
  180. ReleaseDC(m_pDC);
  181. }
  182. /********************************************************************/
  183. /* If the window size change, adjust the view point for the correct */
  184. /* OpenGL diplay                                                    */
  185. /********************************************************************/
  186. void CGlprintView::OnSize(UINT nType, int cx, int cy) 
  187. {
  188. CView::OnSize(nType, cx, cy);
  189. // TODO: Add your message handler code here
  190.     CClientDC clientDC(this);
  191. wglMakeCurrent(clientDC.m_hDC, m_hRC);
  192. glMatrixMode(GL_PROJECTION);
  193. glLoadIdentity();
  194. glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 7.0);
  195. glViewport(0, 0, cx, cy);
  196. wglMakeCurrent(NULL, NULL);
  197. }
  198. /********************************************************************/
  199. /* Set up the palette for OpenGL display DC                         */
  200. /********************************************************************/
  201. void CGlprintView::SetPalette(void)
  202. {
  203. PIXELFORMATDESCRIPTOR pfd;  // Pixel Format Descriptor         
  204. LOGPALETTE *pPal; // Pointer to memory for logical palette
  205. int PixelFormat; // Pixel format index
  206.     int paletteSize;            // Number of entries in palette 
  207. BYTE RedMask;               // Range for each color entry (7,7,and 3)
  208. BYTE GreenMask;
  209. BYTE BlueMask;
  210.     HDC hDC = GetDC()->GetSafeHdc();  //the context device 
  211. // Get the pixel format index and retrieve the pixel format description
  212.     PixelFormat = GetPixelFormat(hDC);
  213.     DescribePixelFormat(hDC, PixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  214.     
  215. // Check whether the pixel format and the pixel type
  216. if (!(pfd.dwFlags & PFD_NEED_PALETTE ||
  217.   pfd.iPixelType == PFD_TYPE_COLORINDEX))
  218.     return;
  219. // Get the number of entries in palette. 256 colors for 8 bits 
  220.     paletteSize = 1 << pfd.cColorBits;
  221.     
  222. // Allocate for the logical palette
  223. pPal = (LOGPALETTE*)
  224. malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY));
  225.     
  226. // Fill the logical palette header information 
  227. pPal->palVersion = 0x300;            //support Windows3.0
  228.     pPal->palNumEntries = paletteSize;   //number of colors entries
  229.     // Set the 1st entries of logical palette with the current system palette 
  230.     (void) GetSystemPaletteEntries(hDC, 0, paletteSize, &pPal->palPalEntry[0]);
  231. //Set the RGB mask
  232. RedMask = (1 << pfd.cRedBits) - 1;
  233. GreenMask = (1 << pfd.cGreenBits) - 1;
  234. BlueMask = (1 << pfd.cBlueBits) - 1;
  235. //Set all entries of the logical palette 
  236.     for (int i=0; i<paletteSize; ++i) 
  237. {
  238.     pPal->palPalEntry[i].peRed =
  239.     (((i >> pfd.cRedShift) & RedMask) * 255) / RedMask;
  240.     pPal->palPalEntry[i].peGreen =
  241.     (((i >> pfd.cGreenShift) & GreenMask) * 255) / GreenMask;
  242.     pPal->palPalEntry[i].peBlue =
  243.     (((i >> pfd.cBlueShift) & BlueMask) * 255) / BlueMask;
  244.     pPal->palPalEntry[i].peFlags = 0;
  245.     }
  246. //Create the palette
  247.     m_Palette.CreatePalette(pPal);
  248. //Free the memory allocated for the logical palette 
  249.     free(pPal);
  250. }
  251. /********************************************************************/
  252. /* Initialize the light setting                                   */
  253. /********************************************************************/
  254. void CGlprintView::Initialize(void)
  255. {
  256. float fv[4];
  257. fv[0] = 0.3f;
  258. fv[1] = 0.3f;
  259. fv[2] = 0.3f;
  260. fv[3] = 1.0f;
  261. glLightfv(GL_LIGHT0, GL_AMBIENT, fv);//set light ambient
  262. fv[0] = 0.1f;
  263. fv[1] = 0.1f;
  264. fv[2] = 0.1f;
  265. fv[3] = 1.0f;
  266. glLightfv(GL_LIGHT0, GL_DIFFUSE, fv);//set light specular
  267. fv[0] = 0.3f;
  268. fv[1] = 0.3f;
  269. fv[2] = 0.1f;
  270. fv[3] = 1.0f;
  271. glLightfv(GL_LIGHT0, GL_SPECULAR, fv);//set light specular
  272. fv[0] = 100.0f;
  273. fv[1] = 0.0f;
  274. fv[2] = 0.0f;
  275. fv[3] = 0.0f;
  276. glLightfv(GL_LIGHT0, GL_POSITION, fv);//set light position
  277. glEnable(GL_LIGHTING);
  278.     glEnable(GL_LIGHT0);
  279. }
  280. /********************************************************************/
  281. /* Display the OpenGL object                                      */
  282. /********************************************************************/
  283. void CGlprintView::DrawObject(void)
  284. {
  285. float fv[4];
  286. float shine;
  287. glShadeModel(GL_SMOOTH);
  288. glEnable(GL_DEPTH_TEST);
  289. //clear color buffer
  290. glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  291. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  292.     glMatrixMode(GL_MODELVIEW);
  293.     glLoadIdentity();
  294. glPushMatrix();
  295. shine = 0.3f;
  296. glMaterialf(GL_FRONT, GL_SHININESS, shine);//set specular
  297. fv[0] = 0.4f;
  298. fv[1] = 0.4f;
  299. fv[2] = 0.4f;
  300. fv[3] = 0.1f;
  301. glMaterialfv(GL_FRONT, GL_SPECULAR, fv);//set specular
  302. glMaterialfv(GL_FRONT, GL_EMISSION, fv);//set specular
  303. //draw the wireframe sphere
  304. fv[0] = 0.0f;
  305. fv[1] = 0.0f;
  306. fv[2] = 0.4f;
  307. fv[3] = 1.0f;
  308. glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, fv);//set material
  309. glTranslatef(0.0f, 0.0f, -6.0f);
  310.     glRotated(45, 1.0, 0.0, 0.0);     
  311.     glRotated(-30, 0.0, 1.0, 0.0);     
  312.     glRotated(60, 0.0, 0.0, 1.0);     
  313.     auxWireSphere(1.0);
  314. //draw the solid cylinder
  315. fv[0] = 0.1f;
  316. fv[1] = 0.4f;
  317. fv[2] = 0.1f;
  318. fv[3] = 10.0f;
  319. glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, fv);//set material
  320. glTranslatef(0.0f, 0.5f, 0.0f);
  321. auxSolidCylinder(0.1, 3.0);
  322. glTranslatef(0.0f, -0.5f, 0.0f);
  323. //draw the solid arrow
  324. fv[0] = 0.9f;
  325. fv[1] = 0.1f;
  326. fv[2] = 0.1f;
  327. fv[3] = 10.2f;
  328. glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, fv);//set material
  329. glTranslatef(0.0f, 1.5f, 0.0f);
  330.     glRotated(-90, 1.0, 0.0, 0.0);     
  331.     auxSolidCone(0.4, 0.8);
  332.     glRotated(90, 1.0, 0.0, 0.0);     
  333. glTranslatef(0.0f, -1.5f, 0.0f);
  334.     glRotated(-60, 0.0, 0.0, 1.0);     
  335.     glRotated(30, 0.0, 1.0, 0.0);     
  336.     glRotated(-45, 1.0, 0.0, 0.0);     
  337. glTranslatef(0.0f, 0.0f, 6.0f);
  338.    
  339. glPopMatrix();
  340. glFlush();
  341. }
  342. /********************************************************************/
  343. /* Save current OpenGL image to DIB file                                      */
  344. /********************************************************************/
  345. void CGlprintView::OnFileSave() 
  346. {
  347. // TODO: Add your command handler code here
  348. //Set up file dialog setting
  349. char FileString[] = "DIB File(*.bmp)*.bmp";
  350. CFileDialog dlg(FALSE,NULL,NULL,OFN_CREATEPROMPT|OFN_OVERWRITEPROMPT,NULL,NULL);
  351. dlg.m_ofn.lpstrFilter = (LPSTR)FileString;
  352.     dlg.m_ofn.lpstrTitle = "Save DIB File";
  353. if(dlg.DoModal()==IDOK)
  354. {
  355. //Get file name
  356. CString filename = dlg.GetFileTitle();
  357. filename += ".";
  358. CString fileext;
  359. fileext = dlg.GetFileExt(); 
  360. if(fileext.IsEmpty())
  361. filename += "bmp";
  362. else
  363. filename += fileext;
  364. //Write image data to disk file
  365. CFile file;
  366. CFileException fileexc;
  367. file.Open(filename,CFile::modeCreate|CFile::modeWrite,&fileexc);
  368. m_MemImageDC.WriteDataToDIBfile(&file);
  369. file.Close();
  370. }
  371. }
  372. /********************************************************************/
  373. /* Save current OpenGL image to DIB file                                      */
  374. /********************************************************************/
  375. void CGlprintView::OnFileSaveAs() 
  376. {
  377. // TODO: Add your command handler code here
  378. OnFileSave();
  379. }