MFC的对话框中使用OpenGL绘图

        我们在编写软件是总是会有自己的界面,当然利用C++就不得不和MFC打交道了,那么可视化界面通常就要用MFC的Dialog;OpenGL通常画图时会自己生成一个窗口,就如同OpenCV一样,但现在我想OpenGL把图画在对话框指定的位置上,列如,我想在以下对话框的左侧部分显示我要画的图,该怎么做呢?


源代码下载:http://download.csdn.net/detail/u010260855/7062921


接写来我将分享一点我的实现:

1、首先当然要设置好OpenGL的编程环境;

2、新建一个基于对话框的工程,我选择VS studio平台;

3、选着Project->add->class,添加一个新类,取名为MyOpenGL,选着基类为CWnd

4利用VS的类向导给MyOpenGL添加OnCreate()和OnPaint()函数;

5、在MyOpenGL.h中添加成员变量

class MyOpenGL :
	public CWnd
{
public:
	MyOpenGL(void);
	~MyOpenGL(void);
	//
	//成员变量
	int MySetPixelFormat(HDC hDC);
	void Rendercene();
	HDC hdc;
	HGLRC hglrc;
	//
	GLfloat step,s;

	DECLARE_MESSAGE_MAP()
	
public:
	afx_msg void OnPaint();
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
};


6、MyOpenGL.cpp中假如以下代码:

6.1

MyOpenGL::~MyOpenGL(void)
{
	wglMakeCurrent(NULL,NULL);
	wglDeleteContext(hglrc);//删除渲染描述表
	::ReleaseDC(m_hWnd,hdc);//释放设备描述表
}
6.2在OnCreate中加入

int MyOpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  Add your specialized creation code here
	if(MySetPixelFormat(::GetDC(m_hWnd))==FALSE)
		return 0;

	// 获得绘图描述表
	hdc = ::GetDC(m_hWnd);
	// 创建渲染描述表
	hglrc = wglCreateContext(hdc);
	// 使绘图描述表为当前调用现程的当前绘图描述表 
	wglMakeCurrent(hdc, hglrc); 
	return 0;
}


6.3  在OnPaint()加入

void MyOpenGL::OnPaint()
{
	//CPaintDC dc(this); // device context for painting
	// TODO: Add your message handler code here
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存
	Rendercene();
	glPopMatrix();
	glFlush();
	SwapBuffers(hdc);
	// Do not call CWnd::OnPaint() for painting messages
}

6.4 成员函数实现代码


int MyOpenGL::MySetPixelFormat(HDC hDC)
{
	PIXELFORMATDESCRIPTOR pixelDesc;

	pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
	pixelDesc.nVersion = 1;

	pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | 
		PFD_SUPPORT_OPENGL |
		PFD_DOUBLEBUFFER |
		PFD_TYPE_RGBA;

	pixelDesc.iPixelType = PFD_TYPE_RGBA;
	pixelDesc.cColorBits = 32;
	pixelDesc.cRedBits = 0;
	pixelDesc.cRedShift = 0;
	pixelDesc.cGreenBits = 0;
	pixelDesc.cGreenShift = 0;
	pixelDesc.cBlueBits = 0;
	pixelDesc.cBlueShift = 0;
	pixelDesc.cAlphaBits = 0;
	pixelDesc.cAlphaShift = 0;
	pixelDesc.cAccumBits = 0;
	pixelDesc.cAccumRedBits = 0;
	pixelDesc.cAccumGreenBits = 0;
	pixelDesc.cAccumBlueBits = 0;
	pixelDesc.cAccumAlphaBits = 0;
	pixelDesc.cDepthBits = 0;
	pixelDesc.cStencilBits = 1;
	pixelDesc.cAuxBuffers = 0;
	pixelDesc.iLayerType = PFD_MAIN_PLANE;
	pixelDesc.bReserved = 0;
	pixelDesc.dwLayerMask = 0;	
	pixelDesc.dwVisibleMask = 0;
	pixelDesc.dwDamageMask = 0;

	int iPixelFormat; 

	// 为设备描述表得到最匹配的像素格式 
	if((iPixelFormat = ChoosePixelFormat(hDC, &pixelDesc)) == 0)
	{
		MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);
		return FALSE;
	}

	// 设置最匹配的像素格式为当前的像素格式 
	if(SetPixelFormat(hDC, iPixelFormat, &pixelDesc) == FALSE)
	{
		MessageBox("SetPixelFormat Failed", NULL, MB_OK);
		return FALSE;
	}
	return TRUE;
}


