MFC中使用OpenGL简单框架的搭建

#pragma once

class COpenGLWnd : public CWnd
{
	DECLARE_DYNAMIC(COpenGLWnd)
public:
	COpenGLWnd();
	virtual ~COpenGLWnd();

	int		MySetPixelFormat(HDC hdc);
	void	SetViewPortSize();

	HDC		m_hDC;
	HGLRC	m_hRC;
protected:
	DECLARE_MESSAGE_MAP()
public:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnDestroy();
	afx_msg void OnPaint();
};

/


#include "stdafx.h"
#include "OpenCVMFC.h"
#include "OpenGLWnd.h"

IMPLEMENT_DYNAMIC(COpenGLWnd, CWnd)
COpenGLWnd::COpenGLWnd()
{
}

COpenGLWnd::~COpenGLWnd()
{
}

BEGIN_MESSAGE_MAP(COpenGLWnd, CWnd)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_WM_PAINT()
END_MESSAGE_MAP()


int		COpenGLWnd::MySetPixelFormat(HDC hdc)
{
	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  iPixelFormat;
	// 为设备描述表得到最匹配的像素格式 
	if ((iPixelFormat = ChoosePixelFormat(hdc, &pfd)) == 0) {
		MessageBox(TEXT("ChoosePixelFormat Failed"), NULL, MB_OK);
		return 0;
	}
	// 设置最匹配的像素格式为当前的像素格式 
	if (SetPixelFormat(hdc, iPixelFormat, &pfd) == FALSE) {
		MessageBox(TEXT("SetPixelFormat Failed"), NULL, MB_OK);
		return 0;
	}
	return 1;
}

void	COpenGLWnd::SetViewPortSize()
{
	CRect rectSize;
	GetClientRect(&rectSize);
	double dbViewWidth = 400;
	int cx = rectSize.Width();
	int cy = rectSize.Height();
	glViewport(0, 0, cx, cy);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if (cx<cy) {
		glOrtho(-dbViewWidth, dbViewWidth, -dbViewWidth*(GLfloat)cy / (GLfloat)cx, dbViewWidth*(GLfloat)cy / (GLfloat)cx, -1.0, 1.0);
	}
	else {
		glOrtho(-dbViewWidth*(GLfloat)cx / (GLfloat)cy, dbViewWidth*(GLfloat)cx / (GLfloat)cy, -dbViewWidth, dbViewWidth, -1.0, 1.0);
	}
	glMatrixMode(GL_MODELVIEW);
	glClearColor(1.0, 1.0, 1.0, 1.0);
}

int COpenGLWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_hDC = ::GetDC(m_hWnd);
	MySetPixelFormat(m_hDC);
	m_hRC = wglCreateContext(m_hDC);
	wglMakeCurrent(m_hDC, m_hRC);
	return 0;
}

void COpenGLWnd::OnDestroy()
{
	wglMakeCurrent(m_hDC, m_hRC);
	CWnd::OnDestroy();
}

void COpenGLWnd::OnPaint()
{
	CPaintDC dc(this);
	SetViewPortSize();
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glColor3f(1.0, 0, 0);
	glBegin(GL_LINES);
	glVertex2d(0, 0);
	glVertex2d(500, 500);
	glEnd();

	glFlush();
	SwapBuffers(m_hDC);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值