OpenGL问题? 用一个无模式对话框显示opengl图形,关闭对话框后(程序未关闭),再打开一次对话框就不能显示了?同时打开多个对话框也只是第一个能显示,怎么解决? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 // Draw.cpp : implementation file//#include "stdafx.h"#include "Nurbs.h"#include "Draw.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CDraw dialogCDraw::CDraw(CWnd* pParent /*=NULL*/) : CDialog(CDraw::IDD, pParent){ //{{AFX_DATA_INIT(CDraw) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT}void CDraw::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDraw) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CDraw, CDialog) //{{AFX_MSG_MAP(CDraw) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_PAINT() //}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CDraw message handlersint CDraw::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; PIXELFORMATDESCRIPTOR pixelDesc = { sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小 1, // 版本号 PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图 PFD_SUPPORT_OPENGL | // 支持 OpenGL PFD_DOUBLEBUFFER, // 双缓存模式 PFD_TYPE_RGBA, // RGBA 颜色模式 24, // 24 位颜色深度 0, 0, 0, 0, 0, 0, // 忽略颜色位 0, // 没有非透明度缓存 0, // 忽略移位位 0, // 无累加缓存 0, 0, 0, 0, // 忽略累加位 32, // 32 位深度缓存 0, // 无模板缓存 0, // 无辅助缓存 PFD_MAIN_PLANE, // 主层 0, // 保留 0, 0, 0 // 忽略层,可见性和损毁掩模 }; HDC hDC = ::GetDC(GetSafeHwnd()); m_GLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc); //选择像素格式 SetPixelFormat(hDC, m_GLPixelIndex, &pixelDesc); //设置像素格式 m_hGLContext = wglCreateContext(hDC); return 0;}void CDraw::OnDestroy() { if(wglGetCurrentContext() != NULL) wglMakeCurrent(NULL,NULL); if(m_hGLContext != NULL) { wglDeleteContext(m_hGLContext); m_hGLContext = NULL; } CDialog::OnDestroy(); delete this;}void CDraw::OnPaint() { CPaintDC dc(this); HDC hDC = ::GetDC(GetSafeHwnd()); wglMakeCurrent(hDC,m_hGLContext); //以下为绘图代码 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.2f, 0.6f, 1.0f); auxWireSphere(0.5); ::SwapBuffers(hDC); }在CNurbsView.CPP中有以后调用:void CNurbsView::OnNurbsDraw() { CDraw* pDraw = new CDraw(); pDraw->Create(IDD_DRAW,NULL); pDraw->ShowWindow(SW_SHOW);} HDC hDC = ::GetDC(GetSafeHwnd());凭直觉是这里有问题。因为除了你第一个窗口能绘制之外,其他的窗口都不能绘制。尤其是同时开多个窗口的时候。获取DC可以有多种途径的,试试其他方法。//以下为绘图代码 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.2f, 0.6f, 1.0f); auxWireSphere(0.5); ::SwapBuffers(hDC);还有这段,你用标准的GL库函数试试 void CDraw::OnPaint() { CPaintDC dc(this); // 其实这里不需要再取得环境句柄,用dc可以达到同样的效果 //HDC hDC = ::GetDC(GetSafeHwnd()); ...} 请教一个问题:电脑服务器与GPRS终端用TCP连接,GPRS终端用移动的卡。GPRS终端在有信号的情况下,会不会出现丢帧现象? 求助:各位大哥,俩帮我看看这几个 com 问题,好吗?谢谢! 关于VC调用QB编写的EXE文件,如何实现呢? 就剩这10分了,请问哪位有主页空间可借用? 关于directshow支持的摄像头问题,多谢!急 如何截获本机通过modem收到的Tcp数据包? 有关msn的菜鸟问题 90分送出解决 内存没有泄露,但是程序结束的时候,有警告的问题 端口问题 求看下这一般是什么引起的 怎样将接口信息写入dll(exe)接口程序中 大家讨论一下,UDP使用完成端口是否有意义?
//#include "stdafx.h"
#include "Nurbs.h"
#include "Draw.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CDraw dialog
CDraw::CDraw(CWnd* pParent /*=NULL*/)
: CDialog(CDraw::IDD, pParent)
{
//{{AFX_DATA_INIT(CDraw)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDraw::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDraw)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDraw, CDialog)
//{{AFX_MSG_MAP(CDraw)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CDraw message handlersint CDraw::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
PIXELFORMATDESCRIPTOR pixelDesc = {
sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
1, // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER, // 双缓存模式
PFD_TYPE_RGBA, // RGBA 颜色模式
24, // 24 位颜色深度
0, 0, 0, 0, 0, 0, // 忽略颜色位
0, // 没有非透明度缓存
0, // 忽略移位位
0, // 无累加缓存
0, 0, 0, 0, // 忽略累加位
32, // 32 位深度缓存
0, // 无模板缓存
0, // 无辅助缓存
PFD_MAIN_PLANE, // 主层
0, // 保留
0, 0, 0 // 忽略层,可见性和损毁掩模
}; HDC hDC = ::GetDC(GetSafeHwnd()); m_GLPixelIndex = ChoosePixelFormat(hDC, &pixelDesc); //选择像素格式
SetPixelFormat(hDC, m_GLPixelIndex, &pixelDesc); //设置像素格式 m_hGLContext = wglCreateContext(hDC);
return 0;
}void CDraw::OnDestroy()
{
if(wglGetCurrentContext() != NULL)
wglMakeCurrent(NULL,NULL); if(m_hGLContext != NULL)
{
wglDeleteContext(m_hGLContext);
m_hGLContext = NULL;
}
CDialog::OnDestroy();
delete this;
}void CDraw::OnPaint()
{
CPaintDC dc(this); HDC hDC = ::GetDC(GetSafeHwnd());
wglMakeCurrent(hDC,m_hGLContext); //以下为绘图代码 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.2f, 0.6f, 1.0f);
auxWireSphere(0.5);
::SwapBuffers(hDC); }在CNurbsView.CPP中有以后调用:void CNurbsView::OnNurbsDraw()
{
CDraw* pDraw = new CDraw();
pDraw->Create(IDD_DRAW,NULL);
pDraw->ShowWindow(SW_SHOW);
}
凭直觉是这里有问题。因为除了你第一个窗口能绘制之外,其他的窗口都不能绘制。
尤其是同时开多个窗口的时候。
获取DC可以有多种途径的,试试其他方法。//以下为绘图代码 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.2f, 0.6f, 1.0f);
auxWireSphere(0.5);
::SwapBuffers(hDC);还有这段,你用标准的GL库函数试试
{
CPaintDC dc(this); // 其实这里不需要再取得环境句柄,用dc可以达到同样的效果
//HDC hDC = ::GetDC(GetSafeHwnd());
...
}