public override void Create( string name, int width, int height, bool isFullScreen, NamedParameterList miscParams )
{
if ( _hWindow != IntPtr.Zero )
dispose( true );
_hWindow = IntPtr.Zero;
this.Name = name;
this.IsFullScreen = isFullScreen;
this._isClosed = false;
// load window defaults
this.left = this.top = -1; // centered
this.Width = width;
this.Height = height;
this._displayFrequency = 0;
this.isDepthBuffered = true;
this.ColorDepth = IsFullScreen ? 32 : 16;
IntPtr parentHwnd = IntPtr.Zero;
string title = name;
bool vsync = false;
int fsaa = 0;
string border = "";
bool outerSize = false;
#region Parameter Handling
if ( miscParams != null )
{
foreach ( KeyValuePair<string, object> entry in miscParams )
{
switch ( entry.Key )
{
case "title":
title = entry.Value.ToString();
break;
case "left":
left = Int32.Parse( entry.Value.ToString() );
break;
case "top":
top = Int32.Parse( entry.Value.ToString() );
break;
case "depthBuffer":
isDepthBuffered = bool.Parse( entry.Value.ToString() );
break;
case "vsync":
vsync = entry.Value.ToString() == "Yes" ? true : false;
break;
case "fsaa":
fsaa = Int32.Parse( entry.Value.ToString() );
break;
case "externalWindowHandle":
_hWindow = (IntPtr)entry.Value;
if ( _hWindow != IntPtr.Zero )
{
_isExternal = true;
IsFullScreen = false;
}
break;
case "externalGLControl":
break;
case "border":
border = ( (string)miscParams[ "border" ] ).ToLower();
break;
case "outerDimensions":
break;
case "displayFrequency":
if ( IsFullScreen )
_displayFrequency = Int32.Parse( entry.Value.ToString() );
break;
case "colorDepth":
if ( IsFullScreen )
ColorDepth = Int32.Parse( entry.Value.ToString() );
break;
case "parentWindowHandle":
if ( !IsFullScreen )
parentHwnd = (IntPtr)entry.Value;
break;
default:
break;
}
}
}
#endregion Parameter Handling
if ( !_isExternal )
{
DefaultForm form = new DefaultForm();
form.ClientSize = new System.Drawing.Size( width, height );
form.MaximizeBox = false;
form.MinimizeBox = false;
form.StartPosition = SWF.FormStartPosition.CenterScreen;
if ( IsFullScreen )
{
// Set the display to the desired resolution
Gdi.DEVMODE screenSettings = new Gdi.DEVMODE();
screenSettings.dmSize = (short)Marshal.SizeOf( screenSettings );
screenSettings.dmPelsWidth = width; // Selected Screen Width
screenSettings.dmPelsHeight = height; // Selected Screen Height
screenSettings.dmBitsPerPel = ColorDepth; // Selected Bits Per Pixel
screenSettings.dmFields = Gdi.DM_BITSPERPEL | Gdi.DM_PELSWIDTH | Gdi.DM_PELSHEIGHT;
// Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
int result = User.ChangeDisplaySettings( ref screenSettings, User.CDS_FULLSCREEN );
if ( result != User.DISP_CHANGE_SUCCESSFUL )
{
throw new System.ComponentModel.Win32Exception( Marshal.GetLastWin32Error(), "Unable to change user display settings." );
}
// Adjust form to size the screen
form.Top = 0;
form.Left = 0;
form.FormBorderStyle = SWF.FormBorderStyle.None;
form.WindowState = SWF.FormWindowState.Maximized;
#if !DEBUG
form.TopMost = true;
form.TopLevel = true;
#endif
}
else
{
if ( parentHwnd != IntPtr.Zero )
{
form.Owner = (SWF.Form)SWF.Control.FromHandle( parentHwnd );
}
else
{
if ( border == "none" )
{
form.FormBorderStyle = SWF.FormBorderStyle.None;
}
else if ( border == "fixed" )
{
form.FormBorderStyle = SWF.FormBorderStyle.FixedSingle;
form.MaximizeBox = false;
}
}
form.Top = top;
form.Left = left;
//form.FormBorderStyle = SWF.FormBorderStyle.FixedSingle;
form.WindowState = SWF.FormWindowState.Normal;
form.Text = title;
}
WindowEventMonitor.Instance.RegisterWindow( this );
form.RenderWindow = this;
_hWindow = form.Handle;
form.Show();
}
IntPtr old_hdc = Wgl.wglGetCurrentDC();
IntPtr old_context = Wgl.wglGetCurrentContext();
SWF.Control ctrl = SWF.Form.FromHandle( _hWindow );
//Form frm = (Form)ctrl.TopLevelControl;
this.top = ctrl.Top;
this.left = ctrl.Left;
this.Width = ctrl.ClientRectangle.Width;
this.Height = ctrl.ClientRectangle.Height;
_hDeviceContext = User.GetDC( _hWindow );
// Do not change vsync if the external window has the OpenGL control
if ( !_isExternalGLControl )
{
if ( !_glSupport.SelectPixelFormat( _hDeviceContext, ColorDepth, fsaa ) )
{
if ( fsaa == 0 )
throw new Exception( "selectPixelFormat failed" );
LogManager.Instance.Write( "FSAA level not supported, falling back" );
if ( !_glSupport.SelectPixelFormat( _hDeviceContext, ColorDepth, 0 ) )
throw new Exception( "selectPixelFormat failed" );
}
}
// attempt to get the rendering context
_hRenderingContext = Wgl.wglCreateContext( _hDeviceContext );
if ( _hRenderingContext == IntPtr.Zero )
{
throw new System.ComponentModel.Win32Exception( Marshal.GetLastWin32Error(), "Unable to create a GL rendering context." );
}
if ( !Wgl.wglMakeCurrent( _hDeviceContext, _hRenderingContext ) )
{
throw new System.ComponentModel.Win32Exception( Marshal.GetLastWin32Error(), "Unable to activate the GL rendering context." );
}
// Do not change vsync if the external window has the OpenGL control
if ( !_isExternalGLControl )
{
// Don't use wglew as if this is the first window, we won't have initialised yet
//IntPtr wglSwapIntervalEXT = Wgl.wglGetProcAddress( "wglSwapIntervalEXT" );
//if ( wglSwapIntervalEXT != IntPtr.Zero )
//Wgl.wglSwapIntervalEXT( wglSwapIntervalEXT, vsync );
if ( Wgl.IsExtensionSupported( "wglSwapIntervalEXT" ) )
Wgl.wglSwapIntervalEXT( vsync ? 1 : 0 ); // Tao 2.0
}
if ( old_context != IntPtr.Zero )
{
// Restore old context
if ( !Wgl.wglMakeCurrent( old_hdc, old_context ) )
throw new Exception( "wglMakeCurrent() failed" );
// Share lists with old context
if ( !Wgl.wglShareLists( old_context, _hRenderingContext ) )
throw new Exception( "wglShareLists() failed" );
}
// Create RenderSystem context
_glContext = new Win32Context( _hDeviceContext, _hRenderingContext );
// make this window active
this.IsActive = true;
}