C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: VB.NETでドロップ出来るコントロールを2つ配置するには?


(過去ログ 82 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■48728 / inTopicNo.1)  VB.NETでドロップ出来るコントロールを2つ配置するには?
  
□投稿者/ ねーむ (1回)-(2010/04/13(Tue) 16:30:24)

分類:[.NET 全般] 

VB2005でラベルを2つ配置を行い、そこにドロップされた画像ファイルをそのラベルに対応するピクチャボックスへ画像を表示させるプログラムを作成したいのですが、
1つ目ラベルへのドロップ機能は実装できたのですが、2つ目のラベルへのドロップ機能が実装できません。
両方、基本的には同じ内容でコーディングしたのですが、2つ目のラベルへドロップを行うとドロップが行えないときのマウスカーソルになります。

2つ以上配置する場合は他になにか設定する必要があるのでしょうか?

よろしくお願いします。
引用返信 編集キー/
■48731 / inTopicNo.2)  Re[1]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ .SHO (1282回)-(2010/04/13(Tue) 16:40:44)
No48728 (ねーむ さん) に返信
> VB2005でラベルを2つ配置を行い、そこにドロップされた画像ファイルをそのラベルに対応するピクチャボックスへ画像を表示させるプログラムを作成したいのですが、
> 1つ目ラベルへのドロップ機能は実装できたのですが、2つ目のラベルへのドロップ機能が実装できません。
> 両方、基本的には同じ内容でコーディングしたのですが、2つ目のラベルへドロップを行うとドロップが行えないときのマウスカーソルになります。
>
> 2つ以上配置する場合は他になにか設定する必要があるのでしょうか?
>
> よろしくお願いします。

これだけの情報で回答するのは無理です。
もう少し詳しく書いてください。
引用返信 編集キー/
■48732 / inTopicNo.3)  Re[2]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ ねーむ (2回)-(2010/04/13(Tue) 16:54:25)
No48731 (.SHO さん) に返信
> これだけの情報で回答するのは無理です。
> もう少し詳しく書いてください。

すいません。。

内容は、フォームの画面をラベル1とラベル2で2分割し、それぞれのラベルへエクスプローラから画像ファイルをドロップし、
ドロップされた画像を表示するという内容です。

ラベル1はちゃんと動くのですが、ラベル2へドロップを行うとドロップをうけつけてくれません。
基本的は同じソースを書いたつもりなのですが。


よろしくお願いします。

----以下ソース-----

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'Label1の親コントロールをPictureBox1とする
        PictureBox1.Controls.Add(Label1)

        'Label2の親コントロールをPictureBox1とする
        PictureBox2.Controls.Add(Label2)

    End Sub

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

        Dim strFilePass As String
        Dim intH As Double
        Dim intW As Double
        Dim bmp As Bitmap
        Dim small As Bitmap

        'PictureBox1の初期化
        If Me.PictureBox1.Image IsNot Nothing Then
            Me.PictureBox1.Image.Dispose()
        End If
        Me.PictureBox1.Image = Nothing

        strFilePass = e.Data.GetData(DataFormats.FileDrop)(0)
        bmp = New Bitmap(strFilePass)

        '画像サイズを変更する
        If bmp.Size.Height <= bmp.Size.Width Then

            intH = bmp.Size.Height * (PictureBox1.Size.Width / bmp.Size.Width)
            intW = bmp.Size.Width * (PictureBox1.Size.Width / bmp.Size.Width)

        Else
            intH = bmp.Size.Height * (PictureBox1.Size.Height / bmp.Size.Height)
            intW = bmp.Size.Width * (PictureBox1.Size.Height / bmp.Size.Height)

        End If
        small = New Bitmap(bmp, intW, intH)
        bmp.Dispose()
        PictureBox1.Image = small

        pStr_BeforeFilePass = strFilePass


    End Sub

    Private Sub Label1_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Label1.DragEnter

        If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
            e.Effect = DragDropEffects.Copy

        Else
            e.Effect = DragDropEffects.None

        End If

    End Sub

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

        Dim strFilePass As String
        Dim intH As Double
        Dim intW As Double
        Dim bmp As Bitmap
        Dim small As Bitmap

        If Me.PictureBox2.Image IsNot Nothing Then
            Me.PictureBox2.Image.Dispose()
        End If
        Me.PictureBox2.Image = Nothing

        strFilePass = e.Data.GetData(DataFormats.FileDrop)(0)
        bmp = New Bitmap(strFilePass)

        '画像サイズを変更する
        If bmp.Size.Height <= bmp.Size.Width Then

            intH = bmp.Size.Height * (PictureBox2.Size.Width / bmp.Size.Width)
            intW = bmp.Size.Width * (PictureBox2.Size.Width / bmp.Size.Width)

        Else
            intH = bmp.Size.Height * (PictureBox2.Size.Height / bmp.Size.Height)
            intW = bmp.Size.Width * (PictureBox2.Size.Height / bmp.Size.Height)

        End If
        small = New Bitmap(bmp, intW, intH)
        bmp.Dispose()
        PictureBox2.Image = small

        pStr_AeforeFilePass = strFilePass


    End Sub

    Private Sub Label2_DragEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Label2.DragEnter

        If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
            e.Effect = DragDropEffects.Copy

        Else
            e.Effect = DragDropEffects.None

        End If

    End Sub




