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

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

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

Re[2]: ファイルのドラッグ&ドロップ時のマウスポインタの表示


(過去ログ 106 を表示中)

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

■63281 / inTopicNo.1)  ファイルのドラッグ&ドロップ時のマウスポインタの表示
  
□投稿者/ ブータン (1回)-(2012/08/10(Fri) 10:20:06)

分類:[VB.NET/VB2005 以降] 

開発環境:VB2008

フォームに画像ファイルをドラッグ&ドロップしてそれを読み込むようなことをやっており、
これ自体はうまく動作しているのですが、気になることがあります。
以下の例のように、フォームのDragDropイベントで、ドラッグしたファイルを読み込む際に、
ダイアログ表示等を行って処理をしているのですが、このダイアログが開いている間、
マウスポインタをドラッグしたファイルのある場所(例えばデスクトップ上やエクスプローラ上)に持っていくと、
マウスポインタの表示がドラッグ中のマーク(ドロップを許可する「+」マーク)になってしまいます。
(DragDropイベントプロシージャを抜ければ、この「+」マークはなくなります。)

このため、ドラッグしたデータの中身を受け取ったら、すぐさまドラッグ中の状態を解除して、マウスポインタの
ドラッグ中の表示を元に戻したいのですが、どのようにすればいいのでしょうか?
どこかでドラッグ終了の処理を入れる必要があるのでしょうか?
アドバイスの程、よろしくお願い申し上げます。

念のため、ソースを以下に記載します。

    Private Sub Form1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles Me.DragDrop
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            Dim astrFiles As String() = CType(ido.GetData(DataFormats.FileDrop), String())
            If astrFiles.Length > 0 Then
                Dim strFile As String = astrFiles(0)
                'ここにファイルの処理が入る(ダイアログ表示等)
                '以下略


            End If
        End If
    End Sub

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

引用返信 編集キー/
■63282 / inTopicNo.2)  Re[1]: ファイルのドラッグ&ドロップ時のマウスポインタの表示
□投稿者/ 魔界の仮面弁士 (20回)-(2012/08/10(Fri) 10:50:23)
No63281 (ブータン さん) に返信
> Dim astrFiles As String() = CType(ido.GetData(DataFormats.FileDrop), String())
この前に、「Dim ido As IDataObject = e.Data」が入るのでしょうか?

それと文中では省略されていますが、DragEnter/AllowDrop 等も指定済みということなのですよね?


> マウスポインタをドラッグしたファイルのある場所(例えばデスクトップ上やエクスプローラ上)に持っていくと、
> マウスポインタの表示がドラッグ中のマーク(ドロップを許可する「+」マーク)になってしまいます。
> (DragDropイベントプロシージャを抜ければ、この「+」マークはなくなります。)

抜ければ消えるのなら、DragDrop で複雑な処理をさせず、イベント自体を早期に Return で抜けてみては如何でしょう。

ドロップされたときに何かしらの判定処理(ダイアログによるユーザー応答)が必要ならば、
Timer の Tick イベントを用いて、DragDrop 終了後の 0.05秒後などに処理させてみるとか。
引用返信 編集キー/
■63283 / inTopicNo.3)  Re[2]: ファイルのドラッグ&ドロップ時のマウスポインタの表示
□投稿者/ ブータン (2回)-(2012/08/10(Fri) 12:05:50)
No63282 (魔界の仮面弁士 さん) に返信

早速のご回答、ありがとうございます。

>>Dim astrFiles As String() = CType(ido.GetData(DataFormats.FileDrop), String())
> この前に、「Dim ido As IDataObject = e.Data」が入るのでしょうか?
>
> それと文中では省略されていますが、DragEnter/AllowDrop 等も指定済みということなのですよね?

申し訳ございません。すべてご指摘の通りです。
また、「Dim astrFiles As String() = ...」以下のくだりは、e.Dataを引数とした別メソッドで行っておりますが、
例の提示時に転記を忘れました。

> 抜ければ消えるのなら、DragDrop で複雑な処理をさせず、イベント自体を早期に Return で抜けてみては如何でしょう。
>
> ドロップされたときに何かしらの判定処理(ダイアログによるユーザー応答)が必要ならば、
> Timer の Tick イベントを用いて、DragDrop 終了後の 0.05秒後などに処理させてみるとか。

なるほど。これは早速試してみたいと思います。
アドバイスありがとうございました。
取り急ぎ、お礼まで。
引用返信 編集キー/
■63285 / inTopicNo.4)  Re[1]: ファイルのドラッグ&ドロップ時のマウスポインタの表示
□投稿者/ shu (30回)-(2012/08/10(Fri) 12:09:24)
2012/08/10(Fri) 12:09:36 編集(投稿者)
No63281 (ブータン さん) に返信

ドロップ時に時間がかかるときBeginInvokeでDragDropをすぐ終了し
処理を遅延実行させる例

    Private m_dragTarget As String = Nothing
    Private SyncInvoke As IAsyncResult
    Private Sub Label1_DragDrop(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles Label1.DragDrop
        If Not e.Data.GetDataPresent("FileName") Then Exit Sub
        m_dragTarget = CType(e.Data.GetData("FileName"), String())(0)
        SyncInvoke = Label1.BeginInvoke(New Action(AddressOf DragDropMain))
    End Sub

    Private Sub DragDropMain()
        Dim dlgFile As New OpenFileDialog()

        If dlgFile.ShowDialog = Windows.Forms.DialogResult.OK Then
            Label1.Text = m_dragTarget
            Label2.Text = dlgFile.FileName
        End If
        m_dragTarget = Nothing
    End Sub

    Private Sub Label1_DragEnter(sender As Object, e As System.Windows.Forms.DragEventArgs) Handles Label1.DragEnter
        If e.Data.GetDataPresent("FileName") Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub

引用返信 編集キー/
■63287 / inTopicNo.5)  Re[2]: ファイルのドラッグ&ドロップ時のマウスポインタの表示
□投稿者/ ブータン (3回)-(2012/08/10(Fri) 12:18:30)
No63285 (shu さん) に返信

> ドロップ時に時間がかかるときBeginInvokeでDragDropをすぐ終了し
> 処理を遅延実行させる例

おお、ありがとうございます。
これも試してみます。
取り急ぎ、お礼まで。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -