/// <summary>
/// Create a new window class, as basic as possible.
/// </summary>
/// <param name="width"></param>
/// <param name="height"></param>
/// <param name="parameters"></param>
/// <returns></returns>
private bool CreateBasicRenderContext(int width, int height, ContextGenerationParams parameters)
{
var wndClass = new WNDCLASSEX();
wndClass.Init();
wndClass.style = ClassStyles.HorizontalRedraw | ClassStyles.VerticalRedraw | ClassStyles.OwnDC;
wndClass.lpfnWndProc = wndProcDelegate;
wndClass.lpszClassName = "CSharpGLRenderWindow";
Win32.RegisterClassEx(ref wndClass);
// Create the window. Position and size it.
windowHandle = Win32.CreateWindowEx(0,
"CSharpGLRenderWindow",
"",
WindowStyles.WS_CLIPCHILDREN | WindowStyles.WS_CLIPSIBLINGS | WindowStyles.WS_POPUP,
0, 0, width, height,
IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
// Get the window device context.
this.DeviceContextHandle = Win32.GetDC(windowHandle);
// Setup a pixel format.
var pfd = new PixelFormatDescriptor();
pfd.Init();
pfd.nVersion = 1;
pfd.dwFlags = Win32.PFD_DRAW_TO_WINDOW | Win32.PFD_SUPPORT_OPENGL | Win32.PFD_DOUBLEBUFFER;
pfd.iPixelType = Win32.PFD_TYPE_RGBA;
pfd.cColorBits = parameters.ColorBits;
pfd.cAccumBits = parameters.AccumBits;
pfd.cAccumRedBits = parameters.AccumRedBits;
pfd.cAccumGreenBits = parameters.AccumGreenBits;
pfd.cAccumBlueBits = parameters.AccumBlueBits;
pfd.cAccumAlphaBits = parameters.AccumAlphaBits;
pfd.cDepthBits = parameters.DepthBits;
pfd.cStencilBits = parameters.StencilBits;
pfd.iLayerType = Win32.PFD_MAIN_PLANE;
// Match an appropriate pixel format
int iPixelformat = Win32.ChoosePixelFormat(this.DeviceContextHandle, pfd);
if (iPixelformat == 0)
{
return(false);
}
// Sets the pixel format
if (false == Win32.SetPixelFormat(this.DeviceContextHandle, iPixelformat, pfd))
{
return(false);
}
// Create the render context.
this.RenderContextHandle = Win32.wglCreateContext(this.DeviceContextHandle);
return(true);
}