C++ cli 图纸形式为荷载C和x2B+/CLI

C++ cli 图纸形式为荷载C和x2B+/CLI,c++-cli,paint,form-load,C++ Cli,Paint,Form Load,我用一个方法在我的面板上画东西,当我通过一个按钮调用这个方法时,它会画东西,但当我在Form\u Load上调用这个方法时,它不会画任何东西。当我调试它时,它实际上会毫无问题地遍历代码,但仍然不会绘制任何内容 下面您可以看到表单加载和按钮点击事件: private: System::Void SelectElementForm_Load(System::Object^ sender, System::EventArgs^ e) { if (ElementList->Count &

我用一个方法在我的面板上画东西,当我通过一个按钮调用这个方法时,它会画东西,但当我在
Form\u Load
上调用这个方法时,它不会画任何东西。当我调试它时,它实际上会毫无问题地遍历代码,但仍然不会绘制任何内容

下面您可以看到
表单加载
按钮点击
事件:

private: System::Void SelectElementForm_Load(System::Object^  sender, System::EventArgs^ e)
{
    if (ElementList->Count > 0)
    {
        Index = 0;
        DrawLinesInLayout();
    }
}
还有按钮

private: System::Void btnLeft_Click(System::Object^  sender, System::EventArgs^  e)
{
    if (ElementList->Count > 0)
    {
        if (Index + 1 > 1)
        {
            Index--;
            DrawLinesInLayout();
        }
        else
        {
            Index = ElementList->Count - 1;
            DrawLinesInLayout();
        }
    }
}
当我使用
绘制事件时
在窗体弹出时有效。但是我在程序中得到了两次代码,这有点毫无意义

因此,我的问题是:

  • 为什么我的表单加载没有正确使用我的方法,而我的按钮没有正确使用
  • 我可以通过单击按钮调用
    Paint
    事件吗

正如汉斯·帕桑(Hans Passant)所提到的,你不能利用那些还不存在的东西。 解决方案:创建后绘制

Invalidate()不起作用,因为绘图方法中存在更改的变量(这就是为什么每个调用事件中都有
索引更改的原因)

不要使用
Load
事件,而是使用所示的
事件。这将在表格上绘制线条:

private: System::Void SelectElementForm_Shown(System::Object^  sender, System::EventArgs^  e) 
{
    if (ElementList->Count > 0)
    {
        Index = 0;
        DrawLinesInLayout();
    }
}

是的,保留原始代码是毫无意义的。将像素飞溅到尚未可见的窗口是浪费时间。删除它。当需要再次运行绘制事件时调用Invalidate()。@Hans Call Invalidate()对我不起作用,它只是重新绘制了我的第一个
绘制
事件。我的
Paint
事件中有一些变量在按下按钮时会发生变化。通过使用
显示的
事件而不是
加载
事件解决了这个问题