Как осуществляется перетаскивание файлов? - PullRequest
5 голосов
/ 16 января 2009

как в winamp или vlc player, как сделать перетаскивание файла? Я имею в виду, я хочу знать, какая кодировка входит в приложение? я хочу знать для C ++

Ответы [ 6 ]

13 голосов
/ 16 января 2009

В чистом C / C ++ в Windows начните читать о функции DragAcceptFiles и сообщении WM_DROPFILES . Если вы используете более мощную библиотеку C ++ (Qt, Wx и т. Д.), Проверьте соответствующую документацию. Было бы полезно узнать, что вы используете, более конкретно.

Кроме того, эта дискуссия может ответить на ваш вопрос. Если это то, что вы имели в виду, пожалуйста, закройте этот вопрос.

1 голос
/ 12 декабря 2009

с ком:

Создать класс, который публично расширяет IDropTarget

Зарегистрируйте свой класс на предмет падений. Сделайте это в WM_CREATE

RegisterDragDrop(hwnd,static_cast<IDropTarget*>(pointer_to_your_class));

В вашем классе вам нужно переопределить пару функций, поскольку они чисто виртуальные:

virtual HRESULT STDMETHODCALLTYPE DragEnter( 
        /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj,
        /* [in] */ DWORD grfKeyState,
        /* [in] */ POINTL pt,
        /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;

virtual HRESULT STDMETHODCALLTYPE DragOver( 
    /* [in] */ DWORD grfKeyState,
    /* [in] */ POINTL pt,
    /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;

virtual HRESULT STDMETHODCALLTYPE DragLeave( void) = 0;

virtual HRESULT STDMETHODCALLTYPE Drop( 
    /* [unique][in] */ __RPC__in_opt IDataObject *pDataObj,
    /* [in] */ DWORD grfKeyState,
    /* [in] */ POINTL pt,
    /* [out][in] */ __RPC__inout DWORD *pdwEffect) = 0;

Каждая из этих функций будет вызываться при возникновении этих событий, то есть когда кто-то передает мышь в вашем окне с файлом DragEnter для вашего класса, будет вызван.

Вам также понадобится реализовать еще несколько функций, которые расширяет IDropTarget. Проверьте IUnknown в вашем MSDN.

Затем вам нужно запросить параметр IDataObject, чтобы получить данные:

FORMATETC fdrop = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

if (SUCCEEDED(pDataObj->QueryGetData(&fdrop)) ){
    STGMEDIUM stgMedium = {0};
    stgMedium.tymed = TYMED_HGLOBAL;
    HRESULT hr = pDataObj->GetData(&fdrop, &stgMedium);
    if (SUCCEEDED(hr))
    {
        HGLOBAL gmem = stgMedium.hGlobal;
        HDROP hdrop = (HDROP)GlobalLock(gmem);
        UINT numOfFiles =  DragQueryFile( (HDROP) hdrop,
                            0xFFFFFFFF,
                           NULL,
                            0
                        );

        TCHAR buffer[MAX_PATH];
        for( int i=0;i<numOfFiles;i++ ){
            UINT charsCopied = DragQueryFile( (HDROP) hdrop,
                            i,
                           buffer,
                            MAX_PATH
                        );
            MessageBox(NULL,buffer,_T("Archivos a copiar: "),MB_OK);


        }
        // use str
        GlobalUnlock(gmem);


        /*TCHAR* str = (TCHAR*)GlobalLock(gmem);
        // use str
        GlobalUnlock(gmem);*/
        ::ReleaseStgMedium(&stgMedium);
    }

}

Ура!

1 голос
/ 16 января 2009

edit после Я написал это, вопрос был отредактирован, чтобы квалифицироваться как C ++; Я собираюсь оставить этот ответ здесь только для справки.


«Какого рода кодирование входит в приложение»:

Это сильно зависит от платформы и языка. Например, вот примеры для Windows через C # / .NET или VB / .NET . Для C ++, Delphi и т. Д. Уловки будут другими.

0 голосов
/ 17 января 2009

Почти на любой вопрос типа «Как мне сделать этот интерфейс?»

Мой ответ всегда таков: «Используйте wxWidgets

Hugo

0 голосов
/ 17 января 2009

До появления OLE / COM / ActiveX мы делали что-то вроде следующего:

  • Если мы получили событие мыши, запомните положение курсора.
  • Если мы получили движение мыши и он сдвинулся на определенное расстояние от Исходная точка, то мы начинаем операция перетаскивания. Создайте курсор, который представляет объект, который вы перетаскиваете (определяется из исходного курсора положение).
  • Когда мы получили мышь вниз: если перетаскивание не началось, это щелчок, в противном случае используйте падение положение, чтобы определить, что делать с объект.

Примечание. Ничто из этого не позволит вам перетаскивать объекты между приложениями, просто внутри отдельных приложений.

0 голосов
/ 16 января 2009

Вы должны использовать интерфейсы Ole Drag и Drop COM.

...