void MyOpenGL::Rendercene()
{
	glBegin(GL_LINES);
	glVertex2f(-0.5f,-0.3f);
	glVertex2f(0.4f,0.6f);
	glEnd();
}


7.在对话框的头文件里加入:#include MyOpenGL.h

添加成员变量 MyOpenGL*  m_GL;

然后在其OnCreate()函数中初始化:

int CMFC_GL_TestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  Add your specialized creation code here
	// 定义OpenGL绘图窗口的矩形大小
	//此段语句放在OnInitDialog(),或者OnCreate中
	CRect rect(0,0,300,300);
	m_GL=new MyOpenGL;//用New的方式创建
	m_GL->Create( NULL,   //缺省的窗口
		NULL,   //无窗口名称
		WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE,
		// 定义窗口风格
		rect,   // 窗口的大小
		this,   // 指定当前对话框为其父窗口指针
		0);   
	return 0;
}


接下来就可以运行了。

效果图:



  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
MFC(Microsoft Foundation Classes)是用于开发Windows应用程序的一套类库,其包含了用于创建和管理对话框的类。Matlab是一种高级的技术计算环境和编程语言,拥有丰富的绘图功能。 要在MFC对话框嵌入Matlab绘图,可以通过以下步骤实现: 1. 在MFC对话框添加一个静态文本框(CStatic)作为容纳Matlab绘图的容器,将其设置为需要的大小和位置。 2. 在MFC对话框的头文件包含Matlab引擎的头文件,并初始化Matlab引擎。 3. 在MFC对话框的OnInitDialog函数,创建一个Matlab引擎实例,并将其与前面添加的静态文本框相关联。 4. 使用Matlab引擎的绘图功能,将绘图结果输出到静态文本框。 5. 在MFC对话框的OnDestroy函数,关闭Matlab引擎实例,释放资源。 具体实现步骤如下: 首先,在MFC对话框类的头文件添加以下代码: #include "mat.h" // Matlab引擎头文件 Engine* matlabEngine; // Matlab引擎实例 然后,在OnInitDialog函数添加以下代码: // 初始化Matlab引擎 if (!(matlabEngine = engOpen(NULL))) { // 初始化失败的处理逻辑 } // 获取静态文本框的句柄 HWND hWndStatic = GetDlgItem(IDC_STATIC); // IDC_STATIC为静态文本框的ID // 将Matlab引擎与静态文本框关联 engOutputBuffer(matlabEngine, NULL, 0); // 禁用引擎的输出流 engSetVisible(matlabEngine, false); // 不显示Matlab在界面上的窗口 engSetFigureHandle(matlabEngine, (void*)hWndStatic); // 将Matlab引擎的绘图窗口设置为静态文本框的句柄 接下来,可以使用Matlab引擎的绘图功能进行绘图,例如: // 在Matlab引擎执行绘图命令 engEvalString(matlabEngine, "x = 0:0.1:2*pi; y = sin(x); plot(x, y);"); 最后,在OnDestroy函数关闭Matlab引擎实例: // 关闭Matlab引擎 engClose(matlabEngine); 通过以上步骤,我们就可以在MFC对话框嵌入Matlab的绘图,并将绘图结果显示在静态文本框。请根据具体的需求进行相应的修改和优化。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值