投稿者 るきお(管理者)  (社会人) 投稿日時 2008/12/15 22:30:26
こんにちは。
おっしゃっているのはここのことですね?
http://homepage1.nifty.com/rucio/main/technique/tec16_DragDrop.htm


最後にダウンロードできる副笑いを試してみましたが確かに環境によっては大分ちらつくようですね。
私のローカル環境ではちらつかなかったと思いますが…。

コントロールをドラッグしている以上この問題の回避はできないのではないかと思います。
アプローチを代えてすべてのグラフィックを自前で処理すればなんとかなるはずです。
一例として簡単なものを作ってみましたが、このような方法ではいかがでしょうか?
(これですべてのちらつきが消えるというものでもありませんが)

フォームに大きめにPictureBoxを1つ配置して試してください。
細部は作りこんでいません。たとえば、ドラッグしたままでPictureBoxの外にマウスを動かすと少しおかしなことになります。


Option Explicit

Private IsDragging As Boolean   '現在ドラッグ中か 
Private curX As Integer         '現在の図形の左上のX座標 
Private curY As Integer         '現在の図形の左上のY座標 
Private diffX As Integer        'ドラッグ開始時点のcurXとマウスX座標の差 
Private diffY As Integer        'ドラッグ開始時点のcurYとマウスY座標の差 

Private Sub Form_Load()

    Picture1.BackColor = vbWhite
    Picture1.ScaleMode = vbPixels
    Picture1.AutoRedraw = True
    
    curX = 10
    curY = 10
    Call Draw(10, 10)

End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

    'ドラッグ開始時点の図形とマウス位置の差を保存 
    diffX = curX - CInt(X)
    diffY = curY - CInt(Y)

    '無条件でドラッグ開始としているが、 
    '本来は対象図形上にマウスがあればドラッグ開始といった条件が必要 
    IsDragging = True
    Me.Caption = "ドラッグ中 - " & Me.Caption

End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    If IsDragging Then
        Call Draw(CInt(X) + diffX, CInt(Y) + diffY)
    End If

End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

    IsDragging = False
    Me.Caption = Replace(Me.Caption, "ドラッグ中 - """)
    curX = CInt(X) + diffX
    curY = CInt(Y) + diffY

End Sub

Private Sub Draw(posX As Integer, posY As Integer)

    Picture1.Cls
    Picture1.Line (posX, posY)-(posX + 50, posY + 50), vbRed, BF

End Sub