tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルpictureBoxの重なり
記事No6760
投稿日: 2008/01/05(Sat) 17:38
投稿者DOON
DOONです。いつもお世話になっています。
VB.net 2005 WindowsXPで、開発をしています。

pictureboxにbmpもしくはjpgを表示しています。(pic1)

そのbmpのいろんな位置に○を書くようなプログラムを作成しています。

ボタンを押下するたびに、新しいピクチャーボックスをnewしています。
_pic = new PictureBox()

この新しいピクチャーボックスにNewしたBitMapを設定します。
_bmp = new BitMap(20 , 20)
_pic.Image = _picbmp(_count)

そのNewしたBitMapから以下のソースで○を書いています。
dim gra as Graphics =
Graphics.FromImage(_bmp)
gra.DrawEllipse(BPen, 0, 0, 17, 17)


その新しいピクチャーボックスをドラッグドロップして、
○をつけたい位置に置くというプログラムにしています。

元になるbmpに対してnewしたピクチャーボックスをAddしています。
ソースは以下です。
pic1.Controls.Add(_pic)
これで、透過されて、予想通りだったのですが。

○どおしが近づくと、○同士の重なりが描画されません。

どうやったらいいのでしょうか?

一応、上記とはまったく違うやり方として、
newしたPictureBoxのRegionをくりぬきの円にするというやり方で
何とかなるのは見つけたのですが、この方法では納得がいかないのです。

以上、よろしくお願いします。

[ツリー表示へ]
タイトルRe: pictureBoxの重なり
記事No6763
投稿日: 2008/01/07(Mon) 14:00
投稿者y4yama
> VB.net 2005 WindowsXPで、開発をしています。
> ○どおしが近づくと、○同士の重なりが描画されません。

こんちは。 違うやり方として、こちらのTipsにある
「マウスのドラッグで範囲を選択し画像を取得してPictureBox2 に表示 」
を見られたら、再描画を繰り返して線を移動したように見せる方法がわかりますよね
それを応用したらDragは出来ます。今までの描いた円は下のようにListに保存しておいて

    Private pts As New List(Of Point)
    Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        pts.Add(New Point(e.X, e.Y))
        PictureBox1.Refresh()
        draw_cir()
    End Sub
    Private Sub draw_cir()
        Dim gra As Graphics = PictureBox1.CreateGraphics
        For Each pt1 As Point In pts
            gra.DrawEllipse(Pens.Blue, pt1.X - 6, pt1.Y - 6, 12, 12)
        Next
    End Sub
というようにすれば、できそうですが、いかがでしょう・・・参考になれば幸いです

[ツリー表示へ]
タイトルRe^2: pictureBoxの重なり
記事No6764
投稿日: 2008/01/07(Mon) 14:16
投稿者DOON
DOONです。
返事ありがとうございます。
納期が近くて、あせってしまって、一時間に一回ぐらいのぞいてました。

これは一枚のピクチャーボックスに
いくつもの○を書いていくという形ですよね。
これも、現在検討しています。
まだ、この方法では、作成していないので、
もし作成する場合参考に、させてもらいます。

このやり方で、○をドラッグドロップすると
描画の回数が多くなって、ちらついたりするでしょうか?

以上、よろしくお願いします。

やはり、
現状は、一つの○に対して一つのピクチャーボックスで
考えています。
やはりこのやり方は無理なのでしょうか?
ImageAttributesやBitbltを読んでますが、それはBMPだけに対してであって
PictureBoxには無効そうですし・・・。



[ツリー表示へ]
タイトルRe^3: pictureBoxの重なり
記事No6765
投稿日: 2008/01/07(Mon) 14:55
投稿者y4yama
> このやり方で、○をドラッグドロップすると
> 描画の回数が多くなって、ちらついたりするでしょうか?
御自分で実験してくださいませ

それから、Dragするのは1つの○だけで、それまでの○は確定(位置固定)でいいのなら、
それまでの○はBitMapにDraw系で描き込んでしまう・・・という手もあるかと・・・
前提というかやりたい事が漠然としてるので、どなたも返事がしづらいのカナ?と思います

[ツリー表示へ]
タイトルRe^4: pictureBoxの重なり
記事No6766
投稿日: 2008/01/07(Mon) 15:16
投稿者DOON
DOONです。お世話になっています。
> 御自分で実験してくださいませ
そうですよね。了解です。

> それから、Dragするのは1つの○だけで、それまでの○は確定(位置固定)でいいのなら、
> それまでの○はBitMapにDraw系で描き込んでしまう・・・という手もあるかと・・・
> 前提というかやりたい事が漠然としてるので、どなたも返事がしづらいのカナ?と思います
説明が下手ですね。
すいません。
○は何回でも動かせる形ですね。
○の大きさも、ひとつひとつ違いますし、色も違います。

PictureBoxの背景を透明にしたいということです。
PictureBoxが何枚も重なっても、全ての○が見えて欲しいということです。
PictureBoxのせいで、重なりが見えないのです。

以上、よろしくお願いします。

[ツリー表示へ]
タイトルRe^5: pictureBoxの重なり
記事No6767
投稿日: 2008/01/08(Tue) 11:15
投稿者花ちゃん
> PictureBoxの背景を透明にしたいということです。

下記を試して見て下さい。
http://www.microsoft.com/japan/msdn/vbasic/migration/tips/TransparentControl/


因みに、同様の方法で、RichTextBox の背景を透明にしようと思ったのですが、
一応、透明にはなりますが、文字等が表示されません。
自分ですべて描画する必要があるのでしょうか?
Win32 API関数を使った方法だと簡単に実現できるのですが...。

[ツリー表示へ]
タイトルRe^6: pictureBoxの重なり
記事No6790
投稿日: 2008/01/10(Thu) 16:45
投稿者DOON
> > PictureBoxの背景を透明にしたいということです。
>
> 下記を試して見て下さい。
> http://www.microsoft.com/japan/msdn/vbasic/migration/tips/TransparentControl/
>
>
> 因みに、同様の方法で、RichTextBox の背景を透明にしようと思ったのですが、
> 一応、透明にはなりますが、文字等が表示されません。
> 自分ですべて描画する必要があるのでしょうか?
> Win32 API関数を使った方法だと簡単に実現できるのですが...。

DOONです。お世話になっています。

返事遅くなりました。
上記の方法でも、ピクチャーボックスはダメでした。
納期も迫っているので、
y4yamaさんのようなやり方で、いくようにしました。
一応完成しました。
ごり押しみたいなプログラムで嫌だなーと思っていたのですが。
納期が、納期ですので。

ありがとうございました。
またよろしくお願いします。

[ツリー表示へ]
タイトルRe^7: pictureBoxの重なり
記事No6793
投稿日: 2008/01/11(Fri) 09:14
投稿者y4yama
> 上記の方法でも、ピクチャーボックスはダメでした。
たしかに・・UserControl1同士が重なると、Regionで上のほうが優先判断されてしまって
下のUserControl1には描画してくれないです

> ごり押しみたいなプログラムで嫌だなーと思っていたのですが。
そうでもないと思いますよ。今動かすべき1つの○だけDragで再描画する(またはPictureBoxでも可能)・その他はBitmap1に描きこんでおく。
他のを移動したい時は、そいつを1つの(PictureBoxに変えてもいいし)今動かすべきものにして、同じしょりが出来る。Bitmapは○を全く描いてないBitmap0も準備しておいて、必要に応じて○を何個か書き込んだBitmap1を広い全面に見せる・・・とか・・

ところで、ピクチャーボックスではダメですが、Form2だとOKでした
Form2を、○1個のアイコンのように扱って
Private Sub Form2_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
        Dim g As Graphics = e.Graphics
        g.DrawEllipse(Pens.Blue, 20, 20, 17, 17)
End Sub
.TopMost=True,  TransparencyKeyをBackColorにして、FormBorderStyle=Noneで枠なし
としました。

Public Class Form1
    Dim f21 As New Form2
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Show()
        f21.Show()
        f21.Top = Me.Top + 60
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim f22 As New Form2
        f22.Show()
        f22.Top = f21.Top + 10
        f22.Left = f21.Left + 3
    End Sub

これで、うまく○が両方でました。UserControl1でも何かヒミツを探れば、出来るんでしょうが・・ベテランの方のアドバイスをお待ちします・・・
f21,f22は親のないFormですから、Form1を移動したときには、それなりに制御してやらないと連動しませんし、あとf21はマウスでピックするのは無理でしょう・・でも、表示だけ考えれば使える方法かも知れませんネ

[ツリー表示へ]