eugene.chepurnykh's picture

Not firing Load event for GLControl.

Project:The Open Toolkit library
Version:1.0-beta-1
Component:Code
Category:bug report
Priority:normal
Assigned:Unassigned
Status:closed
Description

GLControl.Load fire never.


Comments

the Fiddler's picture

#1

Version:all versions» 0.9.9-1
Status:open» confirmed
the Fiddler's picture

#2

Version:0.9.9-1» 0.9.8-2

Confirmed to occur on earlier version.

objarni's picture

#3

Workaround: Use Form.Load event instead. In practice this has worked since OpenTK 0.3.13, and it seems to work with 0.9.9.1 too.

the Fiddler's picture

#4

Status:confirmed» in progress

Ok, the reason is that the GLControl.Load event is raised as soon as you call its constructor, not giving you a chance to hook it.

The solution is to modify the GLControl to be constructed lazily, as all regular controls do.

the Fiddler's picture

#5

Version:0.9.8-2» 0.9.x-dev
Status:in progress» fixed

Issue fixed in trunk (rev. 2203).

Please test if it works as expected on Windows, as I do not have access to a Windows installation right now.

objarni's picture

#6

@Fiddler cool!

@Hex - if you read this - could you please try this out since you are "close to the issue"? :) [assuming you are on Windows that is..]

the Fiddler's picture

#7

Version:0.9.x-dev» 0.9.9-2b
Status:fixed» closed

Closing issues fixed in 0.9.9-2.

FauxBestaan's picture

#8

Status:closed» open

Still not fixed on Windows in 0.9.9-2b. Having to use Form.Load instead.

the Fiddler's picture

#9

Status:open» fixed

Confirmed, debugged and fixed in SVN rev. 2281.

The issue was that the winforms designer sets all public properties by default. In this case, it specified VSync = false, which caused the control to be realized prematurely - before you got a chance to connect any events. This issue would always manifest in the VS designer but not when you created the control through code - which explains why it passed through unnoticed.

Can you please verify that it works as expected now?

FauxBestaan's picture

#10

Working as expected. Good job :)

the Fiddler's picture

#11

Version:0.9.9-2b» 0.9.x-dev

Thanks for testing, will try to make a bugfix release next week.

the Fiddler's picture

#12

Version:0.9.x-dev» 0.9.9-3
Status:fixed» closed

Closing issues fixed in 0.9.9-3.

karlschiffmann's picture

#13

I am still not getting the glControl Load event firing with 0.9.9-3 VS C# 8.0. Here is my code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
 
namespace OpenTK_issue_TutorialOutdated
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            this.ClientSize = new Size(640, 480);
         }
 
        private void glControl1_Resize(object sender, EventArgs e)
        {
            int w = glControl1.Width;
            int h = glControl1.Height;
            GL.Viewport(0, 0, w, h); // Use all of the glControl painting area
        }
 
        private void glControl1_Paint(object sender, PaintEventArgs e)
        {
            GL.ClearColor(Color.Navy);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
 
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadIdentity();
            GL.Begin(BeginMode.Triangles);
            GL.Color3(Color.Red);
            GL.Vertex2(0, 0);
            GL.Color3(Color.Green);
            GL.Vertex2(1, 0);
            GL.Color3(Color.Blue);
            GL.Vertex2(0, 1);
            GL.End();
 
            glControl1.SwapBuffers();
 
        }
 
        private void glControl1_Load(object sender, EventArgs e)
        {
 
        }
    }
}
 
 
and the Designer:
 
namespace OpenTK_issue_TutorialOutdated
{
    partial class Form1
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.glControl1 = new OpenTK.GLControl();
            this.SuspendLayout();
            // 
            // glControl1
            // 
            this.glControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
                        | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.glControl1.BackColor = System.Drawing.Color.Black;
            this.glControl1.Location = new System.Drawing.Point(-1, 0);
            this.glControl1.Name = "glControl1";
            this.glControl1.Size = new System.Drawing.Size(297, 276);
            this.glControl1.TabIndex = 0;
            this.glControl1.VSync = true;
            this.glControl1.Load += new System.EventHandler(this.glControl1_Load);
            this.glControl1.Paint += new System.Windows.Forms.PaintEventHandler(this.glControl1_Paint);
            this.glControl1.Resize += new System.EventHandler(this.glControl1_Resize);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(292, 273);
            this.Controls.Add(this.glControl1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);
 
        }
 
        #endregion
 
        private OpenTK.GLControl glControl1;
    }
}
the Fiddler's picture

#14

Version:0.9.9-3» 0.9.x-dev
Status:closed» fixed

Fixed in rev. 2371, can you please test if the fix works?

The previous fix (rev. 2281) caused the control to be prematurely initialized when the Size property was set. The VS designer always sets this property before hooking any events, which meant these events were never raised.

I've added a different workaround, which simply suppresses the Resize event until the control has been correctly initialized. This seems to work correctly here, but need confirmation.

karlschiffmann's picture

#15

Downloaded the latest dated 10/21/2009... and the Load event still does not fire for me... will attach my two files... thanks.

AttachmentSize
Form1.Designer.cs2.51 KB
Form1.cs1.5 KB
the Fiddler's picture

#16

You have two Load events:

  • glControl1_Load fires correctly
  • Form1_Load does not fire, because it is not connected in your Designer.cs file. Check your form properties!
karlschiffmann's picture

#17

Even when I connect the Form1_Load event (which does fire), I don't get the glControl1_Load firing... I wonder why...

the Fiddler's picture

#18

I should have clarified, the glControl1_Load event works correctly in trunk (SVN revision 2371 or higher). It is broken in the 0.9.9-3 release.

SVN instructions here. If you don't wish to build from source, you can wait for 0.9.9-4 which will come early next week.

syr1111's picture

#19

I'm using 0.9.9-3 and also not seeing the Load event fire, but ONLY when using a non-standard DPI in the operating system. This has been confirmed on separate machines under both Win XP and Vista. The Load event will fire correctly when using the default 96 DPI, but not when using 120 DPI. I don't know if the DPI factor is complicit to the issue itself or just changes timing enough to change the sequence of events, but it does seem very predictable.

I will try this out on 0.9.9-4 when available. For now I am working around it by doing the initialization I want on Load during the first Resize event if Load never fired.

the Fiddler's picture

#20

Thanks for testing, can you please file a new bug report for this issue? I wish to clear all GLControl issues before the 1.0 release and this might get lost here.

the Fiddler's picture

#21

Version:0.9.x-dev» 1.0-beta-1
Status:fixed» closed

Closing issues fixed in 1.0 beta-1.