您的位置:首页 > 运维架构

基于MFC的OPENGL绘图框架搭建

2009-10-22 16:26 459 查看
1、修改PreCreateWindow:

BOOL CMy2dClusterView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此处通过修改
//  CREATESTRUCT cs 来修改窗口类或样式

////////////////////////////////////////////////////////////////
//设置窗口类型
cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
////////////////////////////////////////////////////////////////

return CView::PreCreateWindow(cs);
}


2、修改OnDraw:

void CMy2dClusterView::OnDraw(CDC* pDC)
{
//Display();
CMy2dClusterDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码

//////////////////////////////////////////////////////////////////
::glPushMatrix();
RenderScene();	//渲染场景
::glPopMatrix();
//////////////////////////////////////////////////////////////////
::SwapBuffers(m_pDC->GetSafeHdc());		//交互缓冲区
}


3、添加消息WM_CREATE处理函数:

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

// TODO:  在此添加您专用的创建代码

//////////////////////////////////////////////////////////////////
//初始化OpenGL
m_pDC = new CClientDC(this);
InitializeOpenGL(m_pDC);
//////////////////////////////////////////////////////////////////

return 0;
}


4、添加消息WM_DESTROY处理函数:

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

// TODO: 在此处添加消息处理程序代码

/////////////////////////////////////////////////////////////////
//删除调色板和渲染上下文、定时器
::wglMakeCurrent(0,0);
::wglDeleteContext(m_hRC);
if(m_hPalette)
DeleteObject(m_hPalette);
if(m_pDC)
delete m_pDC;
/////////////////////////////////////////////////////////////////
}


5、添加消息WM_SIZE处理函数:

void CMy2dClusterView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码

/////////////////////////////////////////////////////////////////
//添加窗口缩放时的图形变换函数
if (0 >= cx || 0 >= cy)
return;

currentWidth = cx;
currentHeight = cy;
glViewport(0, 0, cx, cy);
/////////////////////////////////////////////////////////////////
}


6、设置逻辑调色板:

/////////////////////////////////////////////////////////////////////
//	                  设置逻辑调色板
//////////////////////////////////////////////////////////////////////
void CMy2dClusterView::SetLogicalPalette()
{
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);
}


7、设置像素格式:

//////////////////////////////////////////////////////////
//						设置像素格式
//////////////////////////////////////////////////////////
BOOL CMy2dClusterView::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;
}


8、初始化OPENGL场景:

//////////////////////////////////////////////////////////
//						初始化openGL场景
//////////////////////////////////////////////////////////
BOOL CMy2dClusterView::InitializeOpenGL(CDC *pDC)
{
m_pDC = pDC;
SetupPixelFormat();
//生成绘制描述表
m_hRC = ::wglCreateContext(m_pDC->GetSafeHdc());
//置当前绘制描述表
::wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);

return TRUE;
}


9、编写绘图程序:

BOOL CMy2dClusterView::RenderScene()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//add own code here
return TRUE;
}


That's OK!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: