tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルドラッグアンドドロップで悩んでいます・・・
記事No2904
投稿日: 2006/01/16(Mon) 15:39
投稿者ふき
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

[OSのVer]:Windows XP   [VBのVer]:VB.NET  

初めて投稿させていただきます。ふきといいます。
VB.NETを始めて数日程度の初心者ですが、よろしくお願いいたします。

ドラッグアンドドロップで悩んでいるというのは、
2つのピクチャーボックス間で。
1方のピクチャーボックスの色を、
ドラッグアンドドロップで、
もう1方のピクチャーボックスに色を移動させる事なのです。


MicrosoftのMSDNや、様々なサイトを探してみたのですが、
ドラッグアンドドロップに関しての記述はあるものの、
ピクチャーボックスに関してのドラッグアンドドロップに関する記述がどうも見つからないのです。


以下、自分でやってみたものです。

下の様にして、1つめのPictureBox1に赤の四角形を描きました。

Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
            Dim redBrush As New SolidBrush(Color.Red)
            Dim x As Single = 0.0F
            Dim y As Single = 0.0F
            Dim width As Single = 200.0F
            Dim height As Single = 200.0F
            e.Graphics.FillRectangle(redBrush, x, y, width, height)
End Sub


もう1方のPictureBox2には、以下の様に、背景が白色の四角形を描きました。

Private Sub PictureBox2_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles PictureBox2.Paint
            Dim blueBrush As New SolidBrush(Color.White)
            Dim x As Single = 0.0F
            Dim y As Single = 0.0F
            Dim width As Single = 200.0F
            Dim height As Single = 200.0F
            e.Graphics.FillRectangle(blueBrush, x, y, width, height)
End Sub


上記の赤色のPictureBox1をドラッグアンドドロップして、
もう一方の白色のPictureBox2の方に色をコピーするには、
どのようにしたらよいでしょうか?


大変恐縮ですが、
よろしくお願い致します。

[ツリー表示へ]
タイトルRe: ドラッグアンドドロップで悩んでいます・・・
記事No2907
投稿日: 2006/01/16(Mon) 16:01
投稿者花ちゃん
> ドラッグアンドドロップで悩んでいるというのは、
> 2つのピクチャーボックス間で。
> 1方のピクチャーボックスの色を、
> ドラッグアンドドロップで、
> もう1方のピクチャーボックスに色を移動させる事なのです。

ドラッグアンドドロップ操作でなければ色を移動させる事ができるのですか?
それぞれのマウスのイベントで色を取得して、取得した色をドロップした位置に
塗ればいいのでは?

[ツリー表示へ]
タイトルRe^2: ドラッグアンドドロップで悩んでいます・・・
記事No2908
投稿日: 2006/01/16(Mon) 16:11
投稿者ふき
[OSのVer]:Windows    [VBのVer]:VB.NET  


花ちゃんさん、お返事ありがとうございます。

> ドラッグアンドドロップ操作でなければ色を移動させる事ができるのですか?
> それぞれのマウスのイベントで色を取得して、取得した色をドロップした位置に
> 塗ればいいのでは?

マウスのイベントで色を取得するというのは、
このような感じでいいのでしょうか?

Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    PictureBox1.DoDragDrop(PictureBox1.BackColor, DragDropEffects.Copy)
End Sub

また、
取得した色をドロップした位置に塗るというのが、
どうもいきずまってまして・・・
今DragEnterを使ってやってみているのですが、
どうも上手くいかないのです・・・

大変恐縮ですが、
取得した色をドロップした位置に塗る操作を
教えていただけないでしょうか?
大変申し訳ありませんが、よろしくお願い致します。

[ツリー表示へ]
タイトルRe^3: ドラッグアンドドロップで悩んでいます・・・
記事No2909
投稿日: 2006/01/16(Mon) 16:37
投稿者ふき
[OSのVer]:Windows    [VBのVer]:VB.NET  
> [OSのVer]:Windows    [VBのVer]:VB.NET  

大変申し訳ありません・・・
教えてもらうのを乞う事は、掲示板で反則である事を忘れていました・・・
本当に申し訳ありません。

以下、DragEnterを使ってやってみたものです。

