1

私は奇妙な問題に直面しています。

メイン フォームと補助フォームを含む小さな WinForms プロジェクトを作成しました。次のようなコードで、最初のフォーム内に 2 番目のフォームを作成します。

private void btnOpenForm_Click(object sender, EventArgs e)
{
    NewForm form = new NewForm(value1, value2);
    form.ShowDialog();
}

メソッドを使用するShowDialog()と、メソッドの実行直後にプログラムがInvalid parameterエラーで失敗しますが、通常のShow()メソッドは正常に機能します。スタックトレース経由で、所有者と同じフォームを新しいフォームに使用できないと言われていますが、メインフォームから呼び出してモーダルダイアログを表示するにはどうすればよいですか?

メイン ウィンドウ コンストラクター:

public MainWindow()
{
    InitializeComponent();
}

補助フォーム コンストラクター:

public VectorPlot(Point2D OriginalVector, Point2D RotatedVector)
{
    InitializeComponent();

    _originalVector = OriginalVector;
    _rotatedVector = RotatedVector;
}

補助ウィンドウへのメイン ウィンドウ呼び出し:

VectorPlot Plot = new VectorPlot(OriginalVector, ModifiedVector);
Plot.ShowDialog();

ペイント イベント:

private void VectorPlot_Paint(object sender, PaintEventArgs e)
{
    using (Graphics g = e.Graphics)
    {
        GraphicsContainer container = g.BeginContainer(new RectangleF(0f, 0f, 300f, 300f), new RectangleF(0f, 0f, 300f, 300f), GraphicsUnit.Pixel);
        g.FillRectangle(new SolidBrush(Color.White), new RectangleF(0f, 0f, 300f, 350f));
        g.DrawLine(new Pen(Color.Gray), 150f, 0f, 150f, 300f);
        g.DrawLine(new Pen(Color.Gray), 0f, 150f, 300f, 150f);

        float xOrigVect =  (float)_originalVector.X;
        float yOrigVect = (float)_originalVector.Y;
        float xRotVect = (float)_rotatedVector.X;
        float yRotVect = (float)_rotatedVector.Y;

        xOrigVect = 150f + xOrigVect;
        yOrigVect = 150f - yOrigVect;
        xRotVect = 150f + xRotVect;
        yRotVect = 150f - yRotVect;

        g.DrawLine(new Pen(Color.Blue, 2f), 150f, 150f, xOrigVect, yOrigVect);
        g.DrawLine(new Pen(Color.Red, 2f), 150f, 150f, xRotVect, yRotVect);

        g.DrawString("Legenda: ", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(0f, 310f));
        g.DrawLine(new Pen(Color.Blue, 2f), 0f, 330f, 10f, 330f);
        g.DrawString("Vetor original", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(10f, 322f));
        g.DrawLine(new Pen(Color.Red, 2f), 0f, 340f, 10f, 340f);
        g.DrawString("Vetor rotacionado", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(10f, 332f));
        g.EndContainer(container);
    }
}

スタックトレース:

System.ArgumentException was unhandled
HResult=-2147024809
Message=Parâmetro inválido.
Source=System.Drawing
StackTrace:
   em System.Drawing.Graphics.get_Clip()
   em System.Drawing.Graphics.GetContextInfo()
   em System.Windows.Forms.Internal.WindowsGraphics.FromGraphics(Graphics g, ApplyGraphicsProperties properties)
   em System.Windows.Forms.WindowsGraphicsWrapper..ctor(IDeviceContext idc, TextFormatFlags flags)
   em System.Windows.Forms.VisualStyles.VisualStyleRenderer.DrawBackground(IDeviceContext dc, Rectangle bounds)
   em System.Windows.Forms.Form.OnPaint(PaintEventArgs e)
   em System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
   em System.Windows.Forms.Control.WmPaint(Message& m)
   em System.Windows.Forms.Control.WndProc(Message& m)
   em System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   em System.Windows.Forms.ContainerControl.WndProc(Message& m)
   em System.Windows.Forms.Form.WndProc(Message& m)
   em System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   em System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   em System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
InnerException: 
4

3 に答える 3

1

パラメータを form.ShowDialog() メソッドに渡さない場合、これはデフォルトで現在のウィンドウ/フォームを所有者として取得します。のように試すことができます。

form.ShowDialog(App.OpenForms[0]); // as default form 

また

form.ShowDialog(this); // to make the current window as owner for the form.

編集::

Windows (Win32 および WinForms.Net) がこれを処理する通常の方法は、MessageQueue が空になるのを待ってから、無効化されたすべての画面領域を処理することです。何かが変更されると、通常は他のもの (コントロール) にカスケードして変更されるため、これは効率的です。

ベクトルをペイントするための新しいユーザーコントロールを作成し、ユーザーコントロールペイントイベントを使用してタスクを完了する必要がある答えは次のとおりです。以下のコードを確認してください。

 private void button1_Click(object sender, EventArgs e)
        {

                Form2 Plot = new Form2(new Point2D(10, 10), new Point2D(100, 100));
                Plot.ShowDialog();

        }



 public partial class Form2 : Form
    {
        private Point2D _originalVector;
        private Point2D _rotatedVector;

        public Form2()
        {
            InitializeComponent();
        }

        public Form2(Point2D OriginalVector, Point2D RotatedVector)
        {
            InitializeComponent();

            _originalVector = OriginalVector;
            _rotatedVector = RotatedVector;
        }

        private void userControl11_Paint(object sender, PaintEventArgs e)
        {
                                using (Graphics g = e.Graphics)
                {
                    GraphicsContainer container = g.BeginContainer(
                          new RectangleF(0f, 0f, 300f, 300f)
                        , new RectangleF(0f, 0f, 300f, 300f)
                        , GraphicsUnit.Pixel);
                    g.FillRectangle(new SolidBrush(Color.White), new RectangleF(0f, 0f, 300f, 350f));
                    g.DrawLine(new Pen(Color.Gray), 150f, 0f, 150f, 300f);
                    g.DrawLine(new Pen(Color.Gray), 0f, 150f, 300f, 150f);

                    float xOrigVect = (float)_originalVector.X;
                    float yOrigVect = (float)_originalVector.Y;
                    float xRotVect = (float)_rotatedVector.X;
                    float yRotVect = (float)_rotatedVector.Y;

                    xOrigVect = 150f + xOrigVect;
                    yOrigVect = 150f - yOrigVect;
                    xRotVect = 150f + xRotVect;
                    yRotVect = 150f - yRotVect;

                    g.DrawLine(new Pen(Color.Blue, 2f), 150f, 150f, xOrigVect, yOrigVect);
                    g.DrawLine(new Pen(Color.Red, 2f), 150f, 150f, xRotVect, yRotVect);

                    g.DrawString("Legenda: ", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(0f, 310f));
                    g.DrawLine(new Pen(Color.Blue, 2f), 0f, 330f, 10f, 330f);
                    g.DrawString("Vetor original", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(10f, 322f));
                    g.DrawLine(new Pen(Color.Red, 2f), 0f, 340f, 10f, 340f);
                    g.DrawString("Vetor rotacionado", new System.Drawing.Font("sans-serif", 8.0f), Brushes.Black, new PointF(10f, 332f));
                    g.EndContainer(container);
                }

        }
    }
于 2013-10-03T12:31:44.003 に答える
1

このメソッドにパラメーターを指定する必要があるかもしれません。試す:

form.ShowDialog(this);
于 2013-10-03T12:27:24.017 に答える
0

Maybe this?

form.ShowDialog(this);

Can you paste your stacktrace?

于 2013-10-03T12:30:33.517 に答える