0

openFileDialogを使用してビットマップ画像を開き、フォームに配置しようとしています。私のフォームコンストラクター...

 public Form1()
    {
        InitializeComponent();
        drawing = new Bitmap(drawingPanel.Width, drawingPanel.Height, drawingPanel.CreateGraphics());
        Graphics.FromImage(drawing).Clear(Color.White);

        // set default value for line thickness
        tbThickness.Text = "5";
    }

...空白の画面で新しいフォームを開き、マウスとさまざまなカラーセレクタボタンを使用してそのフォームに描画できます。次に、次の方法でファイルを保存します。

private void btnSave_Click(object sender, EventArgs e)
    {
        // save drawing
        if (file == null)   // file is a FileInfo object that I want to use
                            // to check to see if the file already exists 
                            // I haven't worked that out yet
        {
            drawing.Save("test.bmp");
            //SaveBitmap saveForm = new SaveBitmap();
            //saveForm.Show();
        }
        else
        {
            drawing.Save(fi.FullName);
        }
    }

イメージは.bmpファイルとしてデバッグフォルダに保存されます。次に、OpenFileDialogを使用してファイルを開きます。

private void btnOpen_Click(object sender, EventArgs e)
    {
        FileStream myStream;
        OpenFileDialog openFile = new OpenFileDialog();
        openFile.Filter = "bmp files (*.bmp)|*.bmp";

        if (openFile.ShowDialog() == DialogResult.OK)
        {
            try
            {
                if ((myStream = (FileStream)openFile.OpenFile()) != null)
                {
                    using (myStream)
                    {
                        PictureBox picBox = new PictureBox();
                        picBox.Location = drawingPanel.Location;
                        picBox.Size = drawingPanel.Size;
                        picBox.Image = new Bitmap(openFile.FileName);
                        this.Controls.Add(picBox);
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }
    }

何が起こっているのかというと、OpenFileDialogボックスが表示されます。test.bmpファイルを選択すると、画面が消えてから再び表示されます。もう一度選択すると、OpenFileDialogウィンドウが消えて、画像のないフォームに戻ります。いくつかのポインタを期待していました。コンパイルエラーやランタイムエラーはありません。

4

3 に答える 3

0

なぜShowDialog()二度電話するの?

あなたが示したように、それは二度ShowDialog開かないように、一度だけ電話してください。

MSDNから:

OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "bmp files (*.bmp)|*.bmp";

if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    try
    {
        if ((myStream = openFileDialog1.OpenFile()) != null)
        {
            using (myStream)
            {
                // Insert code to read the stream here.
                PictureBox picBox = new PictureBox();
                picBox.Location = drawingPanel.Location;
                picBox.Size = drawingPanel.Size;
                picBox.Image = new Bitmap (myStream);
                this.Controls.Add(picBox);
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
}
于 2013-03-01T19:34:45.327 に答える
0

ダイアログパネルを開き、閉じたら結果がOKかどうかを確認します。using次に、ブロック内に別の新しいダイアログを開きます。次に、その画像結果をに割り当て、ブロックが破棄PictureBoxされたときにすべてを破棄します。using

于 2013-03-01T19:35:39.480 に答える
0

ShowDialogue問題の原因である可能性が高い2回電話をかけています。次のコードを使用して、メソッドから他のすべてを削除します。の使用usingも正しくありません。結果を破棄しているクリーンアップを実行します。usingステートメントをリファクタリングまたは削除する必要があります。

private void btnOpen_Click(object sender, EventArgs e)
{
     OpenFileDialog dlg = new OpenFileDialog()
     {
            dlg.Title = "Open Image";
            dlg.Filter = "bmp files (*.bmp)|*.bmp";

            if (dlg.ShowDialog() == DialogResult.OK)
            {
                PictureBox picBox = new PictureBox();
                picBox.Location = drawingPanel.Location;
                picBox.Size = drawingPanel.Size;
                picBox.Image = new Bitmap (dlg.FileName);
                this.Controls.Add(picBox);
            }
      }
  }

上記のコードは機能しますが、クリーンアップやエラー処理は行われません。それはあなたにお任せします。

于 2013-03-01T19:36:58.547 に答える