Windows上Opengl开发UI遇到的两个坑

一、GLEW初始化后并不支持新版的opengl函数。 原因是piexlFormart选择了支持向BitMap绘制,这样会使当前opengl环境只支持OpenGL 1.1。

顺便记录一下GLEW使用的几个注意点:

1、头文件要在最前引用 不要在其前边引用gl.h文件 会导致错误。

2、初始化要在wglCreateContext   MakeCurrent之后初始化。并检查返回值是否是 GLEW_OK

3、支持的opengl版本判断使用if(GL_VERSION_x_x) {} (GL_VERSION_4_0)来判断

int bits = 32;
		static	PIXELFORMATDESCRIPTOR pfd =				// pfd Tells Windows How We Want Things To Be
		{
			sizeof(PIXELFORMATDESCRIPTOR),				// Size Of This Pixel Format Descriptor
			1,											// Version Number
			PFD_DRAW_TO_WINDOW |						// Format Must Support Window
			//PFD_DRAW_TO_BITMAP |
			PFD_SUPPORT_OPENGL,				// Format Must Support OpenGL
			//PFD_DOUBLEBUFFER,							// Must Support Double Buffering
			PFD_TYPE_RGBA,								// Request An RGBA Format
			bits,										// Select Our Color Depth
			0, 0, 0, 0, 0, 0,							// Color Bits Ignored
			0,											// No Alpha Buffer
			0,											// Shift Bit Ignored
			0,											// No Accumulation Buffer
			0, 0, 0, 0,									// Accumulation Bits Ignored
			16,											// 16Bit Z-Buffer (Depth Buffer)  
			0,											// No Stencil Buffer
			0,											// No Auxiliary Buffer
			PFD_MAIN_PLANE,								// Main Drawing Layer
			0,											// Reserved
			0, 0, 0										// Layer Masks Ignored
		};
		int piexelFormat = ChoosePixelFormat(mHDC, &pfd);
		if (!SetPixelFormat(mHDC, piexelFormat, &pfd)) {
			return false;
		}

		_context = wglCreateContext(mHDC);

		if (!wglMakeCurrent(mHDC, _context)) {
			return false;
		}

		GLenum err = glewInit();
		if (GLEW_OK != err)
		{
			return false;
		}

 

 

二、Opengl可以直接向DIB的DC(设备无关)上绘制,但透明度始终为0.导致updateLayeredWindows时将产生一种特殊的混合效果。(重点:透明度为零,其他颜色数据不为0时 update效果不是纯透明)这将导致误会,实际上只是没有透明度数据引起的。【注:这里的误会是指GDI+函数DrawRectangle  填充色为255时也会引起此效果,设置为254即可,这两个机制不知是否相同,有时间的同学可以试试 然后结果给大家分享一下】