• 締切済み

再描画すると消える

ピクチャーボックスに以下のような図形を描画するプログラムを書きました。 (PictureBox1のBackGroundImageには最初から適当なイメージが設定されています。) Dim Grp As Graphics Grp = Graphics.FromImage(Me.PictureBox1.BackgroundImage) Grp.FillEllipse(New SolidBrush(PaintSelectedColor), e.X - Me.PictureBox1.Location.X - PaintHutosa \ 2, e.Y - Me.PictureBox1.Location.Y - PaintHutosa \ 2, PaintHutosa, PaintHutosa) Grp.Dispose() Me.PictureBox1.Refresh() しかし、これを実行すると再描画されたときに消えてしまいます。 消えてしまう原因と、消えないようにする対処法をご伝授ください。

みんなの回答

回答No.1

VB2005でPicturBox1を配置し、Backgroundプロパティを設定。 MouseMoveイベントで記載したコードを実行してみましたところ、再描画しても消えませんでした。(各変数部分は適当な数値に置き換えました。) 「再描画」がどのような処理をしているのか分かりませんが、その際にPictureBox1.BackgroundImageプロパティを再設定しているとかないですか?

関連するQ&A

  • VB.NETのグラフィック描画で困っています

    VB.NETでのグラフィックの記述方法ですが 何かをクリックすると描画させるのではなく 単にあるsubプロシージャ内でグラフィックを描画させる記述する方法として pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) を教えていただきました。そこで private sub xy_keisan() '座標を計算させるプロシージャ disp_x() 'x座標に目盛りを表示させるプロシージャ disp_Y() 'xの目盛り数によってY座標の位置を変えて表示させるプロシージャ end sub private sub disp_x() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub private sub disp_y() pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) g.DrawLine(****** end sub のような記述(引数とか細かい所は端折っています)ですとdisp_yは描画されていますが,disp_xは消えてしまいます。 pictureBox1.Image=New Bitmap(PictureBox1.width,pictureBox1.Height) が消えてしまう原因だとおもって宣言場所を変えてみましたが同じです 逆にこれが無いと描画させることが出来なくなります。 これの意味も今ひとつ判りません よろしくお願い致します

  • グラフィックの描画をするとButtonが表示されない

    グラフィックの描画をするとasp:buttonが表示されなくなったのですが、どうすれよろしいでしょうか? aspx.csファイルに下記を記述しました。 protected void Page_Load(object sender,EventArgs e) {   Bitmap bitmap = new Bitmap(100,100);   Graphics grp = Graphics.FromImage(bitmap);   grp.Clear(Color.DarkCyan);   Response.ContentType = "image/jpeg";   bitmap.Save(Response.OutputStream, ImageFormat.Gif);   bitmap.Dispose();   graphics.Dispose(); } あとはデザイン画面でボタンを1個張り付けましたが、ボタンが表示されません。 どうすればよろしいでしょうか?

  • 図の削除直後の再描画

    VB2008 Express Edditionを使って、写真画像に直線等の図形を重ねる プログラムを作っています。 PictureBoxのBackgroundImageに写真画像を設定し、 Dim gp As Graphics = PictureBox1.CreateGraphics() gp.DrawLine(Pens.Pink, 100, 100, 300, 300) gp.Dispose() といった書式で図形が描画できること、それを削除するには If Not (PictureBox1.Image Is Nothing) Then PictureBox1.Image.Dispose() End If PictureBox1.Image = Nothing とすれば良いことは分かりました。 次に、例えば(100,100)-(300,300)の直線を(100,100)-(300,290)に 変更するような修正をしたいのですが、上記の図形削除と描画を 組み合わせれば良いと考えてやってみたのですが、一瞬図形が 表示されてすぐに消えてしまいます。 図形削除と再描画を別々のボタンに割り当てるとうまくいくのですが、 1つのボタンに割り当てて続けて行うとダメなようです。 これを回避するにはどうすればいいでしょうか?

  • 描画した後での塗りるぶし VB

    丸を描画後にColorDialogで指定された色で丸の範囲だけ塗りつぶすというプログラムを作っているのですが、なかなかうまくいきません。 丸は、このように描画するようにしています。 Private Sub PictureBox1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove If (e.Button = MouseButtons.Left) Then Dim g As Graphics = PictureBox1.CreateGraphics() Dim ePos As MouseEventArgs PictureBox1.Refresh() g.DrawEllipse(New Pen(Color.Black, 2), Spos.X, Spos.Y, e.X - Spos.X, e.Y - Spos.Y) ePos = e g.Dispose() End If End Sub Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown If (e.Button = System.Windows.Forms.MouseButtons.Left) Then Spos = e End If End Sub VB2010を使っています。 どなたか教えていただけるとありがたいです。よろしくお願いします。

  • VB2005 コード記述作法

    VBのコード記述作法に自身がなく不安です。 CADのラバーラインのような感じです。 PictureBoxを置いてFormの上下左右にアンカーしてるだけです。 lineモードにXorがないので下記のようにしました。 今は、とりあえず動いてますが、<?>印部分をここに記述しても安定動作しますか? (メモリの無駄使いとか・CPUの負荷とか) 又Form1_Resizeで再描画してますが、Windowを最小化すると当然でしょうが PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) でエラーになります。 これを防ぐ方法を教えて下さい。 Public Class Form1 Private sx, sy, ex, ey As Integer Private flg As Boolean = False Private fg, bg As Graphics   '----<?>---- Private d(100, 4) As Integer Private po As Integer = 1 '-------------------------------- Private Sub PictureBox1_MouseDown(~~ If flg = False Then sx = e.X sy = e.Y ex = sx ey = sy flg = True fg = PictureBox1.CreateGraphics() '----<?>---- Else flg = False ex = e.X ey = e.Y PictureBox1.Refresh() fg.Dispose() '----<?>---- bg = Graphics.FromImage(PictureBox1.Image) '----<?>---- bg.DrawLine(Pens.Black, sx, sy, ex, ey) bg.Dispose() '----<?>---- PictureBox1.Refresh() d(po, 1) = sx d(po, 2) = sy d(po, 3) = ex d(po, 4) = ey po = po + 1 End If End Sub '-------------------------------- Private Sub PictureBox1_MouseMove(~~ If flg = True Then PictureBox1.Refresh() fg.DrawLine(Pens.Blue, sx, sy, e.X, e.Y) ex = e.X ey = e.Y End If End Sub '-------------------------------- Private Sub Form1_Resize(~~ Dim x As Integer PictureBox1.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) bg = Graphics.FromImage(PictureBox1.Image) ' ----<?>---- For x = 1 To po - 1 bg.DrawLine(Pens.Black, d(x, 1), d(x, 2), d(x, 3), d(x, 4)) Next bg.Dispose() ' ----<?>---- End Sub '-------------------------------- End Class

  • VB.NETのグラフィック描画について

    グラフィック描画ですが、引数を持たないサブルーチンプロシージャ(固定的な 目盛り等)は、PictureBox_paint(***イベントプロシージャ内に記述すればグラフィック描画ができます(e.Graphicsでグラフィックスオブジェクトを取得できる為)が、 X、Y座標を引数としたサブルーチンプロシージャを作り、その中でLineDraw(*****で描画させたい場合サブルーチンプロシージャ内に dim g As Graphics=pictureBox1.CreateGraphics() でグラフィックオブジェクトを生成しても 描画できないのですがどのようにすれば解決できるでしょうか(イメージがわかり難いかもしれませんのでサンプルを書きました) よろしくお願いします (1)private sub pictureBox1_paint(Byval sender as Object, Byval e as system****** e.Graphics.DrawLine(****** (これは描画できる) End Sub (2)private sub zahyou() ' 座標を生成するサブルーチンプロシージャ dim i as integer for i=0 to 10 hyouji( i , i*5 ) End Sub private sub hyouji( x as integer, y as integer) ’直線を引くサブルーチンプロシージャ dim g As Graphics=pictureBox1.CreateGraphics() g.DrawLine(***,x,y**** (これは描画できない)

  • C# PictureBoxへの描画を行うとメッセージボックスが表示されません。

    いつもお世話になっております。 ふと、PictureBoxに描画をしてみようかと思い Paintイベントに以下のようにして描画を行いました。   myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);   Graphics g = Graphics.FromImage(myBitmap);   pictureBox1.Image = myBitmap;      ・      ・(g.FillRectangle(・・・);など)      ・ (myBitmapはBitmap型のグローバル変数です。) PictureBoxは、自由にサイズ変更可能なフォームに貼り付け、四方をanchorで固めています。 そのためサイズが変更されるたびに、描画するときBitmapのサイズも変更しないといけないので この処理を毎回通っています。 (その部分が何だか無駄な気がするのですが、他にいい方法が思いつきませんでした。) ところが、描画はうまくいったのですが、メッセージボックスを出すと そのメッセージボックスが一度Altキーを押さないと表示されません。 色々調べて、ダブルバッファリングというものがあると知りました。 そこでPaintイベントで最初にこの処理をし   Image image = new Bitmap(pictureBox1.Width, pictureBox1.Height);   g = Graphics.FromImage(image); gに描画し終わってから   e.Graphics.DrawImage(image, 0, 0); としてみると、今度はフォームを移動するのにも一瞬フリーズするようになってしまいました。 (あまり深くプログラミングをしたことがないので、理解しきれなくてやり方が悪いのかも知れません・・・) メッセージボックスが表示されないのは、PictureBoxの描画のため 他のコントロールの描画ができていなためだと推測しているのですが どう直していいかわかりません。 どなたか、わかる方がいましたらよろしくお願いします。 <補足> OS:Vista VisualStudio2008 .NET Framework3.5

  • VB.NETでPictureBoxへの描画について

    VB.NETでPictureBoxへの描画について PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、 どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。 まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。 そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。 画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、 困っております。 プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。 1.PictureBox全体に描画する(画像も含め) Dim g As Graphics = PictureBox1.CreateGraphics 2.画像のみに描画する Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) ちなみに、マウスではなく、ボタンクリック時に描画した時は、1の場合でも上手くいきます。 お手数ですが、ご回答の程、よろしくお願いします。

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

  • PictureBoxの描画について

    VB2005を使用してPictureBoxに線を描きました。  Dim g As Graphics = PictureBox1.CreateGraphics()  g.DrawLine(p, X1, Y1, X2, Y2) 線は上手く描けたのですが、表示している画面(Form)を最小化して再度最大化すると、描いた線が消えてしまいます。FormをHideしてもう一度Showしても同じです。 この描画を消さないようにするには、どうすればよいでしょうか?

専門家に質問してみよう