为什么我用OpenGL画的图形显示不出来?

sujinzhao407 2004-05-02 10:17:32
我在MFC下用OpenGL画了一条直线,但是不知道为什么显示不出来?请教高手!其中,View.cpp里的代码如下:
void CLineView::OnDraw(CDC* pDC)
{
CLineDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

RenderScene();
}

// CLineView message handlers
BOOL CLineView::InitializeOpenGL(CDC* pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}

BOOL CLineView::RenderScene()
{
glClearColor(0.0,0.0,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINES);
glColor3f (1.0, 0.0, 0.0);
glVertex2i(10,20);
glVertex2i(100,200);
glEnd();
glFlush();

::SwapBuffers(m_pDC->GetSafeHdc()); //交互缓冲区
return TRUE;
}

//////////////////////////////////////////////////////////////////////
// 设置逻辑调色板
//////////////////////////////////////////////////////////////////////
void CLineView::SetLogicalPalette(void)
{
struct
{
WORD Version;
WORD NumberOfEntries;
PALETTEENTRY aEntries[256];
} logicalPalette = { 0x300, 256 };

BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
BYTE blues[] = {0, 85, 170, 255};

for (int colorNum=0; colorNum<256; ++colorNum)
{
logicalPalette.aEntries[colorNum].peRed =
reds[colorNum & 0x07];
logicalPalette.aEntries[colorNum].peGreen =
greens[(colorNum >> 0x03) & 0x07];
logicalPalette.aEntries[colorNum].peBlue =
blues[(colorNum >> 0x06) & 0x03];
logicalPalette.aEntries[colorNum].peFlags = 0;
}

m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
}

//////////////////////////////////////////////////////////
// 设置像素格式
//////////////////////////////////////////////////////////
BOOL CLineView::SetupPixelFormat()
{
PIXELFORMATDESCRIPTOR pfd = {
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 // 忽略层,可见性和损毁掩模
};
int pixelformat;
pixelformat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);//选择像素格式
::SetPixelFormat(m_pDC->GetSafeHdc(), pixelformat, &pfd); //设置像素格式
if(pfd.dwFlags & PFD_NEED_PALETTE)
SetLogicalPalette(); //设置逻辑调色板
return TRUE;
}

int CLineView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
//初始化OpenGL
m_pDC = new CClientDC(this);
InitializeOpenGL(m_pDC);

return 0;
}

void CLineView::OnDestroy()
{
CView::OnDestroy();

// TODO: Add your message handler code here
//删除调色板和渲染上下文、定时器
::wglMakeCurrent(NULL,NULL);
::wglDeleteContext( m_hRC);
if (m_hPalette)
DeleteObject(m_hPalette);
if ( m_pDC )
{
delete m_pDC;
}

}
...全文
978 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
fyjin99 2004-05-03
  • 打赏
  • 举报
回复
是呀,如果楼主给的代码是全的,那么就是范围的问题,
在程序里添加glOrtho(0, 200, 0, 200, -1, 1);
放在InitializeOpenGL()里面就行,不过如果你有 reshape()函数的话,放在reshape()里面是最好不过了。
hmsxg4160 2004-05-03
  • 打赏
  • 举报
回复

glColor3f (1.0, 0.0, 0.0);
glVertex2i(10,20);
glVertex2i(100,200);


范围在-1到1,你的线条画了,但在屏幕外面
sujinzhao407 2004-05-03
  • 打赏
  • 举报
回复
谢谢老狼和老板两位大哥,现在我已经画出来了,谢谢!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