Страница: 1 |
Страница: 1 |
Вопрос: Drag'n'Drop VB6
Добавлено: 21.01.07 18:02
Автор вопроса: Arseny | ICQ: 298826769
Надобно мне сделати глобальный Drag'n'Drop, т.е. чтобы перетаскивать можно было из любой другой проги все, что перетаскивается, в мою. Например файл из проводника или Total Commander'a(чтобы получить полное имя файла), кусок выделенного текста из IE или Ворда, картинку там какую-нибудь...
Я раньше с этим не работал вообще, а все примеры, которые нашел, показывают работу с Drag'n'Drop только внутри своего приложения.
Кто-нибудь может помочь примером или ссылкой?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 21.01.07 21:16
Для перетягивания файлов есть готовый...
модуль
Option Explicit
Public Declare Sub DragAcceptFiles Lib "shell32.dll" (ByVal hwnd As Long, ByVal fAccept As Long)
Public Declare Function DragQueryFile Lib "shell32.dll" Alias "ragQueryFileA" (ByVal HDROP As Long, ByVal UINT As Long, ByVal lpStr As String, ByVal ch As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Private Const WM_DROPFILES = &H233
Global p&
Public Function Handler&ByVal h&, ByVal m&, ByVal w&, ByVal l&
If m = WM_DROPFILES Then
Dim Str_Name As String * &HFF, Lng_File&
Lng_File = DragQueryFile(w, True, Str_Name, 0)
frmMain.lstFiles.Clear
'Form1.Print "Всего: " & Lng_File
For Lng_File = 0 To Lng_File - 1
 ragQueryFile ByVal w, Lng_File, Str_Name, Len(Str_Name)
frmMain.lstFiles.AddItem Replace$(Str_Name, vbNullChar, vbNullString)
Next
End If
Handler = CallWindowProc(p, h, m, w, l)
End Function
форма
p = SetWindowLong(lstFiles.hwnd, GWL_WNDPROC, AddressOf Handler)
Call DragAcceptFiles(lstFiles.hwnd, True)
End Sub
Для остального надо изучать АПИ функции Drag***... а их немало
Номер ответа: 2
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #2
Добавлено: 21.01.07 23:25
2HACKER: Благодарю, в общем-то пока хватит, буду пробовать.
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 22.01.07 10:33
Ну и че сложного? Ставишь OLEDropMode в Manual и обрабатываешь _OLEDragDrop.
Номер ответа: 4
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #4
Добавлено: 22.01.07 10:37
Пример для перетаскивания файлов из проводника (Total Commander и т.п.) в листбокс
Option Explicit
Private Sub Form_Load()
List1.OLEDropMode = 1
End Sub
Private Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Long
If Data.Files.Count < 1 Then
Else
For i = 1 To Data.Files.Count
List1.AddItem Data.Files(i)
Next i
End If
End Sub
Номер ответа: 5
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #5
Добавлено: 22.01.07 11:12
2LamerOnLine: Спасибо.
2HACKER: Издеваешься?
Номер ответа: 6
Автор ответа:
Djon
Вопросов: 61
Ответов: 471
Web-сайт:
Профиль | | #6
Добавлено: 23.01.07 08:48
А как сделать чтобы отслеживать какое расшерение у перетаскиваемых файлов?
Например перетаскивать только ехе?
Номер ответа: 7
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #7
Добавлено: 23.01.07 08:58
Главное - отследить полное имя файла. А дальше - фуфло вопрос. три символа с конца, все ясно!
Номер ответа: 8
Автор ответа:
Djon
Вопросов: 61
Ответов: 471
Web-сайт:
Профиль | | #8
Добавлено: 23.01.07 09:01
Private Sub Form_Load()
List1.OLEDropMode = 1
End Sub
Private Sub List1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim i As Long
If Data.Files.Count < 1 Then
Else
For i = 1 To Data.Files.Count
Text1 = Data.Files(i)
If Mid(Text1.Text, Len(Text1.Text) - 2, 3) = "exe" Then
List1.AddItem Data.Files(i)
End If
Print "Формат: " & Mid(Text1.Text, Len(Text1.Text) - 2, 3)
Next i
End If
End Sub
Толь вот если формал 2 символа или 1, что делать?
Номер ответа: 9
Автор ответа:
Djon
Вопросов: 61
Ответов: 471
Web-сайт:
Профиль | | #9
Добавлено: 23.01.07 09:02
поправка:
Номер ответа: 10
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #10
Добавлено: 23.01.07 11:01
Что значит формат? Если про расширение - то Split(FileName, ".". Последний элемент в массиве - расширение. Это средствами VB. Есть API и FSO, там для этого функции есть.
Номер ответа: 11
Автор ответа:
Djon
Вопросов: 61
Ответов: 471
Web-сайт:
Профиль | | #11
Добавлено: 23.01.07 11:21
Всё сообразил.
А про формат заговорился. -расширение-
ЗЫ интересно а какие Апи?
Номер ответа: 12
Автор ответа:
Bombardier
ICQ: 42305746
Вопросов: 2
Ответов: 67
Web-сайт:
Профиль | | #12
Добавлено: 23.01.07 17:59
в общем случае проверки вот так выглядят:
If Data.GetFormat(vbCFFiles) Then
 im tFileName as String
For Each tFileName In Data.Files
Next
ElseIf Data.GetFormat(vbCFBitmap) Then
ElseIf Data.GetFormat(vbCFRTF) Then
Else
End If