引用返信 編集キー/
■48735 / inTopicNo.4)  Re[3]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ ねーむ (3回)-(2010/04/13(Tue) 17:12:59)
すいません。書き忘れです。
デバックで動きを見るとLabel1.DragEnterのイベントはドラッグ中のカーソルを入れると動きますが、
Label2.DragEnterはドラッグ中のカーソルを入れても動きません。


引用返信 編集キー/
■48737 / inTopicNo.5)  Re[4]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ 魔界の仮面弁士 (1616回)-(2010/04/13(Tue) 17:21:57)
No48735 (ねーむ さん) に返信
> デバックで動きを見るとLabel1.DragEnterのイベントはドラッグ中のカーソルを入れると動きますが、
> Label2.DragEnterはドラッグ中のカーソルを入れても動きません。

Label1 と Label2 で、プロパティの設定を見比べてみて下さい。
何か違っているプロパティがありませんか? (Enabled や AllowDrop など)
引用返信 編集キー/
■48738 / inTopicNo.6)  Re[4]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ Hongliang (600回)-(2010/04/13(Tue) 17:23:30)
2010/04/13(Tue) 17:26:43 編集(投稿者)

Label1_Drag*** のメソッドをコピーして名前変えただけ、じゃないですか?
もしそうなら、そのメソッドと Label2 のイベントを関連づけなければなりません。
デザイナで Label2 を選択し、雷アイコンのイベント一覧から DragEnter などにそのメソッドを設定して下さい。

<追記>って、VB で Handles つきでしたね。じゃあこれは関係ないです。</追記>



あと一応 Label2 の AllowDrop プロパティは大丈夫ですよね?
引用返信 編集キー/
■48740 / inTopicNo.7)  Re[5]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ ねーむ (4回)-(2010/04/13(Tue) 18:02:59)
魔界の仮面弁士さん、Hongliang 回答ありがとうございます。

プロパティ見比べましたが大丈夫でした。AllowDropも確認しましたがTureになっていました。

Enabledできづいたのですが、

ソースの
'Label2の親コントロールをPictureBox1とする
PictureBox2.Controls.Add(Label2)

をコメントアウトし、ラベルとピクチャボックスをかぶせておいていたのをずらしておいてみたら、うまいこと動きました。

表示用のピクチャーボックス2とドロップ用のラベル2を同一位置同一サイズでおいているのですが、その際コントロールの順番とかは関係あるのでしょうか?
順番適当に変えたり、コントロールを消しておきなおしてみたりしましたが、うまくいきませんでしたが。

よろしくお願いします。

引用返信 編集キー/
■48741 / inTopicNo.8)  Re[6]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ 魔界の仮面弁士 (1617回)-(2010/04/13(Tue) 18:19:56)
2010/04/13(Tue) 18:38:54 編集(投稿者)

No48740 (ねーむ さん) に返信
> 'Label2の親コントロールをPictureBox1とする
> PictureBox2.Controls.Add(Label2)
> をコメントアウトし、ラベルとピクチャボックスをかぶせておいていたのをずらしておいてみたら、うまいこと動きました。

駄目だった方のコントロールの親子関係は、

[Form1]
┣[PictureBox1]
┃┗[Label1] 反応あり
┗[PictureBox2]
 ┗[Label2] 反応無し

という認識であっていますか?
だとすれば、Label1 が成功するなら、Label2 も期待動作しそうな物ですが…。


> ずらしておいてみたら、うまいこと動きました。
Controls.Add した後の座標調整が無いようですが、デザイン時に調整済みなのでしょうか?
『枠付きラベル』『半透明ラベル』などを重ねてみて、目的の座標位置に配置されているか
再確認してみてはいかがでしょう。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
 'Label2.Size = PictureBox2.Size
 PictureBox2.BackColor = Color.Red
 Label2.BackColor = Color.FromArgb(128, Color.Blue)
 PictureBox2.Controls.Add(Label1)
 'Label2.Location = Point.Empty
End Sub


> 表示用のピクチャーボックス2とドロップ用のラベル2を同一位置同一サイズでおいているのですが
Label2 を使わず、直接 PictureBox2 にドロップさせるのだと、何か都合が悪いのでしょうか?

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
 PictureBox2.AllowDrop = True
End Sub


> その際コントロールの順番とかは関係あるのでしょうか?
親子関係ではなく、同じ層にいるのであれば
 デザイン時:右クリックして[最前面/最背面に移動]。
 実行時:BringToFront/SendToBackメソッド
で、Zオーダーを変更できます。今回の件の解決になるかどうかはわかりませんけれども。


>>> 基本的は同じソースを書いたつもりなのですが。
それぞれのイベント、たとえば Label1_DragDrop と Label2_DragDrop の内容はほぼ同一のようなので、
Handles 句の割り当てを『Handles PictureBox1.DragDrop, PictureBox2.DragDrop』指定にして、
PictureBox1/2 に対して処理している部分を
 Dim p As PictureBox = DirectCast(sender, PictureBox)
として処理するようにした方が、見通しが良いかと思います。
引用返信 編集キー/
■48742 / inTopicNo.9)  Re[7]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ ねーむ (5回)-(2010/04/13(Tue) 18:43:44)
No48741 (魔界の仮面弁士 さん) に返信
> 2010/04/13(Tue) 18:30:50 編集(投稿者)
>
> ■No48740 (ねーむ さん) に返信
>>'Label2の親コントロールをPictureBox1とする
>>PictureBox2.Controls.Add(Label2)
>>をコメントアウトし、ラベルとピクチャボックスをかぶせておいていたのをずらしておいてみたら、うまいこと動きました。
>
> 駄目だった方のコントロールの親子関係は、
>
> [Form1]
> ┣[PictureBox1]
> ┃┗[Label1] 反応あり
> ┗[PictureBox2]
>  ┗[Label2] 反応無し
>
> という認識であっていますか?
> だとすれば、Label1 が成功するなら、Label2 も期待動作しそうな物ですが…。

であっています。

>
>
>>表示用のピクチャーボックス2とドロップ用のラベル2を同一位置同一サイズでおいているのですが
> Label2 を使わず、直接 PictureBox2 にドロップさせるのだと、何か都合が悪いのでしょうか?
>
> Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
>  PictureBox2.AllowDrop = True
> End Sub

この方法でいけました!!。ありがとうございます。
はじめはこの方法をとっていたのですが、うまいこと動かなかったので今の方法にかえたのですが・・・・

> >>> 基本的は同じソースを書いたつもりなのですが。
> それぞのイベント、たとえば Label1_DragDrop と Label2_DragDrop の内容はほぼ同一のようなので、
> Handles 句の割り当てを『Handles PictureBox1.DragDrop, PictureBox2.DragDrop』指定にして、
> PictureBox1/2 に対して処理している部分を
>  Dim p As PictureBox = DirectCast(sender, PictureBox)
> として処理するようにした方が、見通しが良いかと思います。

おっしゃる通りです、そうします。

回答して下さった皆様。
ラベルの方法がなぜ出来なかったかはわかりませんが、ピクチャーボックスに直接ドロップする方法がいけましたのでそちらでいきます。
ご助力ありがとうございました!





解決済み
引用返信 編集キー/
■48743 / inTopicNo.10)  Re[7]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ ねーむ (6回)-(2010/04/13(Tue) 19:03:53)
No48741 (魔界の仮面弁士 さん) に返信
> 2010/04/13(Tue) 18:38:54 編集(投稿者)
>
>>ずらしておいてみたら、うまいこと動きました。
> Controls.Add した後の座標調整が無いようですが、デザイン時に調整済みなのでしょうか?
> 『枠付きラベル』『半透明ラベル』などを重ねてみて、目的の座標位置に配置されているか
> 再確認してみてはいかがでしょう。
>
> Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
>  'Label2.Size = PictureBox2.Size
>  PictureBox2.BackColor = Color.Red
>  Label2.BackColor = Color.FromArgb(128, Color.Blue)
>  PictureBox2.Controls.Add(Label1)
>  'Label2.Location = Point.Empty
> End Sub

目的の位置にあるのは確認しました。
ただ、表示がLabel1とLabel2を枠をつけて表示した場合、Laber1がピクチャボックス1を被せても見えましたが、
laber2の場合は見えなくなりました。

ラベル・ピクチャボックス両方等もカラーは透明になっています。

親子関係を解除するとラベルの枠は見えるのですが・・・





解決済み
引用返信 編集キー/
■48748 / inTopicNo.11)  Re[8]: VB.NETでドロップ出来るコントロールを2つ配置するには?
□投稿者/ 魔界の仮面弁士 (1618回)-(2010/04/13(Tue) 21:14:21)
No48743 (ねーむ さん) に返信
> ただ、表示がLabel1とLabel2を枠をつけて表示した場合、Laber1がピクチャボックス1を被せても見えましたが、
> laber2の場合は見えなくなりました。
laber → label


> ラベル・ピクチャボックス両方等もカラーは透明になっています。
一時的に半透明にしてみてください。重なり具合を視認しやすいかと思います。

たとえば No48741 のコードでは、
 赤い背景の PictureBox
 青半透明の Label
を重ねています。両者のサイズが同一であるとすれば、正しく Controls.Add された場合、
コントロール全体は、両者の色が混ざって紫色に見えますし、座標がずれていれば
一部、赤い部分が表示されてしまうことになります。


> 親子関係を解除するとラベルの枠は見えるのですが・・・
ということは、座標指定が間違っているのでは無いでしょうか。

ラベルを廃止したようなので今更ですが、親子関係にした『後』で
それぞれの座標を確認されていますか?

恐らく今は、デザイン時において、
 ・PictureBox1 の Size と Label1 の Size は同一。
 ・PictureBox2 の Size と Label2 の Size は同一。
 ・PictureBox1 の Location と PictureBox2 の Location は異なる。
という状態になっているのでは無いでしょうか。

その場合、 No48732 のように Controls.Add しかされていないのであれば、
Label1 / Label2 の Location は、共に (0, 0) の座標に配置されている必要があるかと。
(デザイン時に異なる座標にあったのなら、Load イベント内で座標修正が必要です)


--------

たとえば、PictureBox1 も Label1 も Form 上にある状態から開始して、
それらの Size が (100, 100) だったとします。

ここで、それぞれの Location が共に (30, 30) だった場合、
デザイナ上は、ぴったり重なっているように見えます。

しかし Controls.Add で親子関係を変更すると、下記のようなズレが生じます。

┏━━┓ 太線部:親(PictureBox)
┃┌─┨┐細線部:子(Label)
┃│ ┃│
┗┷━┛│ (実際には、子の右下部は領域外なので見えない)
  └──┘


一方、デザイン時の Label1.Location が (0, 0) であれば、
親子関係を変更した直後、Label は「PictureBox の左上」に配置されるので、
ずれる事なくピッタリと被さる事になります。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -