Помогите с Drag-and-Drop в Builder
От: Sein  
Дата: 21.04.04 14:08
Оценка:
Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.
Re: Помогите с Drag-and-Drop в Builder
От: Аноним  
Дата: 22.04.04 07:31
Оценка:
Здравствуйте, Sein, Вы писали:

S>Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.


Самый правильный подход зарегистрировать твою форму как окно принимающее операции DragandDrop
делает это Api функция RegisterDragDrop(HWND hwnd,IDropTarget * pDropTarget)

И ещё тебе придется создать класс реализующий интерфейс IDropTarget что то на подобии такого:

class DradAndDrop:public TInterfacedObject, IDropTarget{
...
};

За оттальными вопросами к MSDN
Re[2]: Помогите с Drag-and-Drop в Builder
От: Sein  
Дата: 22.04.04 09:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Sein, Вы писали:


S>>Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.


А>Самый правильный подход зарегистрировать твою форму как окно принимающее операции DragandDrop

А>делает это Api функция RegisterDragDrop(HWND hwnd,IDropTarget * pDropTarget)

А>И ещё тебе придется создать класс реализующий интерфейс IDropTarget что то на подобии такого:


А>class DradAndDrop:public TInterfacedObject, IDropTarget{

А>...
А>};

А>За оттальными вопросами к MSDN


Спасибо за совет!
Но есть ещё проблема при определении класса DradAndDrop компилятор ругается на определение функций которые я перекрываю в своём классе. А пишу я вот так:
class TMyDropTarget : public TInterfacedObject, IDropTarget
{
protected:
  virtual HRESULT DragEnter(IDataObject *pDataObject,DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  virtual HRESULT DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
  virtual HRESULT DragLeave(void);
  virtual HRESULT Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
};


Может я что-то не так делаю подскажите, я не очень то силён пока в С++.
Re[3]: Помогите с Drag-and-Drop в Builder
От: Аноним  
Дата: 22.04.04 16:36
Оценка:
Нельзя ли узнать что именно выдаёт компилятор!

Ну за неимением такового попробую предположить.

Да вроде отсутствует словечко одно в декларации __stdcall
А вообще лучше всего использовать специяльно предназначеный макрос STDMETHODIMP
Честно говоря сделано то всё вроде правильно!

Да к стати компилятор будет ещё ругаться на отсутствие методов IUnknown
Проблему я просто решил лишним вызовом:


virtual HRESULT __stdcall QueryInterface(const GUID& IID, void **Obj){
   return TInterfacedObject::QueryInterface(IID, (void *)Obj);
};


И на последок вот пример который перетаскивает имена файлов в editbox:

//---------------------------------------------------------------------------
HRESULT _stdcall TDropTarget::DragEnter(IDataObject * pDataObject,DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
  return S_OK;
};

HRESULT _stdcall TDropTarget::DragOver(DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
  return S_OK;
};

HRESULT _stdcall TDropTarget::DragLeave(void){
  return S_OK;
};

HRESULT _stdcall TDropTarget::Drop(IDataObject * pDataObject,DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
  STGMEDIUM Data;
  FORMATETC Format={CF_HDROP,NULL,DVASPECT_CONTENT,-1,1};
  HRESULT returnval=pDataObject->GetData(&Format,&Data);

  if((returnval==S_OK)&&(Data.tymed==TYMED_HGLOBAL)){
    UINT buffSize=DragQueryFile(Data.hGlobal,0,NULL,0);
    char* Buffer=new char[buffSize+1];
    DragQueryFile(Data.hGlobal,0,Buffer,buffSize+1);
    Form1->FileName->Text=Buffer;
    delete[] Buffer;
    GlobalFree(Data.hGlobal);
  };

  return returnval;
};
Re[4]: Помогите с Drag-and-Drop в Builder
От: Sein  
Дата: 23.04.04 09:00
Оценка:
Спасибо огромное! Просто супер!
В самом деле не хватало __stdcall. Всё работает просто класно.

Но вот ещё вопрос я бы очень хотел научиться разбирать IDataObject который передаётся при Drop. Я как бы хотел видеть не только файлы, но например письмо которое переташили из Outlook. Где об этом можно прочитать или что нибудь вы скажете дельное?
Заранее спасибо!
Re[5]: Помогите с Drag-and-Drop в Builder
От: Аноним  
Дата: 23.04.04 09:26
Оценка:
Чатай MSDN:

если нет локальной версии то ту на форуме есть ссылка на него
Re[6]: Помогите с Drag-and-Drop в Builder
От: Sein  
Дата: 23.04.04 11:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Чатай MSDN:


А>если нет локальной версии то ту на форуме есть ссылка на него


ОК!
Спасибо, попробую разобраться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.