0

我正在使用 C# Windows 窗体应用程序和 OpenTK 在 VS2010 Pro 中制作 CAD 类型的软件。没有什么花哨; 我只是希望能够阅读一些基本形状并绘制它们。我不确定这是否会对答案产生影响,但我正在使用 GL.Ortho(); 绘制二维空间;

为了熟悉图形,我直接从 OpenTK 文档中完成了一些 OpenTK 示例,并对它有一个基本的了解。根据我到目前为止所学到的知识,除非它们是在此事件中创建的,否则我无法移动/旋转我的图元:

    private void glControl1_Paint(object sender, PaintEventArgs e)
    {
    }

我的程序启动并等待用户选择要读入的 CAD 文件。在我读取文件并将其分解为基元后,我将其绘制到 glControl1 表单。到目前为止,它按预期工作。但是,我没有在“glControl1_Paint”事件中绘制它。因此,我无法控制使用键盘/鼠标输入来翻译/旋转它。

我已经阅读了对提问者被指示在“glControl1_Paint”事件中绘制的其他问题的答案。我很想这样做,因为它可以解决我的问题,但我不知道该怎么做,因为我在启动应用程序时没有原语,我等待用户提供数据。

我想我有几个问题想知道答案:

1)程序中的“glControl1_Paint”事件何时发生?我认为它是初始化 glControl1 窗口的一部分并在启动时触发。我可以控制这种情况发生的时间,以便我可以在这里绘制我的图元吗?如果是这样,我如何控制这种情况发生的时间以及如何将我的几何体传递给它?

2)有没有办法在“glControl1_Paint”事件之外翻译/旋转我的图元?

4

1 回答 1

0

不,您无法知道绘制事件何时会触发。但是您可以通过 Invalidate() 函数手动触发它。

流程应该是这样的。

  1. 你应该在你的绘画事件中完成所有的绘图。
  2. 如果发生影响绘图的事情,您应该调用 Invalidate() 移动对象的键盘事件或旋转相机等的鼠标事件。所有这些都应该调用 Invalidate()
  3. 如果你喜欢最大帧率。如果没有其他要处理的 Windows 消息,您应该覆盖应用程序主循环并使其调用 Invalidate()。

这是我的编程循环

static void Main()
{
...

MainForm mainFrom = new MainForm();
mainFrom.FormClosed += QuitLoop;
mainFrom.Show();
do
{
     Application.DoEvents();
     mainFrom.glControl1.Invalidate(true); //actually may program is a lot more complex than this
     if (mainFrom.IsRunning)
          System.Threading.Thread.Sleep(0);
     else
          System.Threading.Thread.Sleep(1);
} while (!mQuit);

...
于 2013-04-08T15:43:19.143 回答