- PR -

PictureBoxについて

投稿者投稿内容
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-26 13:01
自動で移動する方法はないはずなので、実装は必要でしょうね。

心配な点が一つあります。
ドラッグ中に移動のようなイメージで移動するだけなら、その後の
マウスカーソルの位置をあまり気にする必要がないので別にいいと思います。
しかし、描画中であれば、スクロール後のマウスカーソルの位置がずれませんか?
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-04-26 13:06
返信ありがとうございます。

できないのがわかれば大丈夫です。
力技でできるので^^;
マウスがずれると言う心配なんですが、
ドラッグ中はパネルの端からマウスが移動しないようにして、
そのかわりスクロールを移動するようにすれば大丈夫なので
マウス位置がずれる心配はないと思います。
(マウスがパネル以外に出ようとしたらマウスをパネル内に座標を戻してあげる処理)
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-26 14:07
それを認識されているのであれば杞憂でした。
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-04-26 14:34
杞憂とは難しい言葉をお使いになられるんですね^^
わざわざ心配してくださってありがとうございます。

話がもどりますが、画像をピクチャーボックスに表示して、
その上に線を描いたりするとするじゃないですが、
その場合に、画像と線とか書く領域を別にして
保存時に一緒にして保存することとかって可能ですか???

いまいちそのあたりの処理がよくわかならくて、
現状は画像表示と描画を同じところでしています。
「戻る」のことでも聞きましたが、
そのあたりを詳しく聞きたいです。

なんか全部聞いてる気が・・・。
よろしくお願いします。
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-04-26 14:34
杞憂とは難しい言葉をお使いになられるんですね^^
わざわざ心配してくださってありがとうございます。

話がもどりますが、画像をピクチャーボックスに表示して、
その上に線を描いたりするとするじゃないですが、
その場合に、画像と線とか書く領域を別にして
保存時に一緒にして保存することとかって可能ですか???

いまいちそのあたりの処理がよくわかならくて、
現状は画像表示と描画を同じところでしています。
「戻る」のことでも聞きましたが、
そのあたりを詳しく聞きたいです。

なんか全部聞いてる気が・・・。
よろしくお願いします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-26 14:42
描画を Paint イベントで行っているのであれば、
PictureBox が持っているイメージに描画するわけではなく、PictureBox の
ウィンドウに描画されています。

この場合、保存する際には、
・新規 Image オブジェクトを作成
・Graphics.FromImage で Image オブジェクトに対して描画する
Graphics オブジェクトを作成
・PictureBox の Image プロパティに設定している「画像」を描画
・描画クラスを用いて図形を描画
・Image オブジェクトを保存
でいいんじゃないかと思います。
VitaminLemon
常連さん
会議室デビュー日: 2005/04/08
投稿数: 40
投稿日時: 2005-04-26 14:57
返答ありがとうございます。
現状直接Imageに描画してます。
private Graphics grfx;

grfx = Graphics.FromImage(pictureBox1.Image) ;
Pen pen = new Pen(Color.Magenta) ;

if(e.Button == MouseButtons.Left)
{
 grfx.DrawLine(pen, mousepoint, pictureBox1.PointToClient(Cursor.Position));
 mousepoint = pictureBox1.PointToClient(Cursor.Position);
 pictureBox1.Refresh();
}

ってな感じです。。。
保存は

Rectangle rect = pictureBox1.ClientRectangle;

Bitmap bmp = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bmp);
PaintEventArgs pea = new PaintEventArgs(g, rect);

this.InvokePaintBackground(pictureBox1, pea);
this.InvokePaint(pictureBox1, pea);

bmp.Save(@"C:\test.bmp");

ってな感じでしています。
これだとまずいですか???
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-04-26 15:05
Image に描画したら消せませんよね。

だから、当初に
・PictureBox.MouseMove
  描画データの生成
  描画データ配列への追加
  PictureBox.Invalidate (今回変更された領域のみ Invalidate するとベター)
・PictureBox.Paint
  描画データ配列の描画
・取消
  描画データ配列から要素削除
  PictureBox.Invalidate (今回変更された領域のみ Invalidate するとベター)
・保存
  Bitmap を生成
  Graphics を生成
  描画データ配列の描画
  保存
を提案したのですが。

あと、IDisposable を実装しているオブジェクト(Graphics や Bitmap)は、使い終わったら Dispose したほうがいいですね。

スキルアップ/キャリアアップ(JOB@IT)