![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ну как мне сделать Drag&Drop на SpeedButton???!!! [D5, Win95/98]
ArtGamer © (2002-05-16 21:49:00)Уважаемые Мастера! Помогите мне разобраться с такой бедой. Мне нужно получить иконку ассоциированную с файлом, который пользователь кидает на SpeedButton(или на Bitmap или Panel - всё равно). Иконку я получать умею - ExtractAssociatedIcon, обрабатывать Drag&Drop тоже:
private
procedure WMDROPFILES(var Message: TWMDROPFILES); message WM_DROPFILES;
...
procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
var
Buffer : array[0..MAX_PATH] of Char; n:word;
begin
DragQueryFile(Message.Drop,0,@Buffer,SizeOf(Buffer));
Image1.Picture.Icon.Handle:=ExtractAssociatedIcon(hInstance,Buffer,n);
DragFinish (Message.Drop);
end;
Этот текст кода работает, когда DragAcceptFiles(Form1.Handle, TRUE);
но сообщение WM_DROPFILES просто не срабатывает, когда я пишу
DragAcceptFiles(Panel1.Handle, TRUE) или DragAcceptFiles(SpeedButton1.Glyph.Handle, TRUE);
Как мне сделать Drag&Drop на SpeedButton, или на Bitmap, или на Panel?
artgamer (2002-05-18 13:15:00) [1]Исходник находится в твоем вопросе
Тот исходник, который находится в моём вопросе, не фига не работает (во всяком случае, у меня), который в факе - тоже!
artgamer (2002-05-18 13:14:00) [2]Исходник находится в твоем вопросе
Тот исходник, который находится в моём вопросе, не фига не работает (во всяком случае, у меня), который в факе - тоже!
Anatoly Podgoretsky (2002-05-18 12:09:00) [3]Исходник находится в твоем вопросе, более полный есть в местном FAQ
artgamer (2002-05-18 11:43:00) [4]А нельзя-ли скинуть исходнячок? То, что надо переопределить оконную процедуру того контрола, который будет ловить WM_DROPFILES - это я понял. А вот как это сделать? В документации по WinAPI из SDK есть описание WM_DROPFILES, и там написано: hDrop = WM_DROPFILES (HANDLE) wParam, а что с этим делать - не пойму.
Anatoly Podgoretsky (2002-05-18 10:52:00) [5]artgamer © (17.05.02 21:54)
Только что проверил, сообщения принимаются в любом месте окна, включая не клиентскую область и над SpeedButton тоже
Suntechnic (2002-05-18 00:08:00) [6]Так ведь я же написал, что сообщение WM_DROPFILES вообще не вызывается!
И не будет вызываться! Ведь ты же отлавливаешь сообщение WM_DROPFILES над формой. Т.е., естественно, если мышь находится над другим контролом, то этот контрол сообщение и получает, а форма соответственно нет. Вариантов решения несколько. Во-первых можно написать наследника того контрола, что будет ловить WM_DROPFILES и определить у него подобное событие. Во-вторых можно переопределить оконную процедуру того контрола, который будет ловить WM_DROPFILES и уже оттуда информировать кого угодно о наступившем событии.
artgamer (2002-05-17 21:54:00) [7]Так ведь я же написал, что сообщение WM_DROPFILES вообще не вызывается! Как мне узнать, что пользователь сделал Drag&Drop без этого сообщения? А разрешить польвователю кидать на форму я не могу - на всю форму у меня TabControl растянут.
Anatoly Podgoretsky (2002-05-16 22:25:00) [8]Это надо делать на уровне формы, а если при этом нужно определять что курсор находится над определенным элементом то получить кординаты мышки