Private Sub PictureBox3_DragEnter(ByVal sender As Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles PictureBox3.DragEnter
            If (e.Data.GetDataPresent(GetType(System.Drawing.Brushes))) Then
                e.Effect = DragDropEffects.Copy
            End If
        End Sub

大変恐縮ですが、
前記の、MouseDownでPictureBox1の色を取得して。
PictureBox2にDragEnterでコピーするという自分の方針は合っているのでしょうか?
正直、それすら自信がありません。

大変申し訳ありませんが、
ご指摘いただけたら幸いです。

[ツリー表示へ]
タイトルRe^4: ドラッグアンドドロップで悩んでいます・・・
記事No2912
投稿日: 2006/01/16(Mon) 22:29
投稿者花ちゃん
他にいい方法があるかも知れませんが(クリップボードのフォーマットを追加する等)
カラー値を文字型に変換して渡してやれば比較的簡単です。
(ColorTranslator で変換して下さい)
Form にPictureBox を2個貼り付けて下記のコードを試して見て下さい。

Private Sub PictureBox1_MouseDown(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
   PictureBox2.AllowDrop = True
   PictureBox1.DoDragDrop(ColorTranslator.ToWin32( _
               PictureBox1.BackColor).ToString, DragDropEffects.Copy)
End Sub

Private Sub PictureBox2_DragDrop(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.DragEventArgs) Handles PictureBox2.DragDrop
   Dim col As Integer = Integer.Parse(e.Data.GetData(DataFormats.Text, True))
   PictureBox2.BackColor = ColorTranslator.FromWin32(col)
   PictureBox2.AllowDrop = False
End Sub

Private Sub PictureBox2_DragEnter(ByVal sender As Object, _
     ByVal e As System.Windows.Forms.DragEventArgs) Handles PictureBox2.DragEnter
   If e.Data.GetDataPresent(DataFormats.Text) Then
      e.Effect = DragDropEffects.Copy
   Else
      e.Effect = DragDropEffects.None
   End If
End Sub

[ツリー表示へ]
タイトルRe^5: ドラッグアンドドロップで悩んでいます・・・
記事No2913
投稿日: 2006/01/16(Mon) 23:59
投稿者ふき
[OSのVer]:Windows    [VBのVer]:VB.NET  
> 他にいい方法があるかも知れませんが(クリップボードのフォーマットを追加する等)
> カラー値を文字型に変換して渡してやれば比較的簡単です。
> (ColorTranslator で変換して下さい)
> Form にPictureBox を2個貼り付けて下記のコードを試して見て下さい。

花ちゃんさん、お返事本当にありがとうございます。

カラー値を文字列にして、それを渡してやる事で実現できるなんて思ってもいませんでした。

本当にありがとうございます。

[ツリー表示へ]
タイトルRe^6: ドラッグアンドドロップで悩んでいます・・・
記事No2914
投稿日: 2006/01/17(Tue) 01:15
投稿者ふき
[OSのVer]:Windows  XP  [VBのVer]:VB.NET  
> [OSのVer]:Windows  XP  [VBのVer]:VB.NET  
> > 他にいい方法があるかも知れませんが(クリップボードのフォーマットを追加する等)
> > カラー値を文字型に変換して渡してやれば比較的簡単です。
> > (ColorTranslator で変換して下さい)
> > Form にPictureBox を2個貼り付けて下記のコードを試して見て下さい。
>

花ちゃんさん、先ほどは本当にありがとうございました。


大変恐縮ですが、
もう1つ、質問があります。

先ほどのコードを編集し、
ふきが以前から考えていた絵の具のような機能をもたせるために、
Form にPictureBoxを3個貼り付け、
それぞれのPictureBoxの色を、Red、Blue、Whiteとしました。

RedをWhiteにドラッグアンドドロップして、
WhiteのPictureBoxがRedになるのはよかったのですが、
次にWhiteからRedに変わったPictureBoxにBlueをドラッグアンドドロップすると、
RedからBlueではなく、
RedとBlueを混ぜたMagentaのような色になるようにしたいと思っています。

これを実現するためには、
先ほど教えていただいた、ColorTranslatorで取得したBackColorの色と、
ドラッグアンドドロップされるPictureBoxのBackColorとの色の関係によって
変化させればよさそうなのですが、
具体的にどのように書いていけばよいのか、
見当がつかず、困っています。

大変申し訳ありませんが、
何かアドバイスいただけましたらご教授お願いいたします。

[ツリー表示へ]
タイトルRe^7: ドラッグアンドドロップで...
記事No2915
投稿日: 2006/01/17(Tue) 09:53
投稿者花ちゃん
> 次にWhiteからRedに変わったPictureBoxにBlueをドラッグアンドドロップすると、
> RedからBlueではなく、
> RedとBlueを混ぜたMagentaのような色になるようにしたいと思っています。

だったら色(R・G・B)を合成すればいいのでは。
ドラッグ元の色とドラッグ先の色のR・G・Bを合成して下さい。
赤(255,0,0)+青(0,0,255)=マゼンタ(255,0,255) (128,0,128)

詳しい色の合成の方法は、ここの[当サイト内・外の検索]から[色の合成]を
キーワードにGoogle等で検索して見て下さい。

[ツリー表示へ]
タイトルRe^8: ドラッグアンドドロップで..
記事No2923
投稿日: 2006/01/17(Tue) 13:46
投稿者ふき
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

花ちゃんさん、お返事ありがとうございます。

> だったら色(R・G・B)を合成すればいいのでは。
> ドラッグ元の色とドラッグ先の色のR・G・Bを合成して下さい。
> 赤(255,0,0)+青(0,0,255)=マゼンタ(255,0,255) (128,0,128)

「RGB」をキーワードとして、MSDNで検索した結果、

Dim red, rgbValue As Integer
Dim i As Integer = 75
red = RGB(255, 0, 0)
rgbValue = RGB(i, 64 + i, 128 + i)    

このようなプログラムの例が出てきたので、

VBレスキューさんの、「テキストボックスのバックカラーを設定する」のところに、

TextBox1.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(255, 0, 255))

というのを参考にさせてもらって、


Dim red, blue As Integer
red = RGB(255, 0, 0) ←PictureBox1の色
blue = RGB(0, 0, 255) ←PictureBox2の色
   if PictureBox3のBackColorがWhiteなら
   if ドラッグされてきた色が赤ならば

PictureBox3.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(255, 0, 0))

    Endif
    Endif

    if PictureBox3のBackColorがRedなら
   if ドラッグされてきた色がblueならば、

PictureBox3.BackColor = ColorTranslator.FromWin32(Microsoft.VisualBasic.RGB(255, 0, 255))

    Endif
    Endif

というのを考えてみたのですが、
合成の方針としましてはこのような考え方でよいのでしょうか?

また、PictureBoxが現在何色かというif文の判定は、
自分で調べて試してみたのですが、上手くいきませんでした・・・


大変恐縮ですが、
どのようにコードを書いていいのか、
アドバイスいただけないでしょうか?
よろしくお願い致します。

[ツリー表示へ]
タイトルRe: ドラッグアンドドロップで悩んでいます・・・
記事No2927
投稿日: 2006/01/17(Tue) 14:38
投稿者花ちゃん
色の合成
赤(255,0,0)+青(0,0,255)=マゼンタ(255,0,255) (128,0,128)

赤(r1,g1,b1) + 青(r2,g2,b2) =(r1+r2\2,g1+g2\2,b1+b2\2) マゼンタ になります。

>というのを考えてみたのですが、
>合成の方針としましてはこのような考え方でよいのでしょうか?
試して見て自分の意図する動作で問題なく動けばいいのでは。
私の行く所はここでいいのですか? と聞いているように聞こえます。

>また、PictureBoxが現在何色かというif文の判定は、
>自分で調べて試してみたのですが、上手くいきませんでした・・・
比較する(基準)ものを両方同じ単位にして比較していますか?

   Debug.WriteLine(PictureBox1.BackColor)
   If PictureBox1.BackColor = Color.Red Then
      MessageBox.Show("バックカラーは赤です")
   End If

又、上手く行かないでは見ている人はどう上手くいかないのか解りません
質問する場合は、自分が答える立場で読んで解る様に具体的に書いて下さい。

[ツリー表示へ]
タイトルRe^2: ドラッグアンドドロップで悩んでいます・・・
記事No2928
投稿日: 2006/01/17(Tue) 16:32
投稿者ふき
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

花ちゃんさん、お返事ありがとうございます。

> 色の合成
> 赤(255,0,0)+青(0,0,255)=マゼンタ(255,0,255) (128,0,128)
>
> 赤(r1,g1,b1) + 青(r2,g2,b2) =(r1+r2\2,g1+g2\2,b1+b2\2) マゼンタ になります。

本当にありがとうございます。

> 試して見て自分の意図する動作で問題なく動けばいいのでは。
> 私の行く所はここでいいのですか? と聞いているように聞こえます。
> 又、上手く行かないでは見ている人はどう上手くいかないのか解りません
> 質問する場合は、自分が答える立場で読んで解る様に具体的に書いて下さい。

大変申し訳ありません。
次からは気をつけたいと思います・・・。

恐縮ながら、
今までやってみたところのコードを書かせていただきます。

PictureBox1についてです。

Private Sub PictureBox1_MouseDown(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
            PictureBox3.AllowDrop = True
            Dim red As Integer
            red = RGB(255, 0, 0)
            PictureBox1.BackColor = ColorTranslator.FromWin32(red)
            PictureBox1.DoDragDrop(ColorTranslator.ToWin32(PictureBox1.BackColor).ToString,
DragDropEffects.Copy)
        End Sub




PictureBox2についてです。

Private Sub PictureBox2_MouseDown(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseDown
            PictureBox3.AllowDrop = True
            Dim blue As Integer
            blue = RGB(0, 0, 255)
            PictureBox2.BackColor = ColorTranslator.FromWin32(blue)
            PictureBox2.DoDragDrop(ColorTranslator.ToWin32(PictureBox2.BackColor).ToString,
DragDropEffects.Copy)
        End Sub





PictureBox3のドラッグアンドドロップについてです。

        Private Sub PictureBox3_DragDrop(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles PictureBox3.DragDrop

            PictureBox3.AllowDrop = True
            Dim red, blue, Magenta As Integer
            red = RGB(255, 0, 0)
            blue = RGB(0, 0, 255)
            Magenta = RGB(255, 0, 255)

            If PictureBox3.BackColor = System.Drawing.Color.White Then
                If e.Data.GetDataPresent(DataFormats.Text) = RGB(255, 0, 0) Then
                    PictureBox3.BackColor = ColorTranslator.FromWin32(red)
                End If
            End If


            If PictureBox3.BackColor = System.Drawing.Color.Red Then
                If e.Data.GetDataPresent(DataFormats.Text) = RGB(0, 0, 255) Then
                    'e.Effect = DragDropEffects.Copy

                    PictureBox3.BackColor = ColorTranslator.FromWin32(Magenta)
                    'e.Effect = DragDropEffects.None


                End If
            End If
        End Sub

        Private Sub PictureBox3_DragEnter(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.DragEventArgs) Handles PictureBox3.DragEnter
            PictureBox3.AllowDrop = True
            Dim red, blue, Magenta As Integer
            red = RGB(255, 0, 0)
            blue = RGB(0, 0, 255)
            Magenta = RGB(255, 0, 255)

            If PictureBox3.BackColor = System.Drawing.Color.White Then
                    If e.Data.GetDataPresent(DataFormats.Text) = RGB(255, 0, 0) Then
                        PictureBox3.BackColor = ColorTranslator.FromWin32(red)
                End If
            End If


            If PictureBox3.BackColor = System.Drawing.Color.Red Then
                If e.Data.GetDataPresent(DataFormats.Text) = RGB(0, 0, 255) Then
                    'e.Effect = DragDropEffects.Copy

                    PictureBox3.BackColor = ColorTranslator.FromWin32(Magenta)
                    'e.Effect = DragDropEffects.None


                End If
            End If
        End Sub

このようにしてみたのですが、
PictureBox1、PictureBox2で取得した色が、
上手くPictureBox3でMagentaの色になったり、
ドラッグアンドドロップが上手くいきません・・・。

大変申し訳ありませんが、
ご教授お願いできませんか?
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe^3: ドラッグアンドドロップで悩んでいます・・・
記事No2929
投稿日: 2006/01/17(Tue) 16:53
投稿者花ちゃん
> 大変申し訳ありませんが、
> ご教授お願いできませんか?

全て作って下さいと同じではないですか?
どれだけの時間考えて試して見ましたか?

[ツリー表示へ]
タイトルRe^4: ドラッグアンドドロップで悩んでいます・・・
記事No2930
投稿日: 2006/01/17(Tue) 17:28
投稿者ふき
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

> 全て作って下さいと同じではないですか?
> どれだけの時間考えて試して見ましたか?

恐縮ですが、
この前の日曜から、できる限り様々なVBのサイトを巡り、
ドラッグアンドドロップに関するサンプルや記述を試してみました・・・。

花ちゃんさんのおっしゃる通り、
自分が書いた事はすべて作ってくださいと言ってるようなものですね・・・。
失礼な発言をしてしまい、大変申し訳ありません。


大変失礼な事をしてしまってこのような事を言うのは恐縮ですが、
花ちゃんさんに頂いたコードに、
具体的なコードではなく、
何をつけくわえたら、自分が思っているような絵の具の機能を持つ、
ドラッグドロップの機能を実現できるのでしょうか?

大変すみませんが、
アドバイスお願いいたします・・・。

[ツリー表示へ]
タイトルRe^5: ドラッグアンドドロップで悩んでいます・・・
記事No2931
投稿日: 2006/01/17(Tue) 17:39
投稿者花ちゃん

> 大変失礼な事をしてしまってこのような事を言うのは恐縮ですが、
> 花ちゃんさんに頂いたコードに、
> 具体的なコードではなく、
> 何をつけくわえたら、自分が思っているような絵の具の機能を持つ、
> ドラッグドロップの機能を実現できるのでしょうか?
>
> 大変すみませんが、
> アドバイスお願いいたします・・・。

今までの回答内容をよく読み返し解らない部分はヘルプ等で調べ投稿した
サンプルを熟読して下さい。

[ツリー表示へ]
タイトルRe^6: ドラッグアンドドロップで悩んでいます・・・
記事No2932
投稿日: 2006/01/17(Tue) 17:48
投稿者ふき
[OSのVer]:Windows XP   [VBのVer]:VB.NET  

> 今までの回答内容をよく読み返し解らない部分はヘルプ等で調べ投稿した
> サンプルを熟読して下さい。

ありがとうございます。やってみます。

大変申し訳ありませんが、またいきずまった時には、
アドバイスよろしくお願い致します。

[ツリー表示へ]