77范文网 - 专业文章范例文档资料分享平台

在MFC中打印OpenGL

来源:网络收集 时间:2018-12-08 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

在MFC中打印OpenGL

我在很多杂志上看到了OpenGL视的实现,但没有一个是介绍如何打印OpenGL的。

于是,我猜想你巳经有一个实现了的OpenGL视类,但你不能实现打印。

classCOpenGLView : public CView { ... protected: CDC *m_pDC; HGLRC m_hRC; ... };

在你的OnCreate函数中,你将创建下面这些:

intCOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate (lpCreateStruct) == -1) return (-1); m_pDC = new CClientDC (this); if (m_pDC == NULL) return (-1); // Set the DC's pixel format... if (!SetDCPixelFormat (m_pDC)) return (-1); m_hRC = wglCreateContext (m_pDC->GetSafeHdc ()); if (!wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)) return (-1); glClearColor (1.0f, 1.0f, 1.0f, 1.0f); glClearDepth (1.0); return (0); }

注意:在这里我调用了wglMakeCurrent ()函数。有些作者在OnDraw()函数的开始调用这个

函数,那可能是因为它们的代码没有它就不工作。 wglMakeCurrent ()函数在当前的OpenGL

窗口创建了一个指定的窗口实例。在一个MDI程序中,带来两个文档的打开,在绘制它们进入

之前,你需要确认每个视实例创建在它们自己的当前窗口。

因而,在OnCreate()函数中调用wglMakeCurrent ()函数是不够的 -- 另外在第二个视被创

建之后,在第一个视中的所有OpenGL调用将在第二个视中被得到实施。

许多作者在他们的视的OnDraw()函数开始部分调用wglMakeCurrent ()

-- 抵住这种诱惑!这是(粗略)我的OpenGL打印函数COpenGLView::OnPrint():

voidCOpenGLView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { // Let's not worry for now about print preview... if (pInfo->m_bPreview) return; // or print a message to preview window... UINT CurPage = pInfo->m_nCurPage; GLsizeiHRes = pDC->GetDeviceCaps(HORZRES); GLsizeiVRes = pDC->GetDeviceCaps(VERTRES); GLsizeiHPixelsPerInch = pDC->GetDeviceCaps(LOGPIXELSX); GLsizeiVPixelsPerInch = pDC->GetDeviceCaps(LOGPIXELSY); pDC->SetMapMode (MM_TEXT); // m_LMargin, etc are margins, in inches... GLint l = (GLint) (m_LMargin*HPixelsPerInch); GLint r = (GLint) (m_RMargin*HPixelsPerInch); GLint t = (GLint) (m_TMargin*VPixelsPerInch); GLint b = (GLint) (m_BMargin*VPixelsPerInch); // Image width and height... GLsizei w = HRes - l - r; GLsizei h = VRes - t - b; // Probably don't need this... intSavedDC = pDC->SaveDC (); if (CurPage == 1) { // Save the current OpenGL settings... HDC hDCOld = wglGetCurrentDC (); HGLRC hGLRCOld = wglGetCurrentContext (); // Make the printer the current // OpenGL rendering device... HGLRC hGLRCPrinter = wglCreateContext (pDC->GetSafeHdc ()); BOOL bRet = wglMakeCurrent (pDC->GetSafeHdc (), hGLRCPrinter); ASSERT (bRet); glClearColor (1.0f, 1.0f, 1.0f, 1.0f); glClearDepth (1.0); // This makes a square image... if (w < h) h = w; if (h < w) w = h; // This centers the images... l = (HRes - w)/2;

b = (VRes - h)/2; // glViewport(l, b, w, h); OnDraw (pDC); // Go back to the saved OpenGL settings... wglMakeCurrent (hDCOld, hGLRCOld); wglDeleteContext(hGLRCPrinter); } // Probably don't need this... if (SavedDC != 0) pDC->RestoreDC (SavedDC); }

注意:OnPrint ()函数调用OnDraw ()函数。如果在OnDraw ()函数中你调用了wglMakeCurrent

(),你将不再被打印...你应该重绘这个视!它应当也被注明,在OnBeginPrinting ()

和OnEndPrinting ()函数中能够做到设置和存储当前的OpenGL设备。为了简单起见,在这里我

巳经放置了所有代码。

于是,现在打印OpenGL是简单的。让我们加到绘制...

为了确售你绘制到了正确的窗口,你需要调用wglMakeCurrent从SOMEWHERE OTHER THAN OnDraw

()。 But where? 侯选的是OnActivateView () 与 OnUpdate ()函数。 我通常重载两这个函数: OnActivateView ()

和 OnUpdate (),并且在两个函数中我调用 wglMakeCurrent ()。在OnUpdate ()函数, 我保存和恢复当前设置在函数的开始和结束(就象在 OnPrint ())。在OnActivateView ()函数中这不是必须的。

voidCOpenGLView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { CView::OnActivateView(bActivate, pActivateView, pDeactiveView); if (bActivate) { wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC); } }

voidCOpenGLView::OnUpdate (CView* pSender, LPARAM lHint, CObject* pHint) { // Save the current OpenGL settings... HDC hDCOld = wglGetCurrentDC (); HGLRC hGLRCOld = wglGetCurrentContext (); // Make this view the current OpenGL rendering context... BOOL bRet = wglMakeCurrent (m_pDC, m_hRC);

// Draw!!! OnDraw (m_pDC); // Go back to the saved OpenGL settings... wglMakeCurrent (hDCOld, hGLRCOld); wglDeleteContext(hGLRCPrinter); }

注:在OnUpdate函数中要返回预先设置。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库在MFC中打印OpenGL在线全文阅读。

在MFC中打印OpenGL.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/352413.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: