是否可以创建一个以窗体形式作为父窗体的openGL子窗口?

时间:2018-02-21 09:32:39

标签: c# opengl glut

我正在尝试将一个openGL窗口作为我的Windows窗体应用程序的子窗口。

这是Windows窗体的创建,默认情况下发生在Form1.Designer.cs

        this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
        this.ClientSize = new System.Drawing.Size(1333, 594);
        this.Controls.Add(this.Sim);
        this.Controls.Add(this.Camera);
        this.Controls.Add(this.comboBox1);
        this.Controls.Add(this.pictureBox1);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.Name = "Form1";
        this.Text = "Form1";
        this.Load += new System.EventHandler(this.Form1_Load);
        ((System.ComponentModel.ISupportInitialize)
        (this.pictureBox1)).EndInit();
        this.ResumeLayout(false);

Glut.glutcreateSubWindow(int win,int x,int y,int width,int height);

glutcreateSubWindow将父值作为int,我很难尝试转换this.Name =“Form1”;到一个int,我可以用来将表单的名称称为父。

通过尝试将字符串名称转换为指定的父插槽,我可以在这里以蓝色方式执行此操作。

是否有另一种方法可以在此上下文中将表单指定为父级?

2 个答案:

答案 0 :(得分:0)

当然你不应该尝试将“Form 1”转换为int,框架期望有一个GLUT窗口标识符的整数,你应该在创建GLUT顶级窗口时检索并存储一个,然后就可以了创建它的子窗口。

请参阅此文并向下滚动以查看所有代码的清晰说明,它会向您显示实施所需的所有步骤:https://www.codeproject.com/Articles/20107/GLUT-Subwindow-Template

答案 1 :(得分:0)

我没有过剩的经验,但我可能知道一种不同的方法可以解决这个问题。

要使Windows.Forms.Form成为父级,您将需要一个也是System.Windows.Forms.Form的子级(或实现子类)。

过去我需要在Windows窗体中使用DirectX覆盖。因为这是一个不同的API,我无法将其添加到Windows.Forms.Form。

我通过实现System.Windows.Forms.UserControl解决了这个问题(您可以实现System.Windows.Forms.Form或向其添加自定义控件) 当控件初始化时,我在它上面创建了叠加层(你知道控件或窗口的角落)

所以基本上我有一个空的窗口控件,其上面有一个DirectX窗口,它跟在控件之后并用它调整大小(调整控件的大小和移动事件我改变了,或重建我的叠加层以随之移动)。 )

你可以这样做,制作一个windows.from,它有一个较少的边框(没有标题栏)过剩的窗口,可以对Windows.Forms事件作出反应。

仅当您可以在Glut中创建一个较少的边框窗口,或者在屏幕上绘制一种矩形覆盖时,才可以使用此选项。我不知道Glut是否可行。

如果这个答案对您的情况没有帮助,请告诉我,我将删除此答案。我只是想提供一种解决方法,因为我过去遇到了类似的问题。