我正在尝试将一个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,我可以用来将表单的名称称为父。
通过尝试将字符串名称转换为指定的父插槽,我可以在这里以蓝色方式执行此操作。
是否有另一种方法可以在此上下文中将表单指定为父级?
答案 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是否可行。
如果这个答案对您的情况没有帮助,请告诉我,我将删除此答案。我只是想提供一种解决方法,因为我过去遇到了类似的问题。