2.1 Full Screen OpenGL Window

Here is the code for a full screen OpenGL window. It uses the powerful GameWindow class. I think the most significant feature is that it does not use Windows Forms. This means you do not need to include the Windows.Forms assembly. It also means that you are responsible for creating everything that appears inside the window using OpenGL.

using System;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
 
class Program
{
 
  static void Main(string[] args)
  {
    MyWindow N = new MyWindow();
    N.Run(100.0);
    N.Dispose();
  }
 
}
 
// This class is a powerful window that can be created without using any GUI library.
public class MyWindow : GameWindow
{
  public MyWindow()
    : base()
  {
    Console.WriteLine("Press any key to exit.");
    KeyPress += HandleKeyPressEvent;
    Load += HandleOnLoadEvent;
    RenderFrame += HandleRenderEvent;
  }
 
  public void HandleKeyPressEvent(object sender, KeyPressEventArgs e)
  {
    Exit();
  }
 
  public void HandleOnLoadEvent(object sender, EventArgs e)
  {
    WindowBorder = WindowBorder.Hidden;
    WindowState = WindowState.Fullscreen;
    GL.Clear(ClearBufferMask.DepthBufferBit | 
                     ClearBufferMask.ColorBufferBit | 
                     ClearBufferMask.AccumBufferBit | 
                     ClearBufferMask.StencilBufferBit);
  }
 
  public void HandleRenderEvent(object sender, FrameEventArgs e)
  {
    GL.ClearColor(new Color4(1, 0, 0, 1));
    SwapBuffers();
  }
 
}

Since I am coding my projects as console applications in Visual Studio, I had to explicitly include the System.Drawing assembly to get this to compile. It is needed to support the Color4 class (see C:\opentk-0.9.9-3\Source\OpenTK\Graphics\Color4.cs). [see Comment below on this issue]

The main program creates a GameWindow, starts the rendering loop, then finally disposes of any system-dependent (non-managed) baggage before closing.

I used the NativeWindow properties to get rid of the window border and make the window full screen. You'll find the WindowBorder and WindowState classes in C:\opentk-0.9.9-3\Source\OpenTK.

A lot of this code depends on event handling which is a basic, but difficult, feature of C#. You can find out about the available events by looking in C:\opentk-0.9.9-3\Source\OpenTK\GameWindow.cs (Load and RenderFrame) and C:\opentk-0.9.9-3\Source\OpenTK\NativeWindow.cs (KeyPress). Particular attention should be paid to the UpdateFrame event which I didn't need for this example.

The SwapBuffers call is necessary because double buffering is built into the GameWindow class. (BTW, that's a good thing.)

When I ran this on Windows Xp SP3 it worked mostly OK. I am slightly concerned that the background color of the window is black, not red. Another minor issue was the cursor which seemed to want to remain as an hourglass, not an arrow. I am quite happy that the Winkey is ignored.